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