Golang 中make与new 区别

栏目: Go · 发布时间: 7年前

内容简介:转载:在 golang 有兩個保留字new 可以用來初始化泛型,

Golang 中make与new 区别

转载: https://medium.com/d-d-mag/golang-%E7%AD%86%E8%A8%98-make-%E8%88%87-new-%E7%9A%84%E5%B7%AE%E5%88%A5-68b05c7ce016

在 golang 有兩個保留字 makenew ,也是剛開始學習 golang 的時候容易搞混的地方,這邊做個簡單的筆記。

new

new 可以用來初始化泛型, 並且返回儲存位址 。所以通常我們會用指標變數來接 new 過後的型別。特別要注意的是,new 會自動用 zeroed value 來初始化型別,也就是字串會是 "" ,number 會是 0 ,channel, func, map, slice 等等則會是 nil

因為這個特性,如果我們對 map 做以下的操作的話,會出現 panic: assignment to entry in nil map

func main() {
    people := new(map[string]string)
    p := *people
    p["name"] = "Kalan" // panic: assignment to entry in nil map
}

因為初始化的 map 會是 nil map,不像其他的 primitive type 一樣有預設值。

如果用 struct 做初始化,也可以直接用 & 代表指向的位址,下面兩個寫法效果是一樣的:

type Person struct {
  Name string
  Age  int
}

func main() {
    p := &Person{}
    p := new(Person)
}

好處是上面的 Person 也可以根據自己想要傳入的值額外再做設定,但 new 則是全部的 field 都會直接塞 zeroed value。

make

makenew 不同,是用來初始化一些特別的型別,像是 channel, map, slice 等等。另外特別要注意的是 make 並不會回傳指標 ,如果要拿到指標,就要考慮用像是 new 的方式來初始化型別。

func main() {
    receiver := make(chan string) // 初始化 channel,但不回傳指標
    person := make(map[string]string)
    people := make([]string, 100) // 初始化長度為 100 的字串陣列
}

還是要再度強調一次, make 不會回傳指標! 下面這段程式碼會噴錯:

func main() {
    person := make(map[string]string)
    fmt.Println(*person) // invalid indirect of person
}

結論

makenew 在剛開始學習 golang 時容易搞混,有時參數要傳入指標時也會一不小心就用 make 來傳,這時候知道這兩者的區別就相當重要。

更多閱讀


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript修炼之道

JavaScript修炼之道

波顿纽威 / 巩朋、张铁 / 人民邮电 / 2011-11 / 29.00元

《JavaScript修炼之道》是JavaScript的实战秘籍。作者将自己多年的编程经验融入其中,不仅可以作为学习之用,更是日常JavaScript开发中不可多得的参考手册,使读者少走很多弯路。《JavaScript修炼之道》的内容涵盖了当今流行的JavaScript库的运行机制,也提供了许多应用案例。《JavaScript修炼之道》针对各任务采取对页式编排,在对各任务的讲解中,左页解释了任务的......一起来看看 《JavaScript修炼之道》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具