golang中make 和 new 的区别
golang中make 和 new 的区别
golang中make 和 new 的区别介绍newnew 是一个内建函数,用于分配一块内存并返回指向该内存的指针。它会为该类型的零值分配内存,并返回指向该类型的指针。代码语言:javascript代码运行次数:0运行复制package main
import (
"fmt"
)
// 定义一个结构体
type Person s
golang中make 和 new 的区别
介绍
new
new
是一个内建函数,用于分配一块内存并返回指向该内存的指针。- 它会为该类型的零值分配内存,并返回指向该类型的指针。
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
只能用于切片、映射和通道的创建,不适用于其他类型。
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)
}
- 运行结果
区别
- 适用类型:
new
适用于任何类型,但返回的是该类型的指针。make
仅适用于切片、映射和通道的创建,返回的是对应引用类型的实例。
- 返回类型:
new
返回的是指向类型的指针。make
返回的是对应引用类型的实例,而不是指针。
- 初始化:
new
分配的内存会被清零,返回的是该类型的零值的指针。make
返回的是被初始化过的引用类型的实例,如切片、映射和通道等。
代码示例
下面是用 Go 语言演示 make
和 new
的区别的代码:
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
}
- 运行结果·
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 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 创建一个切片 |