zoukankan      html  css  js  c++  java
  • 【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
    }

     

  • 相关阅读:
    使用Java ImageIO类进行批量图片格式转换(转载)
    ORA00980 同义词转换不再有效(ORA00980: synonym translation is no longer valid) (转)
    如何截取字符串
    不能执行已释放 script 的代码(个人碰到的问题)
    查询某个用户下的表
    js验证密码强度
    查看表空间的sql语句
    JavaScript变量提升、作用域
    PL/SQL developer 显示所有数据
    js只能输入数字,小数点(整理)
  • 原文地址:https://www.cnblogs.com/songgj/p/11073751.html
Copyright © 2011-2022 走看看