默认值
零值的定义取决于字段的类型
- 对于 string 类型,零值是空字符串 ““。
- 对于 int 类型,零值是 0。
- 对于指针类型,零值是 nil。
- 对于切片和映射,零值是 nil 或者长度为 0 的切片/映射。
- 对于数组,零值是 []
不同初始化对应的默认值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 方式1: 声明但不初始化
var slice []string // 默认值: nil
// 方式2: 使用make初始化
slice := make([]string, 0) // 默认值: 空切片 (长度0,容量0)
// 方式3: 带容量的make初始化
slice := make([]string, 0, 10) // 默认值: 空切片 (长度0,容量10)
// 方式4: 字面量初始化
slice := []string{} // 默认值: 空切片
// 方式5: 带初始值的字面量
slice := []string{"a", "b", "c"} // 默认值: 包含3个元素的切片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 方式1: 声明但不初始化
var dict map[string]string // 默认值: nil
// 方式2: 使用make初始化
dict := make(map[string]string) // 默认值: 空map (不是nil)
// 方式3: 字面量初始化
dict := map[string]string{} // 默认值: 空map
// 方式4: 带初始值的字面量
dict := map[string]string{
"key1": "value1",
"key2": "value2",
} // 默认值: 包含两个键值对的map
1
2
3
var gid string // 显式声明,隐式初始化
// 等价于 var gid string = ""
// 默认值: ""
1
2
var supplierClient *supplier.Client //得到的是 nil 指针, 其余都是零值结构体
supplierClient = &supplier.Client{} //得到的是 零值结构体
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type Goods struct {
// 基础字段
ShopID string `json:"shop_id"` // 零值: ""
OuterID int `json:"outer_id"` // 零值: 0
Flag int `json:"flag"` // 零值: 0 (不是 false!)
UpdateTime time.Time `json:"update_time"` // 零值: 0001-01-01 00:00:00 +0000 UTC
// 切片
DescPics []string `json:"desc_pics"` // 零值: nil
AllProps []Prop `json:"all_props"` // 零值: nil
// 指针
CreateTime *time.Time `json:"create_time"` // 零值: nil
GoodsHot *int `json:"goods_hot"` // 零值: nil
PropsPtr *[]Prop `json:"props_ptr"` // 零值: nil
// 嵌套切片
Props []Prop `json:"props"` // 零值: nil
}
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
func (c *Collection) Upsert(selector interface{}, update interface{}) (info *ChangeInfo, err error) {
if selector == nil {
selector = bson.D{}
}
op := updateOp{
Collection: c.FullName,
Selector: selector,
Update: update,
Flags: 1,
Upsert: true,
}
var lerr *LastError
for i := 0; i < maxUpsertRetries; i++ {
lerr, err = c.writeOp(&op, true)
if !IsDup(err) {
break
}
}
// 只有在没有错误且有 lastError 时才创建 info
if err == nil && lerr != nil {
info = &ChangeInfo{}
/**
. 默认值初始化
修改后无论是否出错,都会初始化 info = &ChangeInfo{}
ChangeInfo{} 的字段默认值为:Matched=0, Updated=0, Removed=0, UpsertedId=nil
**/
if lerr.UpdatedExisting {
info.Matched = lerr.N
info.Updated = lerr.modified
} else {
info.UpsertedId = lerr.UpsertedId
}
}
return info, err // 如果有错误,info 为 nil
}