【问题标题】:Golang commas with methods/functions [closed]带有方法/功能的Golang逗号[关闭]
【发布时间】:2015-03-30 18:22:59
【问题描述】:

为什么我们允许在方法声明、参数列表或返回列表中的接收者末尾放置逗号。像这样:

func (ds *dasa,) yoooooolo (dsa dasa,) (dsaa dasa,) 

为什么允许这样做?结尾都是逗号?

【问题讨论】:

  • 总是运行gofmt,不是吗?那么这不是问题,因为多余的逗号被删除了。您是否查看过spec 以了解他们在哪里允许这样做?
  • golang.org/ref/spec#Signature 正在阅读规范,我偶然发现了它。我的问题是为什么...?为什么我们可以这样做,它的目的是什么。
  • IMO,如果您在提问之前已经进行了适当的研究,那么我认为您应该在问题本身中包含相关链接,以 (a) 明确并 (b) 给感兴趣的各方或那些试图回答一个开始的地方。
  • 尾随逗号使重新排序更容易,允许将括号移动到下一行,更容易在最后一个参数添加注释而不破坏代码块括号,对版本控制系统更友好,更容易编写代码生成器。显然,单行函数声明没有意义。
  • Golang 有你必须遵守的风格规则(这就是 gofmt 存在的原因),所以我不确定为什么这主要是基于意见而关闭的。

标签: methods go comma


【解决方案1】:

Golang 允许在许多声明后使用逗号。

这可能是语言设计者明确的设计选择,更允许不相关的语法错误;但是,只有他们才能解释他们的动机。

func (f *Foo,) Bar(x, y int,) (int, error,) { //...
f.Bar(1, 2, 3,)
xs := []int{1, 2, 3,}

事实上,在一些多行文字声明中,它需要尾随逗号(大概是为了简化元素的重新排序):

ys := []int{
  1,
  2, // <-- required comma.
}
m := map[string]int{
  "foo": 1,
  "bar": 2, // <-- required comma.
}

请注意,go fmt 命令会自动删除无关的、可选的尾随逗号。您应该始终在构建代码之前运行该工具。

【讨论】:

  • 多行文字需要逗号来自分号插入规则:如果行不以逗号结尾,则词法分析器 (?) 将插入分号。
  • 多行文字规则记录在哪里?
【解决方案2】:

当你有一个有很多参数的函数时,你有时希望像这样将函数头分布在多行中:

func foo(
    int arg1,
    string arg2,
    []byte arg3,
    error arg4,
 ) {
    /* implementation goes here */
 }

尾随逗号允许以更正交的方式写下此参数列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2013-07-27
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多