go语言--new与make的区别

new与make的区别:
new用来分配内存,不初始化内存,只会将内存置0【返回一个指针,该指针指向新分配的,类型为T的零值】
make:只用于slice,map,channel的创建,并返回类型为T(非指针)的已初始化(非0值)的值【这三种类型本质上为引用类型,使用前必须初始化】
共同点:
都在堆上分配内存,但是行为不同,适用于不同的类型
new分配内存
make初始化
new([]int):返回*[]int
make([]int,0):返回[]int

var p *[]int = new([]int)       // allocates slice structure; *p == nil; rarely useful
var v  []int = make([]int, 100) // the slice v now refers to a new array of 100 ints

// Unnecessarily complex:
var p *[]int = new([]int)
*p = make([]int, 100, 100)

// Idiomatic:
v := make([]int, 100)

array
关于数组在Go和C语言中的主要不同:

  1. 数组是值。 将一个数组分配给另一个数组将复制所有元素。
  2. 特别是,如果将数组传递给函数,它将接收该数组的副本,而不是指向该数组的指针。
  3. 数组的大小是其类型的一部分。 类型[10] int和[20] int是不同的。
func changeArray(arr [3]int){
	arr[0] = 3
}

func main() {
	var array = [3]int{0, 1, 2}
	changeArray(array)
	b:=array
	array[0] = 3
	fmt.Println(array)
	fmt.Println(b)
}

输出

[3 1 2]
[0 1 2]

PS:由此证明完全值拷贝,传入函数也一致,若是函数[3]int换掉则不能将array传入
PPS:若要真实改变可以传递地址

func changeArray(arr *[3]int){
	arr[0] = 3
}

文档地址:
https://golang.org/doc/effective_go.html#introduction

发布了212 篇原创文章 · 获赞 33 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/hello_bravo_/article/details/104446826