一:概述
在go语言中,make是一个内建函数,用于初始化切片(slice)、映射(map)和通道(channel)。与new函数不同,make返回的是实际的对象,而非指向对象的指针。本文将深入探讨make的工作原理,并提供一系列实际案例,帮助读者更全面地理解和运用make。
二:具体说明
<1> make的工作原理
make函数的基本语法如下:
make(type, length, capacity)
- type:要创建的数据结构类型,只能是切片、映射或通道。
- length:数据结构的初始长度,对于切片和通道是必需的。
- capacity:数据结构的容量,对于切片是可选的,对于映射和通道是必需的。
1.1 切片的初始化
切片是go语言中非常灵活的数据结构,make用于创建切片并初始化其底层数组。
// 创建一个长度为3,容量为5的int类型切片 s := make([]int, 3, 5) fmt.println("slice:", s) // 输出: slice: [0 0 0] fmt.println("length:", len(s)) // 输出: length: 3 fmt.println("capacity:", cap(s)) // 输出: capacity: 5
1.2 映射的初始化
映射是go语言中的键值对集合,make用于创建映射并初始化其底层哈希表。
// 创建一个空的字符串到整数的映射 m := make(map[string]int) fmt.println("map:", m) // 输出: map: map[] fmt.println("length:", len(m)) // 输出: length: 0
1.3 通道的初始化
通道是go语言中的同步通信机制,make用于创建通道并初始化其缓冲区。
// 创建一个容量为3的整数通道 ch := make(chan int, 3) fmt.println("channel:", ch) // 输出: channel: 0x00 fmt.println("length:", len(ch)) // 输出: length: 0 fmt.println("capacity:", cap(ch)) // 输出: capacity: 3
<2>make的实际案例
2.1 切片的动态扩容
切片的动态扩容是go语言中一个重要的特性,make可以预设容量以优化性能。
s := make([]int, 0, 10) // 预设容量为10 for i := 0; i < 15; i++ { s = append(s, i) } fmt.println("slice:", s) // 输出: slice: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
2.2 映射的并发安全
映射本身不是并发安全的,但可以通过sync包中的map类型来实现并发安全。
var m sync.map m.store("key", 1) if v, ok := m.load("key"); ok { fmt.println("value:", v) // 输出: value: 1 }
2.3 通道的缓冲区控制
通道的缓冲区大小对于控制并发流程至关重要。
ch := make(chan int, 2) // 缓冲区大小为2 go func() { for i := 0; i < 5; i++ { ch <- i * 2 // 发送数据 } close(ch) // 发送完毕后关闭通道 }() for v := range ch { fmt.println("received:", v) // 接收并打印数据 }
<3> make与new的对比
- new(t)返回类型t的指针,即*t,而make(t)返回类型t的实例。
- new(t)不会对t进行初始化,而make(t)会根据类型进行初始化。
- make只能用于切片、映射和通道的初始化,而new可以用于任何类型的初始化。
<4>总结
make是go语言中一个强大的工具,它提供了一种简洁且高效的方式来初始化复杂的数据结构。通过合理使用make,可以提高程序的性能和可读性。希望本文能够帮助读者更深入地理解make的用法,并在实际开发中灵活运用。
到此这篇关于go语言make初始化的实现的文章就介绍到这了,更多相关go语言make初始化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论