new和make的区别

在Go语言中,newmake 是两个用于分配内存的关键字,它们的作用有所不同。

new

  • new 用于创建一个指向新分配的零值的指针,返回的是指针。对于指针、引用类型(slice、map 和 channel),new 返回的是指针。
  • new 分配内存,但不对内存进行初始化,返回指针。
  • 主要用于初始化值类型(比如 struct)的内存空间。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func main() {
    // 使用new创建一个int的指针
    p := new(int)
    fmt.Println(*p) // 输出:0,因为指向的int类型的零值

    // 使用new创建一个struct类型的指针
    type Point struct {
        x, y int
    }
    q := new(Point)
    fmt.Println(q) // 输出:&{0 0},因为指向的Point类型的零值
}

make

  • make 仅用于创建 slice、map 和 channel,并返回一个被初始化的(非零值)的引用(非指针)。
  • make 只能用于特定的引用类型(slice、map 和 channel),不能用于其他类型。
  • make 分配内存并且初始化,返回引用。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
func main() {
    // 使用make创建一个slice
    s := make([]int, 3, 5) // 长度为3,容量为5的slice
    fmt.Println(s)         // 输出:[0 0 0]

    // 使用make创建一个map
    m := make(map[string]int)
    m["foo"] = 42
    fmt.Println(m) // 输出:map[foo:42]

    // 使用make创建一个channel
    c := make(chan int)
    fmt.Println(c) // 输出:0xc000096060(channel的地址)
}

总结:

  • make 只能用来分配及初始化类型为 slice、map、chan 的数据;new 可以分配任意类型的数据。
  • new 分配返回的是指针,即类型 *Type;make 返回引用,即 Type。
  • new 分配的空间被清零;make 分配空间后,会进行初始化。

切片中二者的区别

在 Go 语言中,newmake 都是用于分配内存,但是它们分别用于不同的数据类型。对于切片(slice)而言,它们之间的区别主要在于以下几点:

  1. make([]T, len, cap)

    • make 用于创建切片、映射和通道。
    • 第一个参数是要创建的数据类型,这里是 []T 表示切片。
    • 第二个参数是切片的长度,表示切片中初始的元素数量。
    • 第三个参数是切片的容量,表示从切片的起始位置到底层数组的结束位置之间的元素数量。
    • 它返回一个指定类型、长度和容量的切片,并分配了对应类型的内存。这样得到的切片可以直接使用,而且长度和容量都已经指定。
  2. new([]T)

    • new 用于分配内存,并返回一个指向该类型零值的指针。
    • 参数是要分配内存的类型,这里是 []T 表示切片类型。
    • 它返回一个指向新分配的类型零值的指针,对于切片来说,这个零值是 nil 切片。
    • 此时虽然已经分配了内存,但是还没有初始化切片的长度和容量。这意味着,返回的切片是一个空切片,还不能直接用于存储数据。需要使用 append() 函数来添加元素,或者通过赋值语句将其指向一个已经初始化的切片。

总的来说,make([]T, len, cap) 用于创建一个指定长度和容量的切片,并且分配了对应的内存,可以直接使用;而 new([]T) 只是分配了一个指向 nil 切片的指针,需要进一步初始化后才能使用。

0%