Go中new和make的区别对比

发布于:2025-02-10 ⋅ 阅读:(37) ⋅ 点赞:(0)
Go 中 newmake 的区别

在 Go 语言中,newmake 都用于分配内存,但它们的使用场景和行为有显著的区别。
在这里插入图片描述


1. new

定义

new 是 Go 语言中的一个内置函数,用于分配内存并返回指向该内存的指针。new 分配的内存会被初始化为零值。

作用
  • 分配内存:为指定类型分配内存,并返回指向该内存的指针。
  • 零值初始化:分配的内存会被初始化为该类型的零值。
使用场景
  • 值类型:适用于分配值类型(如 intfloat64struct 等)的内存。
  • 指针类型:适用于需要返回指针的场景。

2. make

定义

make 是 Go 语言中的一个内置函数,用于分配并初始化切片、映射和通道等引用类型的数据结构。make 返回的是初始化后的引用类型,而不是指针。

作用
  • 分配内存:为切片、映射和通道分配内存。
  • 初始化数据结构:对分配的内存进行初始化,使其可以直接使用。
使用场景
  • 切片:适用于创建和初始化切片。
  • 映射:适用于创建和初始化映射。
  • 通道:适用于创建和初始化通道。

3. newmake 的区别

特性 new make
适用类型 值类型(如 intstruct 等) 引用类型(如 slicemapchannel 等)
返回值 返回指向分配内存的指针 返回初始化后的引用类型
初始化 分配的内存被初始化为零值 分配的内存被初始化为可用的数据结构
使用场景 适用于需要指针的场景 适用于需要初始化引用类型的场景

new 和 make
new
make
分配内存
返回指针
零值初始化
分配内存
返回引用类型
初始化数据结构

new的使用

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    // 使用 new 分配内存并返回指针
    p := new(Person)
    fmt.Println(p) // 输出: &{ 0}

    // 修改指针指向的值
    p.Name = "Alice"
    p.Age = 30
    fmt.Println(p) // 输出: &{Alice 30}
}

make的使用

package main

import "fmt"

func main() {
    // 使用 make 创建切片
    slice := make([]int, 5)
    fmt.Println(slice) // 输出: [0 0 0 0 0]

    // 使用 make 创建映射
    m := make(map[string]int)
    m["key"] = 42
    fmt.Println(m) // 输出: map[key:42]

    // 使用 make 创建通道
    ch := make(chan int, 1)
    ch <- 42
    fmt.Println(<-ch) // 输出: 42
}

网站公告

今日签到

点亮在社区的每一天
去签到