当前位置:首页 > 科技  > 软件

揭秘 Go 中的 new() 和 make() 函数

来源: 责编: 时间:2023-10-24 09:00:36 563观看
导读Go(或 Golang)是一种现代、静态类型、编译型的编程语言,专为构建可扩展、并发和高效的软件而设计。它提供了各种内置的函数和特性,帮助开发人员编写简洁高效的代码。其中包括 new() 和 make() 函数,这两个函数乍看起来可能

Go(或 Golang)是一种现代、静态类型、编译型的编程语言,专为构建可扩展、并发和高效的软件而设计。它提供了各种内置的函数和特性,帮助开发人员编写简洁高效的代码。其中包括 new() 和 make() 函数,这两个函数乍看起来可能相似,但在 Go 中用于不同的目的,对于内存分配和数据初始化至关重要。K3g28资讯网——每日最新资讯28at.com

在本博客文章中,我们将探讨 new() 和 make() 函数之间的区别,了解何时以及如何有效地使用它们。K3g28资讯网——每日最新资讯28at.com

K3g28资讯网——每日最新资讯28at.com

new() 和 make() 函数

new() 和 make() 都是 Go 中的内置函数,用于分配内存。然而,它们用于不同的数据类型和场景:K3g28资讯网——每日最新资讯28at.com

new() 函数:K3g28资讯网——每日最新资讯28at.com

  • new() 用于为值类型(例如整数、浮点数、结构体)分配内存,并返回指向新分配的零值的指针。
  • 它接受一个参数,即类型,并返回该类型的指针。

make() 函数:K3g28资讯网——每日最新资讯28at.com

  • make() 用于创建和初始化切片、映射和通道,这些都是 Go 中的引用类型。
  • 它根据类型的不同接受两个或三个参数,并返回一个已初始化(非零值)的值,可以立即使用。

理解 new() 函数

new() 函数的语法非常简单,如下所示:K3g28资讯网——每日最新资讯28at.com

func new(Type) *Type

这里的 Type 表示我们想要为其分配内存的值的类型。让我们看一个如何使用 new() 的示例。K3g28资讯网——每日最新资讯28at.com

在这个示例中,我们使用 new() 创建了 Person 结构体的一个新实例,然后使用指针分配值给其字段。K3g28资讯网——每日最新资讯28at.com

package mainimport "fmt"type Person struct {    Name string    Age  int}func main() {    // Using new() to allocate memory for a Person struct    p := new(Person)    fmt.Printf("%T/n", p)    // Accessing struct fields using the pointer    p.Name = "Alice"    p.Age = 30    // Displaying the values    fmt.Println("Name:", p.Name)    fmt.Println("Age:", p.Age)}

这个程序将产生如下所示的输出。K3g28资讯网——每日最新资讯28at.com

> go run main.go*main.PersonName: AliceAge: 30

理解 make() 函数

make() 函数的语法取决于它所用于的类型。K3g28资讯网——每日最新资讯28at.com

(1) 对于切片(Slices)K3g28资讯网——每日最新资讯28at.com

func make([]Type, len, cap) []Type
  • Type:切片将保存的元素类型。
  • len:切片的初始长度。
  • cap:切片的容量,这是可选的,并用于指定底层数组的容量。如果未提供,它默认与长度相同。

使用 make() 创建切片的示例:K3g28资讯网——每日最新资讯28at.com

package mainimport "fmt"func main() {    // Using make() to create a slice of integers    numbers := make([]int, 5, 10)    // Displaying the slice's length, capacity, and values    fmt.Println("Length:", len(numbers))    fmt.Println("Capacity:", cap(numbers))    fmt.Println("Values:", numbers)    // Using make() to create a slice of integers    numbersWithoutOptional := make([]int, 5)    // Displaying the slice's length, capacity, and values    fmt.Println("Length:", len(numbersWithoutOptional))    fmt.Println("Capacity:", cap(numbersWithoutOptional))    fmt.Println("Values:", numbersWithoutOptional)}

此程序将产生如下输出:K3g28资讯网——每日最新资讯28at.com

> go run main.goLength: 5Capacity: 10Values: [0 0 0 0 0]Length: 5Capacity: 5Values: [0 0 0 0 0]

(2) 对于映射(Maps)K3g28资讯网——每日最新资讯28at.com

func make(map[KeyType]ValueType, initialCapacity int) map[KeyType]ValueType
  • KeyType:映射中键的类型。
  • ValueType:与键关联的值的类型。
  • initialCapacity:映射的初始容量。这是可选的,但当预先知道元素数量时,可以用于优化性能。

使用 make() 创建映射的示例:K3g28资讯网——每日最新资讯28at.com

package mainimport "fmt"func main() {    // Using make() to create a map of string keys and int values    scores := make(map[string]int)    // Adding values to the map    scores["Alice"] = 95    scores["Bob"] = 87    // Displaying the map    fmt.Println("Scores:", scores)}> go run main.goScores: map[Alice:95 Bob:87]

(3) 对于通道(Channels)K3g28资讯网——每日最新资讯28at.com

func make(chan Type, capacity int) chan Type
  • Type:可以通过通道发送和接收的值的类型。
  • capacity:通道的缓冲区大小。如果设置为0,通道是无缓冲的。

使用 make() 创建通道的示例:K3g28资讯网——每日最新资讯28at.com

package mainimport (    "fmt"    "time")func main() {    // Using make() to create an unbuffered channel of integers    ch := make(chan int)    // Sending data into the channel using a goroutine    go func() {        for i := 1; i <= 5; i++ {            ch <- i            time.Sleep(time.Second) // Simulating some work before sending the next value        }        close(ch)    }()    // Receiving data from the channel    for num := range ch {        fmt.Println("Received:", num)    }}> go run main.goReceived: 1Received: 2Received: 3Received: 4Received: 5

结论

在本博客文章中,我们解开了 Go 中的 new() 和 make() 函数的谜团,并解释了它们的区别和用途。总结一下:K3g28资讯网——每日最新资讯28at.com

  • 使用 new() 为值类型分配内存,并获取指向零值的指针。
  • 使用 make() 创建和初始化切片、映射和通道(引用类型),并指定它们的类型和初始容量。

理解 new() 和 make() 之间的区别对于在 Go 中进行高效的内存分配和数据初始化至关重要。正确使用这些函数将在您的 Golang 项目中产生更干净和更优化的代码。愿您编程愉快!K3g28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-14721-0.html揭秘 Go 中的 new() 和 make() 函数

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一次搞定:借助Hutool封装代码快速解决webservice调用烦恼

下一篇: Java21新特性——虚拟线程

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top