略微加速

略速 - 互联网笔记

golang:make和new有什么区别?

2025-03-29 leiting (35阅读)

标签 Golang

make和new有什么区别?
就像租房和买房的区别new给你个地址,make给你个装修好的房子

new是什么鬼?

// new就是一个很简单的东西:
func new(Type) *Type

// 使用示例
p := new(int)    // p是*int类型,指向零值int
fmt.Println(*p)  // 输出0

new就干一件事:

  1. 分配内存

  2. 设置零值

  3. 返回指针

就这?就这!

make又是啥?

// 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比较复杂:

  1. 创建具体的数据结构

  2. 初始化内部数据

  3. 返回类型本身(不是指针!)

为啥要分两个?

1. 概念完全不同

// new: 分配内存,但不初始化
type Person struct {
    name string
    age  int
}
p := new(Person)  // p是*Person,所有字段都是零值

// make: 分配内存并初始化
s := make([]int, 5)  // s是切片,已经初始化,可以直接使用

2. 使用场景不同

// 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

3. 返回值不同

// new返回指针
p := new([]int)  // p是*[]int

// make返回类型本身
s := make([]int, 10)  // s是[]int

实战中咋用啊

1. 创建结构体

// 用new
type User struct {
    ID   int
    Name string
}
user := new(User)user.ID = 1       // 通过指针访问
user.Name = "张三"

// 更常用的方式
user := &User{    // 直接用字面量
    ID:   1,
    Name: "张三"
}

2. 创建slice

// 错误示范
s := new([]int)  // s是*[]int,几乎没人这么用!

// 正确示范
s := make([]int, 0, 10)  // 创建容量为10的空slice
s = append(s, 1, 2, 3)   // 可以直接使用

3. 创建map

// 错误示范
m := new(map[string]int)  // m是*map[string]int,无法使用!

// 正确示范
m := make(map[string]int)  // 创建可用的map
m["张三"] = 100  // 可以直接操作

4. 创建channel

// 错误示范
ch := new(chan int)  // ch是*chan int,无法使用!

// 正确示范
ch := make(chan int, 5)  // 创建带缓冲的channel
go func() {
    ch <- 1  // 可以直接使用
}()

简单一句话:

new是分配内存,make是初始化。 new给你个地址,make给你个实例。


北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3