文章

默认值

零值的定义取决于字段的类型

  • 对于 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
}

© 2024- lfj