您好,登录后才能下订单哦!
在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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。