【Golang】Go语言中make和new函数的区别及引用拷贝和值拷贝
make()和new()函数的区别
make和new函数都是go语言的内建函数来分配内存空间的。但是还是有区别的。
1.make是用来分配引用类型的内存,比如slice,map以及channel(管道)。new是用来分配除了引用类型之外的所有其他类型,比如int,数组,struct等等。
func main() { var intPointer *int = new(int) //初始化一个指针 *intPointer = 10 //为指针所指向的地址赋值10 fmt.Printf("*intPointer = %d\n", *intPointer) // 结果 : *intPointer = 10 }
2.new可以分配任何类型的内存,但是切片只能用make初始化。看下面例子
func main() { var slicePointer *[]int = new([]int) //初始化一个切片指针 fmt.Printf("*slicePointer = %v\n", *slicePointer) (*slicePointer)[0] = 1 // 这里会报错( cannot use 1 (type int) as type []int in assignment),因为是空切片 //切片先要初始化才能用 (*slicePointer) = make([]int, 5, 100) //分配长度=5 容量 =100 (*slicePointer)[0] = 1 //第一个元素赋值1 fmt.Printf("*slicePointer = %d\n", *slicePointer) // 结果 : *slicePointer = [1 0 0 0 0] }
根据上面例子可以看出make函数原型 比 new 多了一个(长度)参数。这里只能用make。
值拷贝和引用拷贝
值拷贝是先申明一个变量如下图a=100,再将a赋值给b,a的值和b的值相等,并且a和b是内存空间相互独立的,修改a和b任何一个值都不会互相影响,这个就是值拷贝。
看下面例子
func modify(a int) { a = 20 } func main() { var b int = 10 modify(b) fmt.Printf("b = %d\n", b) // 结果 :b = 10 }
引用拷贝是将变量的地址传递过去,如下图示例
将变量a的地址赋值给变量b,也就是b和a指向的都是同一块内存区域,a和b任何一个值的修改都会改变这块地址的值。同时变量c存放的也是b的指向的地址,c的
修改也会改变a的值。
func main() { var a int = 100 var b *int = &a var c *int = b *c = 200 fmt.Printf("a = %d b = %d c = %d\n", a, *b, *c) // 结果 :a = 200 b = 200 c = 200 }