Golang变量初始化

var

var 变量名字 类型 = 表达式

如果初始化表达式被省略,那么将用零值初始化该变量。

  • 数值类型变量对应的零值是 0
  • 布尔类型变量对应的零值是 false
  • 字符串类型对应的零值是 空字符串
  • 接口或引用类型(包括slice、指针、map、chan和函数)变量对应的零值是 nil
  • 数组或结构体等聚合类型对应的零值是 每个元素或字段都是对应该类型的零值

var t []stringt := []string{} 更好

初始化类型,而且对于引用类型的变量,我们不光要声明它,还要为它分配内存空间.new和make都可以用来分配空间,

make([]T, length, capacity)

make 主要用来初始化内置数据结构.包括 slice, mapchannel,返回该类型已初始化(非零值)的值.

需要注意的是这三种类型本身就是引用类型.

  1. slice 是一个包含 data (指向数组的指针)、 caplen 的结构体;
  2. map 是一个指向 hmap 结构体的指针;
  3. channel 是一个指向 hchan 结构体的指针;

使用 make 的好处是可以指定 lencapmake(type,len,cap),合适的 lencap 可以提升性能。

slice := make([]int, 100)
hash := make(map[sting]string, 100)
channel := make(chan int, 100)

注意:

var s1 []int
s2 := make([]int, 3)
var m1 map[string]string
m2 := make(map[string]string, 3)
var c1 chan int
c2 := make(chan int, 3)

slice s1 的零值是 []int(nil) 等于 nil, 而通过make初始化之后的s2是 []int{0, 0, 0},不要把内部=int=型的零值当成了slice的零值.

同样的map的零值是 map[string]string(nil) 等于 nil, 通过make初始化之后是 map[string]string{}

chain的零值是 (chain int)(nil) 等于 nil, 通过make初始化之后是 (chan int)(0xc0000a0080)

new(T)

使用new来获取指向某个类型的指针,指针指向新分配的,该类型的零值.

w := new(sync.WaitGroup)
w := &sync.WaitGroup{}

这两者等价.

参考链接

https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/

Django日志关联Jeager信息

K8S外部流量引入集群的几种方式总结