首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >golang中make 和 new 的区别

golang中make 和 new 的区别

作者头像
GeekLiHua
发布2025-01-21 15:29:25
发布2025-01-21 15:29:25
2120
举报
文章被收录于专栏:JavaJava

golang中make 和 new 的区别

介绍
new
  • new 是一个内建函数,用于分配一块内存并返回指向该内存的指针。
  • 它会为该类型的零值分配内存,并返回指向该类型的指针。
代码语言:javascript
复制
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)
}
  • 运行结果
make
  • make 也是一个内建函数,主要用于创建切片、映射和通道等引用类型的数据结构。
  • make 只能用于切片、映射和通道的创建,不适用于其他类型。
代码语言:javascript
复制
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)
}
  • 运行结果
区别
  1. 适用类型
    • new 适用于任何类型,但返回的是该类型的指针。
    • make 仅适用于切片、映射和通道的创建,返回的是对应引用类型的实例。
  2. 返回类型
    • new 返回的是指向类型的指针。
    • make 返回的是对应引用类型的实例,而不是指针。
  3. 初始化
    • new 分配的内存会被清零,返回的是该类型的零值的指针。
    • make 返回的是被初始化过的引用类型的实例,如切片、映射和通道等。
代码示例

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

代码语言:javascript
复制
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
}
  • 运行结果·
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • golang中make 和 new 的区别
    • 介绍
    • 区别
    • 代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档