if语句中的struct初始化

时间:2014-08-09 19:46:04

标签: if-statement struct 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")
    }
}

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

func main() {
    var mine MyStruct

    // Check if mine is empty.
    if mine == MyStruct{} {
        fmt.Print("mine is empty")
    }
}

但这不起作用: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")
    }
}

编译器说: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")
    }
}

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

1 个答案:

答案 0 :(得分:12)

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

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")
    }
}
  

The Go Programming Language Specification

     

Composite literals

     

使用TypeName的复合文字时会出现解析歧义   LiteralType的形式显示为关键字和之间的操作数   “if”,“for”或“switch”块的开口支撑   语句,复合文字没有括在括号中,   方括号或花括号。在这种罕见的情况下,开口支撑   将文字错误地解析为引入块的文字   的陈述。要解决歧义,复合文字必须   出现在括号内。