当前位置: 首页>后端>正文

golang中make 和 new 的区别

golang中make 和 new 的区别

介绍

new
  • new 是一个内建函数,用于分配一块内存并返回指向该内存的指针。
  • 它会为该类型的零值分配内存,并返回指向该类型的指针。
package main

import (
	"fmt"
)

// 定义一个结构体
type Person struct {
	Name string
	Age  int
}

func main() {
	// 使用 new 内建函数创建一个 *Person 类型的指针,并将其赋值给 p
	p := new(Person)

	// 因为 new 分配了内存,所以 p 不会是 nil
	if p == nil {
		fmt.Println("p is nil.")
	} else {
		fmt.Println("p is not nil.")
	}

	// 访问结构体字段并设置值
	p.Name = "Alice"
	p.Age = 30

	// 输出结构体字段的值
	fmt.Println("Name:", p.Name)
	fmt.Println("Age:", p.Age)
}
  • 运行结果
    golang中make 和 new 的区别,在这里插入图片描述,第1张
make
  • make 也是一个内建函数,主要用于创建切片、映射和通道等引用类型的数据结构。
  • make 只能用于切片、映射和通道的创建,不适用于其他类型。
package main

import (
	"fmt"
)

func main() {
	// 使用 make 创建一个切片,长度为 3,容量为 5
	slice := make([]int, 3, 5)

	// 添加元素到切片中
	slice[0] = 1
	slice[1] = 2
	slice[2] = 3

	// 输出切片的长度和容量
	fmt.Println("Length of slice:", len(slice))
	fmt.Println("Capacity of slice:", cap(slice))

	// 使用 make 创建一个映射
	m := make(map[string]int)

	// 添加键值对到映射中
	m["apple"] = 10
	m["banana"] = 20

	// 输出映射的内容
	fmt.Println("Map m:", m)

	// 使用 make 创建一个通道
	ch := make(chan int)

	// 在 goroutine 中发送数据到通道
	go func() {
		ch <- 42
	}()

	// 从通道中接收数据
	value := <-ch
	fmt.Println("Value received from channel:", value)
}

  • 运行结果

golang中make 和 new 的区别,在这里插入图片描述,第2张

区别

  1. 适用类型

    • new 适用于任何类型,但返回的是该类型的指针。
    • make 仅适用于切片、映射和通道的创建,返回的是对应引用类型的实例。
  2. 返回类型

    • new 返回的是指向类型的指针。
    • make 返回的是对应引用类型的实例,而不是指针。
  3. 初始化

    • new 分配的内存会被清零,返回的是该类型的零值的指针。
    • make 返回的是被初始化过的引用类型的实例,如切片、映射和通道等。

代码示例

下面是用 Go 语言演示 makenew 的区别的代码:

package main

import (
    "fmt"
)

func main() {
    // 使用 new 分配内存
    var p *int
    p = new(int)
    fmt.Println("*p:", *p) // 输出:*p: 0

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

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

    // 使用 new 创建结构体指针
    type Person struct {
        Name string
        Age  int
    }
    personPtr := new(Person)
    fmt.Println("personPtr:", personPtr) // 输出:personPtr: &{ 0}

    // 使用 make 创建通道
    ch := make(chan int)
    fmt.Println("channel:", ch) // 输出:channel: 0xc0000180c0
}
  • 运行结果·

golang中make 和 new 的区别,在这里插入图片描述,第3张


https://www.xamrdz.com/backend/3ay1849088.html

相关文章: