Go 为什么要使用“;“多余的”;关键词";结构";围棋中的类型?

Go 为什么要使用“;“多余的”;关键词";结构";围棋中的类型?,go,struct,syntax,Go,Struct,Syntax,我是Golang的忠实粉丝,非常高兴看到Go的语法是如何设计的。作为语法哲学的一部分,我们有如下规则:如果事实上不需要,则省略这些东西(关键字、字符等) 因此,不要写多余的冒号: for ; sum < 1000; { sum += sum } 为什么我们需要在这里放置struct关键字? 关键字用于确定意图,明确可用选项的确切选择,以便编译器知道如何正确地完成其工作 如果我们简单地说: for sum < 1000 { sum += sum } type Per

我是Golang的忠实粉丝,非常高兴看到Go的语法是如何设计的。作为语法哲学的一部分,我们有如下规则:如果事实上不需要,则省略这些东西(关键字、字符等)

因此,不要写多余的冒号:

for ; sum < 1000; {
    sum += sum
}
为什么我们需要在这里放置
struct
关键字? 关键字用于确定意图,明确可用选项的确切选择,以便编译器知道如何正确地完成其工作

如果我们简单地说:

for sum < 1000 {
    sum += sum
}
type Person {
    name string
}
?

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

请向我解释(并提供链接)当我们定义某种类型时,我们还可以使用什么来代替
struct

请列出可用选项,我们希望从中向编译器澄清,类型名称后的方括号中的内容正是结构的一部分,而不是其他内容(其他内容?)


谢谢。

这不是多余的。可以从现有类型生成类型:

type MyType int
type MyType string
或接口:

type Stringer interface {
    String() string
}

这是包含的。

它不是多余的。可以从现有类型生成类型:

type MyType int
type MyType string
或接口:

type Stringer interface {
    String() string
}
这一点已被涵盖,而且。

(可能)不仅出现在中,而且还出现在无数其他地方,例如中

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

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
语句的函数?return语句将是另一种歧义,因为它可能不返回后跟2个空块的任何内容,或者它可能返回后跟一个空块的空struct值

现在为了避免解析歧义,在其他地方(类型声明之外)指定结构类型时,我们必须使用
struct
关键字,那么为什么在类型声明中将其设置为可选或不允许呢?
我认为一致的语法比抓住一切机会将语言(语法)减少到最低限度更重要。这大大损害了可读性。您提到的
for
循环示例并不是真正的简化,而是不同形式的
for
循环的使用

(may)不仅出现在,而且出现在无数其他地方,例如

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

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
语句的函数?return语句将是另一种歧义,因为它可能不返回后跟2个空块的任何内容,或者它可能返回后跟一个空块的空struct值

现在为了避免解析歧义,在其他地方(类型声明之外)指定结构类型时,我们必须使用
struct
关键字,那么为什么在类型声明中将其设置为可选或不允许呢?

我认为一致的语法比抓住一切机会将语言(语法)减少到最低限度更重要。这大大损害了可读性。您提到的
for
循环示例并不是真正的简化,而是不同形式的
for
循环的使用

语法规则就是语法规则。虽然如果没有提供,它可以隐式地假定
struct
,但Go语言/语法不允许这样做。因此这是不允许的。(围棋语法是专门设计来避免太多语法复杂性的。)为什么人们反对这个问题?这是个好问题。@ThunderCat您希望初学者阅读语言规范吗?告诉我语法规则就是语法规则。虽然如果没有提供,它可以隐式地假定
struct
,但Go语言/语法不允许这样做。因此这是不允许的。(围棋语法是专门设计来避免太多语法复杂性的。)为什么人们反对这个问题?这是个好问题。@ThunderCat您希望初学者阅读语言规范吗?请给出OP所问问题的一个重要部分,为什么
typet{..}
不能被隐式地视为
typet struct{..}
(这部分是OT)。OP明确地问:“请解释一下(并提供链接)当我们定义某个类型时,我们还可以使用什么来代替struct。”事实发生后编辑到您评论中的部分。我回答了似乎是问题的根源。我明白了,谢谢你提供选择。但是,是的,我的意图是理解为什么我们不能将
类型t{..}
结构一起作为默认行为使用。这是Go维护人员的问题,而不是StackOverflow的问题。如果我不得不冒险猜测,我会说他们没有选择
struct
作为默认值,因为