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语言中的主要不同:
- 数组是值。 将一个数组分配给另一个数组将复制所有元素。
- 特别是,如果将数组传递给函数,它将接收该数组的副本,而不是指向该数组的指针。
- 数组的大小是其类型的一部分。 类型[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