当前位置: 首页 > 知识库问答 >
问题:

Go中的零检测

凌伟泽
2023-03-14

我在Go中看到很多代码来检测nil,如下所示:

if err != nil { 
    // handle the error    
}

但是,我有一个这样的结构:

type Config struct {
    host string  
    port float64
}

和配置是配置的一个实例,当我这样做时:

if config == nil {
}

存在编译错误,表示:无法将nil转换为Config类型

共有3个答案

衡子琪
2023-03-14

我创建了一些示例代码,它使用我能想到的各种方式创建新变量。看起来前 3 种方式创建值,后两种方式创建引用。

package main

import "fmt"

type Config struct {
    host string
    port float64
}

func main() {
    //value
    var c1 Config
    c2 := Config{}
    c3 := *new(Config)

    //reference
    c4 := &Config{}
    c5 := new(Config)

    fmt.Println(&c1 == nil)
    fmt.Println(&c2 == nil)
    fmt.Println(&c3 == nil)
    fmt.Println(c4 == nil)
    fmt.Println(c5 == nil)

    fmt.Println(c1, c2, c3, c4, c5)
}

哪些输出:

false
false
false
false
false
{ 0} { 0} { 0} &{ 0} &{ 0}
汪正雅
2023-03-14

除了 Oleiade 之外,请参阅零值规范:

当通过声明或make或new调用分配内存来存储值时,如果未提供显式初始化,则将为内存提供默认初始化。此类值的每个元素都被设置为其类型的零值:布尔值为false,整数为0,浮点值为0.0,字符串为“”,指针、函数、接口、切片、通道和映射为nil。此初始化是递归完成的,因此,例如,如果未指定值,结构数组的每个元素都将其字段置零。

如您所见,nil 不是每种类型的零值,而只是指针、函数、接口、切片、通道和映射的零值。这就是为什么配置 == nil 是一个错误并且

要检查结构是否未初始化,您必须检查每个成员各自的零值(例如host==“”port==0等),或者有一个由内部初始化方法设置的私有字段。例子:

type Config struct {
    Host string  
    Port float64
    setup bool
}

func NewConfig(host string, port float64) *Config {
    return &Config{host, port, true}
}

func (c *Config) Initialized() bool { return c != nil && c.setup }

廖诚
2023-03-14

编译器将错误指向您,您正在比较结构实例和nil。它们不是同一类型,因此它认为这是无效的比较并对您大喊大叫。

这里要做的是将指向配置实例的指针与nil进行比较,这是一个有效的比较。为此,您可以使用Go语言new内置,也可以初始化指向它的指针:

config := new(Config) // not nil

或者

config := &Config{
                  host: "myhost.com", 
                  port: 22,
                 } // not nil

或者

var config *Config // nil

然后你就可以检查

if config == nil {
    // then
}
 类似资料:
  • 问题内容: 我有一些代码已从Java移植到C ++ 但是在C ++ 中,可以是或,当等于时它将失败检查。 我试图在下面的代码中将负零值进行调整,但它从未命中DEBUG(“ Negative zero”)行。但是打印等于。 有什么建议吗? 测试代码: 测试结果: GCC: 旗帜: 回答: 我已经使用@amit的答案来进行以下操作。 这似乎可行。 问题答案: 好吧,使用s 时的一般建议是记住它们是不精

  • 问题内容: The Go Playground上可用的程序读取 并产生一个错误 我了解是字符串的“零值”。我不明白为什么我不能分配给我的。 问题答案: 简单的答案是, 在语言规范中未将其定义为类型的有效值。 …但是也许您想要更长的答案? 是指针,接口,通道,切片,映射和函数类型的零值,它表示 未初始化的 状态。 考虑以下变量声明: 所有这些变量都有一个代表未初始化状态的值,这很自然。已被声明为指针

  • 主要内容:nil 标识符是不能比较的,nil 不是关键字或保留字,nil 没有默认类型,不同类型 nil 的指针是一样的,不同类型的 nil 是不能比较的,两个相同类型的 nil 值也可能无法比较,nil 是 map、slice、pointer、channel、func、interface 的零值,不同类型的 nil 值占用的内存大小可能是不一样的在Go语言中,布尔类型的零值(初始值)为 false,数值类型的零值为 0,字符串类型的零值为空字符串 ,而指针、切片、映射、通道、函数和接口的零值则

  • 目前我正在使用这个帮助函数来检查nil和nil接口 因为<代码>反映。(a)的值。如果值的种类不是< code>Chan、< code>Func、< code>Map、< code>Ptr、< code>Interface或< code>Slice,IsNil()会出现混乱,我在deferred 中抛出了这些内容。 有没有更好的方法来实现这种检查?它认为应该有一个更直接的方法来做到这一点。

  • 问题内容: 在Go语言中,您可以通过添加ZONEINFO环境变量来指定要使用的特定zoneinfo.zip文件,该变量指向要用于时区信息的特定文件。这很棒,因为它使我可以确保前端和后端使用的IANA时区数据库的版本相同。 但是,似乎没有任何方法可以检测对指定区域信息文件的使用是否失败。查看源代码(https://golang.org/src/time/zoneinfo.go),看来使用指定文件的任

  • 问题内容: 我有以下几点: 如果@VariableEqualToZero为null,它将替换为1。如果@VariableEqualToZero = 0,也需要它替换为1。我该怎么做呢? 问题答案: