Loading

Golang new和make的区别

在 Go 语言中,newmake 都是用来分配内存的,但它们的使用场景和返回值有所不同。以下是它们的主要区别:

1. 适用场景

  • new

    • 用于分配内存给任何类型(包括内置类型和自定义类型),并返回一个指向该类型的零值的指针。

    • 适用于需要手动管理内存或需要返回指针的场景。

  • make

    • 用于创建切片(slice)、映射(map)和通道(channel)这三种集合类型。

    • 返回的是集合类型的值本身,而不是指针。

2. 初始化

  • new

    • 分配内存后,初始化为该类型的零值。

    • 如果分配成功,返回一个指向分配内存的指针。

  • make

    • 除了分配内存外,还会对集合类型进行初始化操作:

      • 对于切片,初始化为一个空切片(长度为0,容量为0)。

      • 对于映射,初始化为一个空映射(不包含任何键值对)。

      • 对于通道,初始化为一个未缓冲的通道(默认行为)。

3. 返回值

  • new

    • 返回一个指向分配内存的指针。

  • make

    • 返回集合类型的值本身。

4. 使用示例

  • new

    package main
    
    import "fmt"
    
    func main() {
        // 使用 new 分配 int 类型的内存
        p := new(int)
        fmt.Println("Value:", *p) // 输出零值:0
        fmt.Println("Type:", fmt.TypeOf(p)) // 输出:*int
    }
  • make

    package main
    
    import "fmt"
    
    func main() {
        // 使用 make 创建一个切片
        slice := make([]int, 0)
        fmt.Println("Slice Length:", len(slice)) // 输出:0
        fmt.Println("Slice Type:", fmt.TypeOf(slice)) // 输出:[]int
    
        // 使用 make 创建一个映射
        mapData := make(map[string]string)
        fmt.Println("Map Length:", len(mapData)) // 输出:0
        fmt.Println("Map Type:", fmt.TypeOf(mapData)) // 输出:map[string]string
    
        // 使用 make 创建一个通道
        channel := make(chan int)
        fmt.Println("Channel Type:", fmt.TypeOf(channel)) // 输出:chan int
    }

总结

  • new:用于分配内存并返回指针,适用于所有类型,返回值为该类型的零值的指针。

  • make:用于创建切片、映射和通道,并返回对应的值类型,同时进行初始化操作。

posted @ 2025-06-18 16:13  Carver大脸猫  阅读(17)  评论(0)    收藏  举报