写点什么

new() 和 make 的区别

用户头像
陈思敏捷
关注
发布于: 2020 年 05 月 23 日
new() 和 make的区别

本文基于Go 1.14.2

builtin/builtin.go
// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type



// The make built-in function allocates and initializes an object of type
// slice, map, or chan (only). Like new, the first argument is a type, not a
// value. Unlike new, make's return type is the same as the type of its
// argument, not a pointer to it. The specification of the result depends on
// the type:
// Slice: The size specifies the length. The capacity of the slice is
// equal to its length. A second integer argument may be provided to
// specify a different capacity; it must be no smaller than the
// length. For example, make([]int, 0, 10) allocates an underlying array
// of size 10 and returns a slice of length 0 and capacity 10 that is
// backed by this underlying array.
// Map: An empty map is allocated with enough space to hold the
// specified number of elements. The size may be omitted, in which case
// a small starting size is allocated.
// Channel: The channel's buffer is initialized with the specified
// buffer capacity. If zero, or the size is omitted, the channel is
// unbuffered.
func make(t Type, size ...IntegerType) Type

从源码描述可以得出



  • new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于 &T{}

  • make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel



参考the way to go 7.2.4章节的图解

在图 7.3 的第一幅图中:

var p *[]int = new([]int) // *p == nil; with len and cap 0
p := new([]int)

在第二幅图中, p := make([]int, 0) ,切片 已经被初始化,但是指向一个空的数组(p!=nil)。



我们再通过测试代码验证上述结论

package main
import "log"
func main() {
p := new([]int)
log.Println(*p)//断点1
b := make([]int, 0)
log.Println(b)//断点2
}



使用dlv 跟踪断点





博客地址 :https://www.chenjie.info/2375



本文首发于我的公众号:





发布于: 2020 年 05 月 23 日阅读数: 65
用户头像

陈思敏捷

关注

多动脑不痴呆 2017.12.21 加入

gopher

评论

发布
暂无评论
new() 和 make的区别