【问题标题】:Struct in for loop initializerfor循环初始化器中的结构
【发布时间】:2016-01-31 23:16:07
【问题描述】:

知道为什么 for 循环初始化程序中的这个结构表达式会在编译时产生语法错误吗?在这种情况下,指向结构的指针可以正常工作,但我需要像下面这样的局部变量。感谢您的建议!

type Request struct {
    id   int
    line []byte
    err  error
}

go func() {
    for r := Request{}; r.err == nil; r.id++ {
        r.line, r.err = input.ReadSlice(0x0a)
        channel <- r
    }
}()

【问题讨论】:

  • 今天这给了我一个重要的“wtf”时刻。多年来我第一次看到这个错误。

标签: go struct composite-literals


【解决方案1】:

简化你的代码:

for r := Request{}; r.err == nil; r.id++ {
    r.line, r.err = input.ReadSlice(0x0a)
    channel <- r
}

给出编译时错误:

预期的布尔或范围表达式,发现简单语句(复合文字周围缺少括号?)(还有 1 个错误)

这个结构难以解析。左大括号 '{'composite literal 的一部分还是 for 语句本身的左大括号(for block)并不明显。

您可以通过在复合文字周围使用括号来使其显而易见(如错误所示):

for r := (Request{}); r.err == nil; r.id++ {
    r.line, r.err = input.ReadSlice(0x0a)
    channel <- r
}

【讨论】:

  • 非常感谢!似乎 Gosublime 有不同的错误输出..没有这些建议..
  • @bigless,(很抱歉挖掘了一个旧线程,但是)编译器的输出可能取决于它的版本:Go (v1) compatibility guarantees 未涵盖工具链产生的错误消息的确切措辞,因此很可能 icza 只是安装了与您不同的 Go 版本。
  • go build 确实不会产生那种输出,但 go vet 会。与go1.17.5 核对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多