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 的时候,编译器会报运行时错误。

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/frankltf/p/13878911.html
Copyright © 2011-2022 走看看