乐趣区

关于go:GO语言初始化数据结构的方法你知道吗

xdm 我是阿兵云原生

应用 golang 进行编码过程中,你们都是如何初始化数据结构的呢

GO 外面提供了 2 个关键字来进行初始化数据结构

  • new
  • make

不过有时候我也会间接应用花括号的形式间接就初始化,例如这样:

name := []string{"xiaomotong","bob","marry"}

下面这种状况,是初始化的时候曾经明确好了须要填的值,能够应用下面这种做法,不过工作中大多数状况初始化的时候,数据还是未知的,大部分工夫还是会应用上述两种形式

make

make 是 golang 提供的关键字,次要是用于初始化内置的数据结构,不能初始化自定义的数据结构,make 能够初始化的数据类型有:

  • slice 切片
  • map hash 表
  • channel 通道

例如咱们初始化的时候就能够这样写

  • 初始化一个切片,填入 len 值,cap 值,切片底层的数据结构除了这俩值以外,还有一个指针,指向的是一个底层数组
  • 初始化一个 map,map 的底层是指向一个 hmap 的构造体指针,构造体外面的具体成员感兴趣的 xdm 能够翻看我的历史文章
  • 初始化一个通道 ch,这个 ch 是指向一个 hchan 的构造体指针,同样也可翻看我的历史文章看细节
strs := make([]string, 0, 10)
myMap := make(map[string]string, 10)
ch := make(chan struct{}, 10)

咱们查看 make 的源码解释能够看到,make 的确反对创立和初始上述 3 种类型

依据解释,咱们晓得,make 的返回值的类型与填入参数的类型保持一致,咱们填入的是切片类型,那么返回值就是切片类型,填入其余类型对应返回值也是咱们冀望的类型,没故障

new

那么为什么有了 make 做数据结构的初始化,还须要 new 干啥?

仔细的 胖鱼 能够看进去,后面说到了 make 只实用于初始化 golang 提供的内置数据结构,对于自定义的数据结构,就顾此失彼了,这个时候还是须要 new 出马摆平了

用 new 初始化数据结构能够这样写:

  • 自定义一个构造体,外面 2 个成员,age 和 name
  • 应用 new 对 T 最初始化,返回一个构造体的指针
type T struct{
    age int
    name string
}

func main(){t := new(T)
    fmt.Println("t.name ==",t.name)
    fmt.Println("t.age ==",t.age)

}

程序执行成果如下:

# go run main.go
t.name ==
t.age ==  0

果然是给我初始化了数据结构,只不过数据都是 零值

当然咱们也能够这样写:

func main(){a := new(int)
    fmt.Println("a ==",a)
    fmt.Println("*a ==",*a)

}

程序执行成果如下:

# go run main.go
a ==  0xc420018078
*a ==  0

依据程序运行后果,咱们晓得 new 返回的是一个指针,且这个指针指向的内存地址上对应的值是一个该类型的 零值

瞅一眼 new 源码阐明

golang 源码中说到,new 的第一个参数是 数据类型,不是一个值,并且 new 的返回值是一个依据参数类型调配零值内存的指针

因而,咱们下面看到的 new 进去的数据结构,打印进去的数据都是对应类型的零值

make 和 new 的区别

最初再来梳理一下 make 和 new 的区别,加深印象

  • make 只能用来初始化内置数据类型

    • slice
    • map
    • chan

      而 new 能够调配任意类型的数据(包含自定义数据类型)

  • make 返回的是援用,是 Type 类型,new 返回的是指针,是 *Type 类型的

日拱一卒,每天写一点点

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 阿兵云原生,欢送点赞关注珍藏,下次见~

退出移动版