如何检查仅包含一个布尔字段的空结构

时间:2019-03-16 05:45:20

标签: go

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处于开发阶段,以后可能会有更多字段。

2 个答案:

答案 0 :(得分:3)

  

The Go Programming Language Specification

     

Struct types

     

结构是一系列命名元素,称为字段,每个字段   有一个名字和一个类型。字段名称可以明确指定

// An empty struct.
struct {}
     

Composite literals

     

复合文字为结构,数组,切片和结构构造值   每次对其进行映射并创建新值。他们组成   字面量类型,后跟大括号绑定的元素列表。   每个元素都可以选择前面带有相应的键。

     

文字可以省略元素列表;这样的字面值等于   类型为零。

     

The zero value

     

当通过声明为变量分配存储空间时   或调用new或创建新值时(通过   复合文字或make的调用,并且没有显式初始化   如果提供,则变量或值被赋予默认值。每个元素   这样的变量或值的类型为其类型设置为零值:   对于布尔值,为false;对于数字类型,为0;对于字符串,为“”;对于布尔值,为nil   指针,函数,接口,切片,通道和映射。这个   初始化是递归完成的,因此例如   如果未指定值,则结构数组的字段将为零。


type Test struct {
  Foo bool
}

empty := Test{}

empty不为空。它是零值。

zeroValue := Test{}

,或者明确地,

zeroValue := Test{Foo: false}

答案 1 :(得分:0)

结构Test始终包含布尔字段Foo。如果您未指定其值,则将其初始化为false