美文网首页
GO语言初始化数据结构的方法你知道吗?

GO语言初始化数据结构的方法你知道吗?

作者: 阿兵云原生 | 来源:发表于2022-12-30 16:32 被阅读0次
chushihau.jpg

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 种类型

image

根据解释,我们知道,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 源码说明

image-20211017150756595

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

因此,我们上面看到的 new 出来的数据结构,打印出来的数据都是对应类型的零值

make 和 new 的区别

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

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

    • slice

    • map

    • chan

      而 new 可以分配任意类型的数据(包括自定义数据类型)

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

日拱一卒,每天写一点点

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

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

相关文章

  • 我的书单

    韩顺平go语言基础 -- 在读go语言实战 -- 在读大话数据结构 -- 在读高性能MySQL -...

  • Go学习随笔(三)

    Go语言数组 var 数组名 [数组长度]元素类型{初始化元素} Go语言中数组内部元素默认初始化为0 var 数...

  • go语言学习

    go 工具使用 oop // 初始化方法 在Go语言中没有构造函数的概念,对象的创建通常交由一个全局的创建函数来完...

  • go init 函数

    go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性,有下面的特征: 包的初始化...

  • Golang基础之Map

    map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。 map的定...

  • 10 Golang map的正确使用姿势

    map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。 其中: K...

  • Go语言数据结构和算法-DoubleLinkedList(双向链

    Go语言数据结构和算法-DoubleLinkedList(双向链表) 双向链表的数据结构 Prepend(val)...

  • GO语言学习系列五——GO的控制语句(补充指针)

    补充指针 在GO语言中,提供了控制数据结构的指针的能力,但是,你不能进行指针运算; 在GO语言中,用*关键字来声明...

  • go语言中的方法

    go支持OO语言的一些特性,方法就是其中之一。本文将介绍go语言中方法相关的概念。 方法声明 在go语言中,我们可...

  • Go语言数据结构和算法-LinkedList(链表)

    Go语言数据结构和算法-LinkedList(链表) 节点和链表数据结构 Prepend(item) 在链表头新增...

网友评论

      本文标题:GO语言初始化数据结构的方法你知道吗?

      本文链接:https://www.haomeiwen.com/subject/fonxcdtx.html