Go语言 为什么make函数不返回指针?[副本]

nhaq1z21  于 2023-05-04  发布在  Go
关注(0)|答案(1)|浏览(116)

此问题已在此处有答案

Why would I make() or new()?(10个答案)
5天前关闭。
我是Go的新手,但我的理解是,任务会创建副本。“new”函数返回一个指针,这是有意义的,因为当你把返回值赋给一个变量时,它只会复制指针。但是,由于“make”不返回指针,那么在将新分配的对象赋值给变量时,是否会导致新分配的对象不被复制,从而导致对副本进行第二次分配?

variable := make([]int, 4, 7)
odopli94

odopli941#

[]int是一个切片,不是一个数组;切片基本上是指向底层数组的指针视图:
切片是 * 底层数组 * 的连续段的描述符,并提供对该数组中元素的编号序列的访问。
你的make行(a)示例化了一个你从未见过的[7]int,然后(B)返回一个切片,本质上只是一个指向数组前4个元素的指针。由于该切片只是一个指针和一个长度,因此按值传递成本很低。我不确定Go是否真的在make内部创建了切片,然后将其返回给variable,或者它是否直接内联;但无论哪种方式的影响都是可以忽略的。
从文档:
即执行

make([]T, length, capacity)

生成的切片与分配数组并对其进行切片相同,因此这两个表达式是等效的:

make([]int, 50, 100)
new([100]int)[0:50]

相关问题