来吧认真抄一下effective go
new
使用new会给变量分配一个地址空间,但是并不会去初始化,而是全部定位零(zeros it)同时new返回了一个指向地址空间的指针。
composit literal(创建的语法?中文翻译成谜)
1 | func NewFile(fd int, name string) *File { |
当然就可以简化为 return &File{fd, name, nil, 0}
,而且初始化的时候可以无视顺序:
1 | return &File{fd: fd, name: name} |
没填的两个参数会默认置空/零。
这样的语法可以用在很多地方,比如创建数组或者slice的时候
1 | a := [...]string {Enone: "no error", Eio: "Eio", Einval: "invalid argument"} |
make
哇我感觉我活的像一个汉化组。。。
- 首先,像前面说的,make只负责创建新的slice,map和channel
- make返回的是一个引用,所以它需要被初始化
1 | // Unnecessarily complex: |
虽然上面那段代码被effective go认为是没必要这么复杂,但是还挺有意思的,充分地展示了new 返回指针make返回引用的特质,p就是一个初始化长度是100,容量也是100的切片。
当然常用写法还是下面这个:
1 | v := make([]int, 100) |