package main
import "fmt"
//make和new都可以用来初始化,两者却有完全不同的作用
//make关键字的主要作用是初始化内置的数据结构,也就是数组,切片和Channel
//new,当我们想要获取指向某个类型的指针时可以使用new关键字
func main() {
//make在Go中只能用来初始化基本类型
/*
func make(t Type, size ...IntegerType) Type
类型 长度(Integer类型) 返回值:类型
// The new built-in function allocates memory. The first argument is a type,
新的内置函数分配内存。第一个参数是类型,
// not a value, and the value returned is a pointer to a newly
不是值,返回的值是指向新指针的指针
// allocated zero value of that type.
分配该类型的零值。
*/
//slice是一个包含data,cap和len的结构体
slice:=make([]int,0,100)
//hash是一个指向hmap结构体的指针
hash:=make(map[int]bool,10)
//ch是一个指向hchan结构体的指针
ch:=make(chan int ,5)
fmt.Println(slice,hash,ch) //[] map[] 0xc000082000
//new:接收一个类型作为参数然后返回一个指向这个类型的指针
/*
func new(Type) *Type
类型 返回值:指向这个新分配的零值的指针
// The complex built-in function constructs a complex value from two
复杂的内置函数从两个构造一个复杂的值
// floating-point values. The real and imaginary parts must be of the same
浮点值。实部和虚部必须相同
// size, either float32 or float64 (or assignable to them), and the return
大小,可以是float32或float64(或可分配给它们),并返回
// value will be the corresponding complex type (complex64 for float32,
值将是对应的复杂类型(对于float32,为complex64,
// complex128 for float64).
用于float64的complex128)
*/
i:=new(int)
var v int
i1:=&v
fmt.Println(i,i1)//0xc00001a088 0xc00001a0a0
//这两种不同初始化方法其实是等价的,它们都会创建一个指向 int 零值的指针。
//总结:make 用于创建切片、哈希表和管道等内置数据结构,new 用于分配并创建一个指向对应类型的指针。
//实现原理
//make关键字就是根据参数类型的不同转化成三种不同类型的节点,这些节点最终也会调用不同的运行时函数来初始化数据结构
//new
//如果请求创建的类型大小是0,那么就会返回一个表示空指针的变量,在遇到其他情况时会将关键字转换成newobject
}
/*
总结:
最后,简单总结一下Go语言中 make 和 new 关键字的实现原理,make 关键字的主要作用是创建切片、哈希表和 Channel 等内置的数据结构,
而 new 的主要作用是为类型申请一片内存空间,并返回指向这片内存的指针。
*/
Go中make和new
最新推荐文章于 2024-03-03 07:00:00 发布