为了账号安全,请及时绑定邮箱和手机立即绑定

是否需要为变量分配默认值?

是否需要为变量分配默认值?

Go
Smart猫小萌 2021-10-25 16:24:02
在 Go 中,当一个变量被声明时,它被初始化为零值,如规范中所述。http://golang.org/ref/spec#The_zero_value但是,如果需要使用默认值进行初始化,则使用此属性并且不显式初始化您的变量是否是一种良好的编码习惯。例如在下面的例子中http://play.golang.org/p/Mvh_zwFkOupackage mainimport "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 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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


//less verbose than ''var count int''

count := 0

empty := ""

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


查看完整回答
反对 回复 2021-10-25
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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

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

客户端

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

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

http.服务器

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

字节.缓冲区

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

这很棒,因为您可以var buf bytes.Buffer开始使用它。因此,您还会经常看到以“否定”形式使用的布尔成员变量——例如InsecureSkipVerifyin tls.Configis not called Verify,因为默认行为不会验证证书(认为我想要false– 或零 – 值用于理想的默认值)。

最后回答你的问题:

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

是的。


查看完整回答
反对 回复 2021-10-25
?
烙印99

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。


所以最好在没有默认值的情况下进行初始化,在其他情况下,而不是您明确想要声明具有默认值的变量的情况。


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信