我想检查结构是否为空,即是否所有字段都设置为默认值。以下按预期工作:
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")
}
}
有人可以解释为什么编译器不接受上面两个例子吗?虽然我们正在研究它:用什么方法来检查一个"空的"结构?最后一个例子有效,但对我来说有点奇怪。
答案 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
使用TypeName的复合文字时会出现解析歧义 LiteralType的形式显示为关键字和之间的操作数 “if”,“for”或“switch”块的开口支撑 语句,复合文字没有括在括号中, 方括号或花括号。在这种罕见的情况下,开口支撑 将文字错误地解析为引入块的文字 的陈述。要解决歧义,复合文字必须 出现在括号内。