Golang 学习笔记
[]string{} 和 var []string 的区别
a := []string{}
b := []string{} // 初始化过
reflect.DeepEqual(a, b) // true
var c []string // 没有初始化
reflect.DeepEqual(a, c) // false
// 原因:
a.IsNil() // false
c.IsNil() // true
结构体中 类型为 *string *int 的作用
我们经常能看到这种 struct 定义:
type Person struct {
name *string
age *int
}
为什么 name 和 age 类型没有直接使用 string 和 int,而使用 *string 和 *int?它们区别在哪里?
我理解下来,使用 *string 和 *int 可以判断是否赋值过,而 string 和 int 因为未赋值时零值为 "" 和 0,所以无法准确判断是否赋值过,比如 name string 主动赋值了 "" 和未赋值,是一样的。
而 name *string 未赋值时默认值为 nil,所以可以区分出未赋值状态和赋值状态。
优雅的向上传递和处理 error
简述:
- 使用 ErrResponseFailed = errors.New("the response failed") 定义 error
- 使用 errors.Wrap(ErrResponseFailed, response.Message) 向上传递 error
- 使用 errors.Is(err, infraform.ErrResponseFailed) 处理 error
make(chan struct{}) vs make(chan bool)
有的我们创建 channel 只是为了通信,而不在乎消息本身,这个时候要求消息载体越小越好。
而struct{}是Go中可用的最小数据类型,它实际上不包含任何内容,所以不需要分配内存,这就是为什么在此类场景中通常使用struct{}。
代码中校验结构体(struct)是否实现了某接口(Interface)
方法是:
var _ DiscoverySummarizer = &discoverySummarizerServer{}
以 kubernetes 的一段代码为例:
下述 41L 的代码可以校验结构体 discoverySummarizerServer 是否实现了接口 DiscoverySummarizer,如果没有实现,那么该赋值语句在编译时会报错;