【问题标题】:How to check empty struct which only contains one boolean field如何检查仅包含一个布尔字段的空结构
【发布时间】:2019-03-16 14:20:02
【问题描述】:
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 处于开发阶段,以后可能会有更多字段。

【问题讨论】:

  • empty 包含一个字段,您只是没有明确将其设置为任何内容。
  • “基本上,== 认为包含false 字段的结构与空结构相同。” 这是因为在 Go 中它们是相同的。如果您需要区分 零值“未初始化”值,则必须通过向值/字段添加更多信息来解决此语言功能.例如。通过将其设为指针或使用 struct 类型,如在 database/sql 中找到的 sql.NullXxx 类型。

标签: go


【解决方案1】:

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}

【讨论】:

  • 空不空。它是零值。非常感谢:)
【解决方案2】:

结构Test 始终包含布尔字段Foo。如果你不指定它的值,它只是初始化为false

【讨论】:

  • 明白了,但是在这种情况下如何检查空结构?
  • 没有空结构。 Test 被定义为有一个 Foo 字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2014-07-24
  • 2019-06-20
  • 1970-01-01
相关资源
最近更新 更多