猿问

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

在 Go 中,当一个变量被声明时,它被初始化为零值,如规范中所述。


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。


Smart猫小萌
浏览 166回答 3
3回答

蓝山帝景

仅当您想使用短声明语法时才将变量初始化为零值。//less verbose than ''var count int''count := 0empty := ""否则,显式初始化它们只是噪音。您可能认为未初始化的变量有问题……您是对的。幸运的是,没有这样的事情发生。零值是规范的一部分,它们不会突然改变。

沧海一幻觉

正如大家所说,这里的规范很明确:所有内存都被初始化(归零)。您应该像标准包一样利用这一点。特别是,它允许您为自己的类型依赖“默认构造函数”,并且经常跳过New() *T某种函数以支持&T{}.标准包中的许多类型都利用了这一点,一些示例:客户端客户端是一个 HTTP 客户端。它的零值(DefaultClient) 是一个使用 DefaultTransport 的可用客户端。然后你会发现var DefaultClient = &Client{}在包中声明。http.服务器服务器定义运行 HTTP 服务器的参数。服务器的零值是有效配置。字节.缓冲区缓冲区是具有读取和写入方法的可变大小的字节缓冲区。Buffer的零值是准备使用的空缓冲区。这很棒,因为您可以var buf bytes.Buffer开始使用它。因此,您还会经常看到以“否定”形式使用的布尔成员变量——例如InsecureSkipVerifyin tls.Configis not called Verify,因为默认行为不会验证证书(认为我想要false– 或零 – 值用于理想的默认值)。最后回答你的问题:但是,如果需要使用默认值初始化变量,使用此属性并且不显式初始化变量是否是一种良好的编码习惯?是的。

烙印99

当一个变量被声明时,它自动包含其类型的默认值zero或null值:0for int、0.0for float、falsefor bool、空字符串 for string、nil指针、零结构等。Go 中的所有内存都已初始化!.例如:var arr [5]int在内存中可以可视化为:+---+---+---+---+ |   |   |   |   | +---+---+---+---+   0   1   2   3声明数组时,其中的每一项都会自动使用类型的默认零值进行初始化,这里所有项都默认为 0。所以最好在没有默认值的情况下进行初始化,在其他情况下,而不是您明确想要声明具有默认值的变量的情况。
随时随地看视频慕课网APP

相关分类

Go
我要回答