为什么这个Golang结构创建中有逗号?

时间:2017-04-07 09:43:51

标签: go struct

我有一个结构:

type nameSorter struct {
    names []Name
    by    func(s1, s2 *Name) bool

在此方法中使用。这个逗号发生了什么事?如果我将其删除则会出现语法错误。

func (by By) Sort(names []Name) {
        sorter := &nameSorter{
            names: names,
            by:    by, //why does there have to be a comma here?
        }
        sort.Sort(sorter)

此外,下面的代码完美无缺,似乎更清晰。

func (by By) Sort(names []Name) {
    sorter := &nameSorter{names, by}
    sort.Sort(sorter)

对于更多上下文,此代码是一系列声明的一部分,用于对自定义类型进行排序,如下所示:

By(lastNameSort).Sort(Names)

2 个答案:

答案 0 :(得分:10)

这是行之有效的方法,对commaparentheses等内容严格要求。

关于这个概念的好处是,当添加或删除一行时,它不会影响其他行。假设可以省略最后一个逗号,如果要在其后面添加一个字段,则必须添加逗号。

请参阅此帖:https://dave.cheney.net/2014/10/04/that-trailing-comma

答案 1 :(得分:0)

来自https://golang.org/doc/effective_go.html#semicolons

词法分析器使用一条简单的规则在扫描时自动插入分号,因此输入文本中几乎没有分号

换句话说,程序员无需使用分号,但Go仍在编译前在幕后使用了分号。

将分号插入:

换行符之前的最后一个标记是标识符(包括int和float64之类的单词),基本文字(例如数字或字符串常量)或标记break continue fallthrough return ++ -- ) }

之一

因此,如果没有逗号,则词法分析器将插入分号并导致语法错误:

   &nameSorter{
       names: names,
       by:    by; // semicolon inserted after identifier, syntax error due to unclosed braces
   }