3 回答
TA贡献1843条经验 获得超7个赞
仅当您想使用短声明语法时才将变量初始化为零值。
//less verbose than ''var count int''
count := 0
empty := ""
否则,显式初始化它们只是噪音。您可能认为未初始化的变量有问题……您是对的。幸运的是,没有这样的事情发生。零值是规范的一部分,它们不会突然改变。
TA贡献1824条经验 获得超5个赞
正如大家所说,这里的规范很明确:所有内存都被初始化(归零)。您应该像标准包一样利用这一点。特别是,它允许您为自己的类型依赖“默认构造函数”,并且经常跳过New() *T
某种函数以支持&T{}
.
标准包中的许多类型都利用了这一点,一些示例:
客户端是一个 HTTP 客户端。它的零值(DefaultClient) 是一个使用 DefaultTransport 的可用客户端。
然后你会发现var DefaultClient = &Client{}
在包中声明。
服务器定义运行 HTTP 服务器的参数。服务器的零值是有效配置。
缓冲区是具有读取和写入方法的可变大小的字节缓冲区。Buffer的零值是准备使用的空缓冲区。
这很棒,因为您可以var buf bytes.Buffer
开始使用它。因此,您还会经常看到以“否定”形式使用的布尔成员变量——例如InsecureSkipVerify
in tls.Config
is not called Verify
,因为默认行为不会验证证书(认为我想要false
– 或零 – 值用于理想的默认值)。
最后回答你的问题:
但是,如果需要使用默认值初始化变量,使用此属性并且不显式初始化变量是否是一种良好的编码习惯?
是的。
TA贡献1829条经验 获得超13个赞
当一个变量被声明时,它自动包含其类型的默认值zero或null值:0for int、0.0for float、falsefor bool、空字符串 for string、nil指针、零结构等。
Go 中的所有内存都已初始化!.
例如:var arr [5]int在内存中可以可视化为:
+---+---+---+---+
| | | | |
+---+---+---+---+
0 1 2 3
声明数组时,其中的每一项都会自动使用类型的默认零值进行初始化,这里所有项都默认为 0。
所以最好在没有默认值的情况下进行初始化,在其他情况下,而不是您明确想要声明具有默认值的变量的情况。
- 3 回答
- 0 关注
- 165 浏览
添加回答
举报