【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
", *intPointer)  // 结果 : *intPointer = 10
}

        2.new可以分配任何类型的内存,但是切片只能用make初始化。看下面例子

func main()  {
    var slicePointer *[]int = new([]int) //初始化一个切片指针
    fmt.Printf("*slicePointer = %v
", *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
", *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
", 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
", a, *b, *c)  // 结果 :a = 200  b = 200  c = 200
}

 

原文地址:https://www.cnblogs.com/songgj/p/11073751.html