• go中make和new的使用


    1. make

    make也可以内存分配,但是和new不同。

    它只用于chan、map、slice的内存创建,无可替代。
    而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。

    func make(t Type, size ...IntegerType) Type
    

    注意,因为这三种类型是引用类型,所以必须得手动初始化赋值,这个和new是不一样的。
    make是不可替代的:
    我们在使用slice、map以及channel的时候,必须要使用make进行初始化,然后才可以对他们进行操作。

    2. new

    new 是 Golang 的内建函数,用于分配内存,其中,第一个参数是类型,返回值是类型的指针,其值被自动初始化为“零”(类型对应的零值,int 初始化为0,bool初始化为 false 等),无需手动赋值。

    func new(Type) *Type
    

    3.new 和 make的区别

    1. new 和 make 都用于分配内存;

    2. new 和 make 都是在堆上分配内存;

    3. new 对指针类型分配内存,返回值是对应类型的指针,new也可以对 slice 、map、channel 分配内存,但不推荐使用;

      name := new(string)
      i := new([]int)  ===>  []
      m := new(map[int]string)  ===>map[]
      
      但是进行赋值操作时
       (*nm)["kk"] = "kk",
      会报错:assignment to entry in nil map,
      不知道如何解决,所以就不要使用new来定义slice 、map、channel了
      
    4. make 仅用于 slice、map和 channel 的初始化,返回值为类型本身,而不是该类型的指针;

      声明map:
      第一种:
      var nameId = make(map[string]int, 0)
      nameId["Golang"] = 1
      nameId["C++"] = 2
      
      第二种:
      n := map[string]int{"foo": 1, "bar": 2}
      

      但是,需要注意,在对嵌套map进行初始化时,make只初始化了map[string]T部分(T为map[int]int),所以下面的赋值会出现错误:

      test := make(map[string]map[int]int)
      test["go"][0] = 0 // error  报错:assignment to entry in nil map
      

    正确做法:

    test := make(map[string]map[int]int)
    if test["go"] == nil {
      test["go"] = make(map[int]int) //对第二个map进行初始化
    }
    test["go"][0] = 0
    
  • 相关阅读:
    病毒侵袭持续中---hdu3065(AC自动机模板)
    病毒侵袭---hdu2896(AC自动机)
    Keywords Search---hdu2222(AC自动机 模板)
    Theme Section---hdu4763(kmp, Next数组的运用)
    Girls' research---hdu3294(回文子串manacher)
    吉哥系列故事——完美队形II---hdu4513(最长回文子串manacher)
    String Boot-thymeleaf使用(四)
    Spring Boot-properties使用(二)
    Spring Boot-springbootHelloword(一)
    redis-运维-redis单机和集群
  • 原文地址:https://www.cnblogs.com/wt11/p/16538422.html
Copyright © 2020-2023  润新知