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

相关文章

  • go连接kafka的实现示例

    go连接kafka的实现示例

    本文主要介绍了go连接kafka的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • golang中常见的logrus日志库

    golang中常见的logrus日志库

    这篇文章主要介绍了golang中常见的logrus日志库的相关资料,需要的朋友可以参考下
    2023-05-05
  • Golang六个常用接口的使用总结

    Golang六个常用接口的使用总结

    在这篇文章中,小编来带大家学习几个Go标准库的接口,看看Go标准库是如何定义接口,以加深对Go语言接口的理解,感兴趣的小伙伴快跟随小编一起了解一下吧
    2023-07-07
  • golang基于websocket通信tcp keepalive研究记录

    golang基于websocket通信tcp keepalive研究记录

    这篇文章主要为大家介绍了golang基于websocket通信tcp keepalive研究记录,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang设计模式之组合模式讲解

    Golang设计模式之组合模式讲解

    这篇文章主要介绍了Golang设计模式之组合模式,组合模式针对于特定场景,如文件管理、组织管理等,使用该模式能简化管理,使代码变得非常简洁
    2023-01-01
  • 详解Golang中使用map时的注意问题

    详解Golang中使用map时的注意问题

    Golang中的map是一种数据结构,它允许你使用键值对的形式存储和访问数据,map在Go中是非排序的,提供了高效查找、插入和删除元素的能力,特别是当键是不可变类型,本文给大家详细介绍了Golang中使用map时的注意问题,需要的朋友可以参考下
    2024-06-06
  • 在golang xorm中使用postgresql的json,array类型的操作

    在golang xorm中使用postgresql的json,array类型的操作

    这篇文章主要介绍了在golang xorm中使用postgresql的json,array类型的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 如何有效控制Go线程数实例探究

    如何有效控制Go线程数实例探究

    这篇文章主要为大家介绍了如何有效控制 Go 线程数的问题探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • golang实现可中断的流式下载功能

    golang实现可中断的流式下载功能

    这篇文章主要给大家介绍了golang实现可中断的流式下载,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Go高级特性探究之稳定排序详解

    Go高级特性探究之稳定排序详解

    Go 语言提供了 sort 包,其中最常用的一种是 sort.Slice() 函数,本篇文章将为大家介绍如何使用 sort.SliceStable() 对结构体数组的某个字段进行稳定排序,感兴趣的可以了解一下
    2023-06-06

最新评论