go语言make初始化的实现

 更新时间:2024年12月05日 11:01:09   作者:让世界更美好  
Go语言中的make函数用于初始化切片、映射和通道,本文就来介绍一下go语言make初始化的实现,具有一定的参考价值,感兴趣的可以了解一下

一:概述

在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初始化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang巧用defer进行错误处理的方法

    Golang巧用defer进行错误处理的方法

    错误处理是程序的重要组成部分,有效且优雅的处理错误是大多数程序员的追求,下面这篇文章主要给大家介绍了关于Golang中巧用defer进行错误处理的方法,文中通过示例介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • GoLang中生成UUID唯一标识的实现

    GoLang中生成UUID唯一标识的实现

    这篇文章主要介绍了GoLang中生成UUID唯一标识的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang操作Redis的实现示例

    Golang操作Redis的实现示例

    本文介绍了Redis作为高性能key-value数据库的特性,包括数据持久化、丰富的数据结构、高并发性能、原子操作以及连接池管理,通过实例展示了使用Redis进行String、List和Hash操作,以及设置过期时间和连接池的管理,感兴趣的可以了解一下
    2025-11-11
  • Go切片的具体使用

    Go切片的具体使用

    本文主要介绍了Go切片的具体使用,包括声明切片、初始化切片、切片的切割、切片的添加、切片的删除、切片的复制、切片的遍历、多维切片等,感兴趣的可以了解一下
    2023-11-11
  • Golang errgroup 设计及实现原理解析

    Golang errgroup 设计及实现原理解析

    这篇文章主要为大家介绍了Golang errgroup 设计及实现原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go调度器学习之协作与抢占详解

    Go调度器学习之协作与抢占详解

    如果某个G执行时间过长,其他的G如何才能被正常调度,这就引出了接下来的话题:协作与抢占。本文将通过一些示例为大家详细讲讲调度器中协作与抢占的相关知识,需要的可以参考一下
    2023-04-04
  • 详解Golang中Requests包的使用

    详解Golang中Requests包的使用

    Go的net/http包虽然功能强大、用途也广告,但要想正确的使用请求的客户端是非常繁琐的,所以本文和大家分享一个高效的HTTP的请求包carlmjohnson/requests的使用,需要的小伙伴可以了解一下
    2023-06-06
  • 解决Golang中goroutine执行速度的问题

    解决Golang中goroutine执行速度的问题

    这篇文章主要介绍了解决Golang中goroutine执行速度的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • golang简单读写文件示例

    golang简单读写文件示例

    这篇文章主要介绍了golang简单读写文件的方法,实例分析了Go简单文件读取与写入操作的相关技巧,需要的朋友可以参考下
    2016-07-07
  • Golang实现Java虚拟机之解析class文件详解

    Golang实现Java虚拟机之解析class文件详解

    这篇文章主要为大家详细介绍了Golang实现Java虚拟机之解析class文件的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论