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给你个实例。
最新评论: