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

日拱一卒,每天写一点点

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

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

相关文章
|
10月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1003 6
|
11月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
554 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
8月前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
225 9
|
11月前
|
Java C++ 索引
让星星⭐月亮告诉你,LinkedList和ArrayList底层数据结构及方法源码说明
`LinkedList` 和 `ArrayList` 是 Java 中两种常见的列表实现。`LinkedList` 基于双向链表,适合频繁的插入和删除操作,但按索引访问元素效率较低。`ArrayList` 基于动态数组,支持快速随机访问,但在中间位置插入或删除元素时性能较差。两者均实现了 `List` 接口,`LinkedList` 还额外实现了 `Deque` 接口,提供了更多队列操作。
175 3
|
11月前
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
970 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
11月前
|
算法 Java C语言
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
1410 1
|
11月前
|
存储
ES6中的Set数据结构的常用方法和使用场景
ES6中的Set数据结构的常用方法和使用场景
|
11月前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
194 0
|
11月前
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
155 0
|
10月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
213 59