make和new有什么区别?
就像租房和买房的区别new给你个地址,make给你个装修好的房子
// new就是一个很简单的东西: func new(Type) *Type // 使用示例 p := new(int) // p是*int类型,指向零值int fmt.Println(*p) // 输出0
new就干一件事:
分配内存
设置零值
返回指针
就这?就这!
// make用于创建slice, map, channel func make(Type, size IntegerType) Type // 使用示例 slice := make([]int, 5) // 长度为5的slice m := make(map[string]int) // 空map ch := make(chan int, 10) // 缓冲区为10的channel
make比较复杂:
创建具体的数据结构
初始化内部数据
返回类型本身(不是指针!)
// new: 分配内存,但不初始化 type Person struct { name string age int } p := new(Person) // p是*Person,所有字段都是零值 // make: 分配内存并初始化 s := make([]int, 5) // s是切片,已经初始化,可以直接使用
// new适合基础类型和结构体 type Config struct { Timeout int MaxRetry int } cfg := new(Config) // 得到一个指向零值Config的指针 // make只用于slice, map, channel ch := make(chan int) // 创建一个channel m := make(map[string]int) // 创建一个map
// new返回指针 p := new([]int) // p是*[]int // make返回类型本身 s := make([]int, 10) // s是[]int
// 用new type User struct { ID int Name string } user := new(User)user.ID = 1 // 通过指针访问 user.Name = "张三" // 更常用的方式 user := &User{ // 直接用字面量 ID: 1, Name: "张三" }
// 错误示范 s := new([]int) // s是*[]int,几乎没人这么用! // 正确示范 s := make([]int, 0, 10) // 创建容量为10的空slice s = append(s, 1, 2, 3) // 可以直接使用
// 错误示范 m := new(map[string]int) // m是*map[string]int,无法使用! // 正确示范 m := make(map[string]int) // 创建可用的map m["张三"] = 100 // 可以直接操作
// 错误示范 ch := new(chan int) // ch是*chan int,无法使用! // 正确示范 ch := make(chan int, 5) // 创建带缓冲的channel go func() { ch <- 1 // 可以直接使用 }()
简单一句话:
new是分配内存,make是初始化。 new给你个地址,make给你个实例。
最新评论: