zoukankan      html  css  js  c++  java
  • go new和make

    Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives)。简单来说,new只分配内存,make用于slice,map,和channel的初始化。
    内置函数new按指定类型长度分配零值内存,返回指针,并不关心类型内部构造和初始化方式。
    内置函数make对引用类型进行创建,编译器会将make转换为目标类型专用的创建函数,以确保完成全部内存分配和相关属性初始化。
    注意的点:
    1、new(T) 返回的是 T 的指针
    new(T) 为一个 T 类型新值分配空间并将此空间初始化为 T 的零值,返回的是新值的地址,也就是 T 类型的指针 *T,该指针指向 T 的新分配的零值。
    2、make 只能用于 slice,map,channel
    make 只能用于 slice,map,channel 三种类型,make(T, args) 返回的是初始化之后的 T 类型的值,这个新值并不是 T 类型的零值,也不是指针 *T,是经过初始化之后的 T 的引用。
    slice切片操作

    var s1 []int
    if s1 == nil {
        fmt.Printf("s1 is nil --> %#v 
     ", s1) // []int(nil)
    }
    s2 := make([]int, 3)
    if s2 == nil {
        fmt.Printf("s2 is nil --> %#v 
     ", s2)
    } else {
        fmt.Printf("s2 is not nill --> %#v 
     ", s2)// []int{0, 0, 0}
    }
    

    slice 的零值是 nil,使用 make 之后 slice 是一个初始化的 slice,即 slice 的长度、容量、底层指向的 array 都被 make 完成初始化,此时 slice 内容被类型 int 的零值填充,形式是 [0 0 0],map 和 channel 也是类似的。
    3、make(T, args) 返回的是 T 的 引用
    如果不特殊声明,go 的函数默认都是按值穿参,即通过函数传递的参数是值的副本,在函数内部对值修改不影响值的本身,但是 make(T, args) 返回的值通过函数传递参数之后可以直接修改,即 map,slice,channel 通过函数穿参之后在函数内部修改将影响函数外部的值。
    这说明 make(T, args) 返回的是引用类型,在函数内部可以直接更改原始值,对 map 和 channel 也是如此。
    不要使用 new,永远用 make 来构造 map。
    注意:如果你错误的使用 new() 分配了一个引用对象,你会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取了它的地址:
    mapCreated := new(map[string]float32)
    接下来当我们调用:mapCreated["key1"] = 4.5 的时候,编译器会报运行时错误。

  • 相关阅读:
    20155327 2017-2018-2 《Java程序设计》第9周学习总结
    20155327《Java程序设计》第八周学习总结
    实验二 Java面向对象程序设计
    20155327 李百乾 Exp4 恶意代码分析
    20155327结对编程练习
    20155327第七周学习总结
    2017-2018-1 20155310 20155337 实验五 通讯协议设计
    # 2017-2018-1 20155337《信息安全系统设计基础》第十三周学习总结
    # 20155337 2017-2018 1 课上测试、课下作业、实验
    # 课下测试ch02
  • 原文地址:https://www.cnblogs.com/frankltf/p/13878911.html
Copyright © 2011-2022 走看看