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


在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。


12311
2017-07-23 08:21


起源

此外,如果您运行golint,它将建议您删除额外的分配,因为它是默认值。这是开始使用Go风格的好工具。 - LanceH


答案:


正如大家所说,规范在这里很清楚:所有内存都被初始化(归零)。您 应该 利用这个作为标准包。特别是,它允许您依赖于您自己类型的“默认构造函数”并经常跳过 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  - 或零值 - 用于理想的默认值)。

最后,回答你的问题:

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

是的。


5
2017-07-23 13:19





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

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

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


6
2017-07-23 09:29





声明变量时,它自动包含默认值 zero 要么 null 其类型的价值: 0 对于 int0.0 对于 floatfalse 对于 bool,空字符串 stringnil 用于指针,零编辑结构等

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

例如: var arr [5]int 在内存中可以看作如下:

+---+---+---+---+ | | | | | +---+---+---+---+ 0 1 2 3

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

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


2
2017-07-23 11:36



不是吗 0 浮动也? tour.golang.org/basics/12 - Elwyn