是否需要在Golang中为变量赋值?

时间:2015-07-23 08:21:30

标签: go default default-value

在Golang中声明变量时,它会按照规范中的描述初始化为零值。

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。

3 个答案:

答案 0 :(得分:6)

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

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

否则,明确初始化它们只是噪音。 您可能会认为未初始化的变量存在问题......而且您是对的。幸运的是,没有这样的事情。零值是 规范的一部分,他们不会突然改变。

答案 1 :(得分:5)

正如大家所说,规范在这里很明确:所有内存都被初始化(归零)。 应该像标准软件包那样利用它。特别是,它允许您依赖"默认构造函数"对于您自己的类型,通常会跳过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 :(得分:3)

当声明变量时,它会自动包含其类型的默认zeronull值:0 int0.0 float } {},false boolstring空字符串,指针{0}},零结构等等。

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

例如:内存中的nil可以显示为:

var arr [5]int

声明一个数组时,其中的每个项目都会自动使用该类型的默认零值进行初始化,此处所有项目默认为0.

因此,最好在没有默认值的情况下初始化,在其他情况下,比明确要声明具有默认值的变量的情况更好。