您现在的位置是:首页 > 编程 > 

golang中make 和 new 的区别

2025-07-21 21:41:54
golang中make 和 new 的区别 golang中make 和 new 的区别介绍newnew 是一个内建函数,用于分配一块内存并返回指向该内存的指针。它会为该类型的零值分配内存,并返回指向该类型的指针。代码语言:javascript代码运行次数:0运行复制package main import ( "fmt" ) // 定义一个结构体 type Person s

golang中make 和 new 的区别

golang中make 和 new 的区别

介绍
new
  • new 是一个内建函数,用于分配一块内存并返回指向该内存的指针。
  • 它会为该类型的零值分配内存,并返回指向该类型的指针。
代码语言:javascript代码运行次数:0运行复制
package main

import (
	"fmt"
)

// 定义一个结构体
type Person struct {
	ame 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.ame = "Alice"
	p.Age = 0

	// 输出结构体字段的值
	fmt.Println("ame:", p.ame)
	fmt.Println("Age:", p.Age)
}
  • 运行结果
make
  • make 也是一个内建函数,主要用于创建切片、映射和通道等引用类型的数据结构。
  • make 只能用于切片、映射和通道的创建,不适用于其他类型。
代码语言:javascript代码运行次数:0运行复制
package main

import (
	"fmt"
)

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

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

	// 输出切片的长度和容量
	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代码运行次数:0运行复制
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 {
        ame string
        Age  int
    }
    personPtr := new(Person)
    fmt.Println("personPtr:", personPtr) // 输出:personPtr: &{ 0}

    // 使用 make 创建通道
    ch := make(chan int)
    fmt.Println("channel:", ch) // 输出:channel: 0xc0000180c0
}
  • 运行结果·
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-0-01,如有侵权请联系 cloudcommunity@tencent 删除数据结构intslice内存指针

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1151237.html

相关标签:无
上传时间: 2025-07-20 00:33:11
留言与评论(共有 18 条评论)
本站网友 高鸿
30分钟前 发表
&{ 0} // 使用 make 创建通道 ch
本站网友 佘山艾美酒店
15分钟前 发表
m) // 输出:map
本站网友 吃什么养胃
0秒前 发表
所以 p 不会是 nil if p == nil { fmt.Println("p is nil.") } else { fmt.Println("p is not nil.") } // 访问结构体字段并设置值 p.ame = "Alice" p.Age = 0 // 输出结构体字段的值 fmt.Println("ame
本站网友 dbank数据银行
5分钟前 发表
代码语言:javascript代码运行次数:0运行复制package main import ( "fmt" ) // 定义一个结构体 type Person struct { ame string Age int } func main() { // 使用 new 内建函数创建一个 *Person 类型的指针
本站网友 directx8
2分钟前 发表
"
本站网友 韩国gdp总量
23分钟前 发表
= make([]int
本站网友 瓷砖知识
19分钟前 发表
但返回的是该类型的指针
本站网友 服务器干什么用的
2分钟前 发表
"
本站网友 上海黄金交易所今日金价
17分钟前 发表
1] // 使用 new 创建结构体指针 type Person struct { ame string Age int } personPtr
本站网友 广园路二手房出售
24分钟前 发表
5) fmt.Println("slice
本站网友 山蚂蝗
20分钟前 发表
容量为 5 slice
本站网友 海河英才
17分钟前 发表
长度为
本站网友 江辉
20分钟前 发表
用于分配一块内存并返回指向该内存的指针
本站网友 陈新元
20分钟前 发表
slice) // 输出:slice
本站网友 市长
3分钟前 发表
5) fmt.Println("slice
本站网友 mpp文件怎么打开
30分钟前 发表
代码语言:javascript代码运行次数:0运行复制package main import ( "fmt" ) // 定义一个结构体 type Person struct { ame string Age int } func main() { // 使用 new 内建函数创建一个 *Person 类型的指针
本站网友 中国避暑胜地
17分钟前 发表
代码语言:javascript代码运行次数:0运行复制package main import ( "fmt" ) func main() { // 使用 make 创建一个切片