Karp 的技术博客

Golang 中 newmake 的区别

在 Go 语言中,newmake 都用于分配内存,但它们的用途和返回值有所不同。下面将详细介绍这两者的区别。

1. new 函数

new 是一个内置函数,用于分配内存并返回指向该内存的指针。它的主要用途是为值类型(如结构体、数组等)分配内存。

特点

  • 返回值new 返回的是指向类型的指针。
  • 内存分配:它分配的内存是零值,意味着分配的内存中的字段都是类型的默认值。
  • 用法:通常用于分配基本类型的指针或结构体。

示例代码

type Person struct {
    Name string
    Age  int
}

func main() {
    p := new(Person) // p 的类型是 *Person
    p.Name = "Alice"
    p.Age = 30
    fmt.Println(p) // 输出:&{Alice 30}
}

2. make 函数

make 是另一个内置函数,用于创建和初始化切片(slice)、映射(map)和通道(channel)。它用于引用类型,并返回一个已初始化的引用类型。

特点

  • 返回值make 返回的是初始化后的切片、映射或通道,而不是指针。
  • 初始化:使用 make 可以为切片、映射或通道分配内存并初始化其内部结构。
  • 用法:只能用于切片、映射和通道。

示例代码

func main() {
    // 创建一个切片
    s := make([]int, 0) // 创建一个空切片
    s = append(s, 1, 2, 3)
    fmt.Println(s) // 输出:[1 2 3]

    // 创建一个映射
    m := make(map[string]int) // 创建一个空映射
    m["age"] = 30
    fmt.Println(m) // 输出:map[age:30]

    // 创建一个通道
    ch := make(chan int) // 创建一个整型通道
    go func() {
        ch <- 42
    }()
    fmt.Println(<-ch) // 输出:42
}

3. 总结

  • 用途

    • new:用于分配内存并返回一个指向值类型的指针,适用于结构体、数组等。
    • make:用于创建和初始化切片、映射和通道,并返回已初始化的引用类型。
  • 返回值

    • new 返回的是指向新分配内存的指针。
    • make 返回的是切片、映射或通道的实例。

golang

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2024年10月21日 07:40
0

目录

来自 《Golang 中 new 和 make 区别》