在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。
答案 0 :(得分:6)
仅当您要使用短声明语法时才将变量初始化为零值。
//less verbose than ''var count int''
count := 0
empty := ""
否则,明确初始化它们只是噪音。 您可能会认为未初始化的变量存在问题......而且您是对的。幸运的是,没有这样的事情。零值是 规范的一部分,他们不会突然改变。
答案 1 :(得分:5)
正如大家所说,规范在这里很明确:所有内存都被初始化(归零)。 应该像标准软件包那样利用它。特别是,它允许您依赖"默认构造函数"对于您自己的类型,通常会跳过New() *T
类型的函数,而不是&T{}
。
标准软件包中的许多类型都利用了这一点,例如:
客户端是HTTP客户端。 其零值(DefaultClient)是一个使用DefaultTransport的可用客户端。
然后你会在包中找到var DefaultClient = &Client{}
。
服务器定义用于运行HTTP服务器的参数。 服务器的零值是有效配置。
缓冲区是一个可变大小的字节缓冲区,具有读写方法。 Buffer的零值是一个可以使用的空缓冲区。
这很棒,因为你可以var buf bytes.Buffer
开始使用它。因此,您还经常会看到布尔成员变量用于"否定"表单 - 例如tls.Config
中的InsecureSkipVerify
未被称为Verify
,因为默认行为不会验证证书(我认为我想要false
- 或者为零 - 用于理想默认值的值。)
最后,回答你的问题:
但是,如果需要使用默认值初始化变量,那么使用此属性并且不显式初始化变量是否是良好的编码实践?
是的,是的。
答案 2 :(得分:3)
当声明变量时,它会自动包含其类型的默认zero
或null
值:0
int
,0.0
float
} {},false
bool
,string
空字符串,指针{0}},零结构等等。
Go中的所有内存都已初始化!。
例如:内存中的nil
可以显示为:
var arr [5]int
声明一个数组时,其中的每个项目都会自动使用该类型的默认零值进行初始化,此处所有项目默认为0.
因此,最好在没有默认值的情况下初始化,在其他情况下,比明确要声明具有默认值的变量的情况更好。