我是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 的一部分,而不是其他内容(还有什么?)。
感谢。
答案 0 :(得分:4)
这不是多余的。您可以从现有类型中创建类型:
type MyType int
type MyType string
或接口:
type Stringer interface {
String() string
}
答案 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
循环的不同形式。