if语句中的struct初始化

Oli*_*ver 9 struct if-statement go

我想检查结构是否为空,即它的所有字段是否都设置为默认值.以下按预期工作:

package main

import "fmt"

type MyStruct struct {
    field1 string
    field2 int
}

func main() {
    var mine MyStruct
    empty := MyStruct{}

    // Check if mine is empty.
    if mine == empty {
        fmt.Print("mine is empty")
    }
}
Run Code Online (Sandbox Code Playgroud)

我想缩短这一点,所以我将空结构初始化移动到if语句中:

func main() {
    var mine MyStruct

    // Check if mine is empty.
    if mine == MyStruct{} {
        fmt.Print("mine is empty")
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用:syntax error: unexpected }, expecting := or = or comma.即使以下情况也不起作用,尽管它看起来与第一个示例几乎相同:

func main() {
    var mine MyStruct

    // Check if mine is empty.
    if empty := MyStruct{}; mine == empty {
        fmt.Print("mine is empty")
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器说:syntax error: need trailing comma before newline in composite literal.我找到了以下代码,但是:

func main() {
    var mine MyStruct

    // Check if mine is empty.
    if mine == *new(MyStruct) {
        fmt.Print("mine is empty")
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么编译器不接受上面两个例子吗?虽然我们正在研究:检查"空"结构的惯用方法是什么?最后一个例子有效,但对我来说看起来有点奇怪.

pet*_*rSO 13

{}用括号解决歧义.例如,

package main

import "fmt"

type MyStruct struct {
    field1 string
    field2 int
}

func main() {
    var mine MyStruct

    // Check if mine is empty.
    if mine == (MyStruct{}) {
        fmt.Print("mine is empty")
    }
}
Run Code Online (Sandbox Code Playgroud)

Go编程语言规范

复合文字

当使用LiteralType的TypeName形式的复合文字作为关键字与"if","for"或"switch"语句块的左括号之间的操作数出现时,会出现解析歧义,并且复合文字是未括在括号,方括号或花括号中.在这种罕见的情况下,文字的左括号被错误地解析为引入语句块的那个.要解决歧义,复合文字必须出现在括号内.