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

May*_*tel 11 default default-value go

在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)
}
Run Code Online (Sandbox Code Playgroud)

程序依赖于boolean的默认值为false.

Sta*_*ven 7

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

//less verbose than ''var count int''
count := 0
empty := ""
Run Code Online (Sandbox Code Playgroud)

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


End*_*imo 6

声明变量时,它会自动包含其类型的默认值zero或值: for 、for 、for 、空字符串 for 、for 指针、零结构体等。null0int0.0floatfalseboolstringnil

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

例如:var arr [5]int在内存中可以可视化为:

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

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

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


tom*_*asz 5

正如大家所说,规范在这里很清楚:所有内存都被初始化(归零).您应该像标准软件包那样利用这一点.特别是,它允许您依赖于您自己类型的"默认构造函数",并且经常跳过New() *T有利于的函数&T{}.

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

http.Client

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

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

http.Server

服务器定义用于运行HTTP服务器的参数.Server 的零值是有效配置.

bytes.Buffer

Buffer是一个可变大小的字节缓冲区,具有Read和Write方法.Buffer 的零值是一个可以使用的空缓冲区.

这很棒,因为你可以这样做var buf bytes.Buffer并开始使用它.因此,您还经常会看到布尔成员变量以"否定"形式使用 - 例如,InsecureSkipVerifytls.Config未调用时Verify,因为默认行为不会验证证书(我认为我想要false- 或零值)用于理想的默认值).

最后,回答你的问题:

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

是的.