zoukankan      html  css  js  c++  java
  • 【GoLang】GoLang 中 make 与 new的区别

    make、new操作

    make用于内建类型(mapslice 和channel)的内存分配。new用于各种类型的内存分配。

    内建函数new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:

    new返回指针。

    内建函数make(T, args)new(T)有着不同的功能,make只能创建slicemapchannel,并且返回一个有初始值(非零)的T类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slicenil。对于slicemapchannel来说,make初始化了内部的数据结构,填充适当的值。

    make返回初始化后的(非零)值。

    下面这个图详细的解释了newmake之间的区别。

    图2.5 make和new对应底层的内存分配

    零值

    关于“零值”,所指并非是空值,而是一种“变量未填充前”的默认值,通常为0。 此处罗列 部分类型 的 “零值”

    int     0
    int8    0
    int32   0
    int64   0
    uint    0x0
    rune    0 //rune的实际类型是 int32
    byte    0x0 // byte的实际类型是 uint8
    float32 0 //长度为 4 byte
    float64 0 //长度为 8 byte
    bool    false
    string  ""


    代码示例:

        var map1 map[string]string = make(map[string]string)
        fmt.Println(map1)
        fmt.Println(map1 == nil)
    
        var map2 *map[string]string = new(map[string]string)
        fmt.Println(map2)
        fmt.Println(map2 == nil)
        fmt.Println(*map2)
        fmt.Println(*map2 == nil)
        //    var map1 map[string]string
        map1["aaa"] = "AAA"
        map1["bbb"] = "BBB"
        map1["ccc"] = "CCC"
        fmt.Println(map1)
        fmt.Println(len(map1))

    输出:

    map[]
    false
    &map[]
    false
    map[]
    true
    map[bbb:BBB ccc:CCC aaa:AAA]
    3
    Success: process exited with code 0.

    参考资料:

    golang语言中map的初始化及使用: http://studygolang.com/articles/2379

    Go语言中new()和 make()的区别详解: http://www.jb51.net/article/56837.htm

    golang深度拷贝map: http://blog.csdn.net/xtxy/article/details/51837400

    golang 内置函数new() 和struct{} 初始化的区别: http://studygolang.com/articles/3377

    https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.2.md

  • 相关阅读:
    Ogre中的旋转变换问题 Vector3 , Quaternion,matrix
    OIS几个重要的类的使用
    Ogre中的向量Vector3的成员方法
    用Ogre画三角形
    pitch yaw roll 的区别
    OGRE中用到的设计模式
    OGRE体系结构(类的继承关系)
    OGRE教程SceneNode, Entity, SceneManager and Get start 的讲解
    Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)
    Asp.Net Mvc2 OA工作流设计思路
  • 原文地址:https://www.cnblogs.com/junneyang/p/6070238.html
Copyright © 2011-2022 走看看