Go语言的make和new实现原理是什么

发布时间:2023-02-27 09:13:40 作者:iii
来源:亿速云 阅读:94

Go语言的make和new实现原理是什么

在Go语言中,makenew是两个常用的内置函数,用于分配和初始化内存。尽管它们的功能有些相似,但它们的用途和实现原理却有很大的不同。本文将深入探讨makenew的实现原理,帮助读者更好地理解它们在Go语言中的作用。

1. new函数

1.1 new的基本用法

new函数用于分配内存,并返回一个指向该内存的指针。它的语法如下:

func new(Type) *Type

其中,Type表示要分配内存的类型。new函数会为该类型分配零值内存,并返回一个指向该内存的指针。

例如:

p := new(int)
fmt.Println(*p) // 输出 0

在这个例子中,new(int)分配了一个int类型的内存,并将其初始化为0,然后返回一个指向该内存的指针。

1.2 new的实现原理

new函数的实现原理相对简单。它主要依赖于Go语言的运行时系统(runtime)来分配内存。具体来说,new函数会调用runtime.newobject函数来分配内存。

runtime.newobject函数的定义如下:

func newobject(typ *_type) unsafe.Pointer

其中,typ参数表示要分配内存的类型。runtime.newobject函数会根据类型的大小分配相应的内存,并将该内存初始化为零值。

new函数的实现可以简化为以下伪代码:

func new(Type) *Type {
    return runtime.newobject(Type)
}

1.3 new的适用场景

new函数适用于以下场景:

2. make函数

2.1 make的基本用法

make函数用于创建并初始化切片(slice)、映射(map)和通道(channel)。它的语法如下:

func make(Type, size ...IntegerType) Type

其中,Type表示要创建的类型,size表示要分配的大小(对于切片和通道)或容量(对于映射)。make函数会返回一个初始化后的类型实例。

例如:

s := make([]int, 10) // 创建一个长度为10的切片
m := make(map[string]int) // 创建一个空的映射
c := make(chan int, 5) // 创建一个缓冲区大小为5的通道

2.2 make的实现原理

make函数的实现原理比new复杂一些,因为它需要根据不同的类型执行不同的初始化操作。make函数的实现主要依赖于Go语言的运行时系统(runtime)来分配和初始化内存。

2.2.1 切片的创建

对于切片,make函数会调用runtime.makeslice函数来分配内存并初始化切片。runtime.makeslice函数的定义如下:

func makeslice(et *_type, len, cap int) unsafe.Pointer

其中,et表示切片的元素类型,len表示切片的长度,cap表示切片的容量。runtime.makeslice函数会根据切片的长度和容量分配相应的内存,并返回一个指向该内存的指针。

make函数对于切片的实现可以简化为以下伪代码:

func make([]T, len, cap int) []T {
    return runtime.makeslice(T, len, cap)
}

2.2.2 映射的创建

对于映射,make函数会调用runtime.makemap函数来分配内存并初始化映射。runtime.makemap函数的定义如下:

func makemap(t *maptype, hint int, h *hmap) *hmap

其中,t表示映射的类型,hint表示映射的初始容量,h表示映射的哈希表。runtime.makemap函数会根据映射的类型和容量分配相应的内存,并返回一个指向该内存的指针。

make函数对于映射的实现可以简化为以下伪代码:

func make(map[K]V, hint int) map[K]V {
    return runtime.makemap(mapType, hint, nil)
}

2.2.3 通道的创建

对于通道,make函数会调用runtime.makechan函数来分配内存并初始化通道。runtime.makechan函数的定义如下:

func makechan(t *chantype, size int) *hchan

其中,t表示通道的类型,size表示通道的缓冲区大小。runtime.makechan函数会根据通道的类型和缓冲区大小分配相应的内存,并返回一个指向该内存的指针。

make函数对于通道的实现可以简化为以下伪代码:

func make(chan T, size int) chan T {
    return runtime.makechan(chanType, size)
}

2.3 make的适用场景

make函数适用于以下场景:

3. makenew的区别

尽管makenew都用于分配内存,但它们的用途和实现原理有很大的不同。以下是它们的主要区别:

4. 总结

makenew是Go语言中两个重要的内置函数,它们分别用于分配和初始化内存。new函数适用于所有类型,并返回一个指向分配内存的指针;而make函数仅适用于切片、映射和通道,并返回一个初始化后的类型实例。理解它们的实现原理和适用场景,有助于我们更好地使用Go语言进行开发。

通过本文的深入探讨,相信读者已经对makenew的实现原理有了更清晰的认识。在实际开发中,根据具体需求选择合适的函数,可以有效地提高代码的效率和可读性。

推荐阅读:
  1. Go语言是怎么设计Map的
  2. Go语言接口怎么使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go语言 make new

上一篇:Golang中的Slice底层如何实现

下一篇:Go语言中make和new有什么区别

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》