Golang 学习笔记
🎑

Golang 学习笔记

Tags
Golang
Published
Jan 16, 2022

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

notion image
简述:
  • 使用 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,如果没有实现,那么该赋值语句在编译时会报错;
notion image