为什么要使用"冗余"关键字" struct" Go中的类型?

时间:2018-01-08 21:43:12

标签: go struct syntax

我是Golang的忠实粉丝,对Go的语法设计非常满意。作为语法哲学的一部分,我们有如下规则:如果实际上不需要它们,则省略事物(关键字,字符等)。

出于这个原因而不是写冗余冒号:

for ; sum < 1000; {
    sum += sum
}

你可以简单地说:

for sum < 1000 {
    sum += sum
}

注意我们如何省略冗余分号

还有很多其他案例,其中语法被简化。

但是当我们定义类型时,struct怎么办?

type Person struct {
    name string
}

为什么我们需要在此处添加struct个关键字? 关键词是确定意图,澄清可用选项的确切选择,以便编译器知道如何正确地完成其工作。

如果我们简单地说:

,是否会变得模糊不清?
type Person {
    name string
}

...

  

我相信上面的例子中struct有意义   因为在没有struct关键字定义的类型时编译器失败。

请在我们定义某种类型时解释我(并提供链接)我们可以使用的其他而不是struct

请列出可用的选项,我们希望向编译器说明类型名称后的大括号中的内容正好是 struct 的一部分,而不是其他内容(还有什么?)。

感谢。

2 个答案:

答案 0 :(得分:4)

这不是多余的。您可以从现有类型中创建类型:

type MyType int
type MyType string

或接口:

type Stringer interface {
    String() string
}

这包括in the Go tourin the spec

答案 1 :(得分:2)

Types(可能)不仅出现在type declarations中,还出现在无数其他地方,例如function declarations

可以匿名“使用”结构,而不为它们创建命名类型。例如,以下声明有效:

func GetPoint() struct{ x, y int } {
    return struct{ x, y int }{1, 2}
}

无需使用struct关键字,在多次使用中会出现解析歧义。假设我们要创建一个返回空结构的函数:

func GetEmpty() struct{} {
    return struct{}{}
}

如果没有struct关键字,这会是什么样子?

func GetEmpty2() {} {
    return {}{}
}

现在,如果你是编译器,会做什么?这是一个与GetEmpty()具有相同签名的函数吗?或者这是一个没有返回值的函数和一个空体(func GetEmpty2() {})后跟一个包含return语句的block? return语句将是另一个歧义,因为它可能返回任何后面跟着2个空块的内容,或者它可能返回一个空的struct值,后跟一个空块......

现在为了避免解析歧义,我们必须在指定struct types 其他(在类型声明之外)时使用struct关键字,然后为什么在类型声明中将其设为可选或禁止它?
我认为一致的语法比抓住所有机会将语言(语法)降低到最低限度更重要。这会伤害可读性很大的时间。您提到的for循环示例实际上并不是简化,而是使用for循环的不同形式。