golang学习笔记六:new 和 make

来吧认真抄一下effective go

new

使用new会给变量分配一个地址空间,但是并不会去初始化,而是全部定位零(zeros it)同时new返回了一个指向地址空间的指针。

composit literal(创建的语法?中文翻译成谜)

1
2
3
4
5
6
7
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
}
f := File{fd, name, nil, 0}
return &f
}

当然就可以简化为 return &File{fd, name, nil, 0},而且初始化的时候可以无视顺序:

1
return &File{fd: fd, name: name}

没填的两个参数会默认置空/零。

这样的语法可以用在很多地方,比如创建数组或者slice的时候

1
2
3
a := [...]string   {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
s := []string {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
m := map[int]string{Enone: "no error", Eio: "Eio", Einval: "invalid argument"}

make

哇我感觉我活的像一个汉化组。。。

  • 首先,像前面说的,make只负责创建新的slice,map和channel
  • make返回的是一个引用,所以它需要被初始化
1
2
3
// Unnecessarily complex:
var p *[]int = new([]int)
*p = make([]int, 100, 100)

虽然上面那段代码被effective go认为是没必要这么复杂,但是还挺有意思的,充分地展示了new 返回指针make返回引用的特质,p就是一个初始化长度是100,容量也是100的切片。

当然常用写法还是下面这个:

1
v := make([]int, 100)