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.
仅当您要使用短声明语法时,才将变量初始化为零值.
//less verbose than ''var count int''
count := 0
empty := ""
Run Code Online (Sandbox Code Playgroud)
否则,明确初始化它们只是噪音.你可能会认为未初始化的变量有问题......你是对的.幸运的是,没有这样的事情.零值是规范的一部分,它们不会突然改变.
声明变量时,它会自动包含其类型的默认值zero
或值: for 、for 、for 、空字符串 for 、for 指针、零结构体等。null
0
int
0.0
float
false
bool
string
nil
Go中的所有内存都被初始化了!。
例如:var arr [5]int
在内存中可以可视化为:
+---+---+---+---+
| | | | |
+---+---+---+---+
0 1 2 3
声明数组时,其中的每个项目都会自动使用该类型的默认零值进行初始化,这里所有项目都默认为 0。
因此,在其他情况下,最好在没有默认值的情况下进行初始化,而不是在您明确想要声明具有默认值的变量的情况下。
正如大家所说,规范在这里很清楚:所有内存都被初始化(归零).您应该像标准软件包那样利用这一点.特别是,它允许您依赖于您自己类型的"默认构造函数",并且经常跳过New() *T
有利于的函数&T{}
.
标准包中的许多类型都利用了这一点,例如:
客户端是HTTP客户端.它的零值(DefaultClient)是一个使用DefaultTransport的可用客户端.
然后你会发现var DefaultClient = &Client{}
在包中声明.
服务器定义用于运行HTTP服务器的参数.Server 的零值是有效配置.
Buffer是一个可变大小的字节缓冲区,具有Read和Write方法.Buffer 的零值是一个可以使用的空缓冲区.
这很棒,因为你可以这样做var buf bytes.Buffer
并开始使用它.因此,您还经常会看到布尔成员变量以"否定"形式使用 - 例如,InsecureSkipVerify
在tls.Config
未调用时Verify
,因为默认行为不会验证证书(我认为我想要false
- 或零值)用于理想的默认值).
最后,回答你的问题:
但是,如果需要使用默认值初始化变量,那么使用此属性并且不显式初始化变量是否是良好的编码实践?
是的.
归档时间: |
|
查看次数: |
15907 次 |
最近记录: |