您好,登录后才能下订单哦!
在Go语言中,make和new是两个常用的内置函数,用于分配和初始化内存。尽管它们的功能有些相似,但它们的用途和实现原理却有很大的不同。本文将深入探讨make和new的实现原理,帮助读者更好地理解它们在Go语言中的作用。
new函数new的基本用法new函数用于分配内存,并返回一个指向该内存的指针。它的语法如下:
func new(Type) *Type
其中,Type表示要分配内存的类型。new函数会为该类型分配零值内存,并返回一个指向该内存的指针。
例如:
p := new(int)
fmt.Println(*p) // 输出 0
在这个例子中,new(int)分配了一个int类型的内存,并将其初始化为0,然后返回一个指向该内存的指针。
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)
}
new的适用场景new函数适用于以下场景:
int、float64、struct等)分配内存并返回指针时。new会将内存初始化为零值)。make函数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的通道
make的实现原理make函数的实现原理比new复杂一些,因为它需要根据不同的类型执行不同的初始化操作。make函数的实现主要依赖于Go语言的运行时系统(runtime)来分配和初始化内存。
对于切片,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)
}
对于映射,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)
}
对于通道,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)
}
make的适用场景make函数适用于以下场景:
make会执行初始化操作)。make和new的区别尽管make和new都用于分配内存,但它们的用途和实现原理有很大的不同。以下是它们的主要区别:
new适用于所有类型,而make仅适用于切片、映射和通道。new返回一个指向分配内存的指针,而make返回一个初始化后的类型实例。new只分配内存并将其初始化为零值,而make不仅分配内存,还会执行初始化操作。make和new是Go语言中两个重要的内置函数,它们分别用于分配和初始化内存。new函数适用于所有类型,并返回一个指向分配内存的指针;而make函数仅适用于切片、映射和通道,并返回一个初始化后的类型实例。理解它们的实现原理和适用场景,有助于我们更好地使用Go语言进行开发。
通过本文的深入探讨,相信读者已经对make和new的实现原理有了更清晰的认识。在实际开发中,根据具体需求选择合适的函数,可以有效地提高代码的效率和可读性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。