【问题标题】:Is it required to assign default value to variable?是否需要为变量分配默认值?
【发布时间】:2015-10-13 10:25:30
【问题描述】:

在 Go 中,当一个变量被声明时,它会按照规范中的描述用零值初始化。

http://golang.org/ref/spec#The_zero_value

但是,如果需要使用默认值初始化变量,则使用此属性并且不显式初始化变量是否是一种良好的编码习惯。

例如在下面的例子中

http://play.golang.org/p/Mvh_zwFkOu

package main

import "fmt"

type B struct {
    isInit bool
    Greeting string
}

func (b *B) Init() {
    b.isInit = true
    b.Greeting = "Thak you for your time"
}

func (b *B) IsInitialized() bool {
    return b.isInit
}

func main() {
    var b B
    if !b.IsInitialized(){
        b.Init()
    }
    fmt.Println(b.Greeting)
}

程序依赖 boolean 的默认值为 false。

【问题讨论】:

  • 另外,如果你运行 golint,它会建议你放弃额外的分配,因为它是默认值。这是开始使用 Go 风格的好工具。

标签: go default default-value


【解决方案1】:

正如大家所说,这里的规范很明确:所有内存都被初始化(归零)。您应该像标准软件包一样利用这一点。特别是,它允许您为自己的类型依赖“默认构造函数”,并且经常跳过 New() *T 类型的函数,转而使用 &T{}

标准包中的许多类型都利用了这一点,一些示例:

http.Client

客户端是 HTTP 客户端。 其零值 (DefaultClient) 是一个使用 DefaultTransport 的可用客户端。

然后你会发现包中声明了var DefaultClient = &Client{}

http.Server

服务器定义了运行 HTTP 服务器的参数。 服务器的零值是有效配置。

bytes.Buffer

缓冲区是具有读取和写入方法的可变大小的字节缓冲区。 Buffer 的零值是可以使用的空缓冲区。

这很棒,因为您只需执行var buf bytes.Buffer 并开始使用它。因此,您还会经常看到布尔成员变量以“否定”形式使用——例如,tls.Config 中的InsecureSkipVerify 不称为Verify,因为默认行为不会验证证书(我想我希望将 false(或零)值用于理想的默认值)。

最后,回答你的问题:

但是,如果需要使用默认值初始化变量,那么使用此属性并且不显式初始化变量是一种好的编码习惯吗?

是的。

【讨论】:

    【解决方案2】:

    声明变量时,它会自动包含其类型的默认 zeronull 值:0 代表 int0.0 代表 floatfalse 代表 bool,空string 的字符串,nil 的指针,零结构等。

    Go 中的所有内存都已初始化!.

    例如:内存中的var arr [5]int可以可视化为:

    +---+---+---+---+ | | | | | +---+---+---+---+ 0 1 2 3

    在声明一个数组时,其中的每一项都会自动初始化为该类型的默认零值,这里所有的项都默认为0。

    因此,最好在没有默认值的情况下进行初始化,在其他情况下,除了您明确想要声明具有默认值的变量的情况。

    【讨论】:

      【解决方案3】:

      仅当您想使用短声明语法时才将变量初始化为零值。

      //less verbose than ''var count int''
      count := 0
      empty := ""
      

      否则,显式初始化它们只是噪音。 你可能会认为未初始化的变量有问题……你是对的。幸运的是,没有这样的事情。零值是 规范的一部分,它们不会突然改变。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-13
        • 2011-04-15
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        相关资源
        最近更新 更多