type Test struct { }
我知道这可能是(Test{}) == test
检查空结构的方法。但是,对于仅包含一个布尔字段的结构似乎不起作用。考虑以下示例:
package main
import "fmt"
type Test struct {
Foo bool
}
func main() {
empty := Test{}
test1 := Test{Foo: true}
test2 := Test{Foo: false}
fmt.Println(Test{} == test1) //False yay
fmt.Println(Test{} == test2) //True oh no ...
fmt.Println(Test{} == empty) //True yay
}
基本上,==认为包含false
字段的结构与空结构相同。
是否有更好的方法来检查空结构,或者我在这里缺少什么?
此外,您可能想知道为什么struct中只有一个字段,因为struct处于开发阶段,以后可能会有更多字段。
答案 0 :(得分:3)
The Go Programming Language Specification
结构是一系列命名元素,称为字段,每个字段 有一个名字和一个类型。字段名称可以明确指定
// An empty struct. struct {}
复合文字为结构,数组,切片和结构构造值 每次对其进行映射并创建新值。他们组成 字面量类型,后跟大括号绑定的元素列表。 每个元素都可以选择前面带有相应的键。
文字可以省略元素列表;这样的字面值等于 类型为零。
当通过声明为变量分配存储空间时 或调用new或创建新值时(通过 复合文字或make的调用,并且没有显式初始化 如果提供,则变量或值被赋予默认值。每个元素 这样的变量或值的类型为其类型设置为零值: 对于布尔值,为false;对于数字类型,为0;对于字符串,为“”;对于布尔值,为nil 指针,函数,接口,切片,通道和映射。这个 初始化是递归完成的,因此例如 如果未指定值,则结构数组的字段将为零。
type Test struct {
Foo bool
}
empty := Test{}
empty
不为空。它是零值。
zeroValue := Test{}
,或者明确地,
zeroValue := Test{Foo: false}
答案 1 :(得分:0)
结构Test
始终包含布尔字段Foo
。如果您未指定其值,则将其初始化为false
。