it编程 > 前端脚本 > Golang

go语言make初始化的实现

32人参与 2025-02-14 Golang

一:概述

在go语言中,make是一个内建函数,用于初始化切片(slice)、映射(map)和通道(channel)。与new函数不同,make返回的是实际的对象,而非指向对象的指针。本文将深入探讨make的工作原理,并提供一系列实际案例,帮助读者更全面地理解和运用make。

二:具体说明

<1> make的工作原理

make函数的基本语法如下:

make(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的对比

 <4>总结

make是go语言中一个强大的工具,它提供了一种简洁且高效的方式来初始化复杂的数据结构。通过合理使用make,可以提高程序的性能和可读性。希望本文能够帮助读者更深入地理解make的用法,并在实际开发中灵活运用。

到此这篇关于go语言make初始化的实现的文章就介绍到这了,更多相关go语言make初始化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

go中的参数传递是值传递还是引用传递的实现

02-14

Go实现List、Set、Stack、Deque等数据结构的操作方法

02-14

Go语言如何获取goroutine的id

02-14

Go语言中的map扩容机制

02-14

vscode 通过Go:Install/Update Tools命令安装失败的问题解决

02-14

golang debug调试的实现

02-14

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论