new用于分配零值内存并返回指向它的指针,仅支持基本类型、结构体等,不支持slice/map/channel;make仅用于slice/map/channel的初始化,返回值本身而非指针。
在 Go 中,
和
都用于内存分配,但它们用途不同,且都不能直接“创建指针”——
返回指针,
返回值本身(仅用于 slice、map、channel),需额外取地址才能获得指针。
new:分配零值内存并返回指向它的指针
为类型
分配零值内存,返回
。它不调用构造函数(Go 没有构造函数),也不支持 slice/map/channel。
→ 分配一个
(值为
),返回
→ 分配一个空字符串
,返回
→ 分配长度为 3 的数组(全 0),返回
只适用于
、
、
,返回的是该类型的值(不是指针),但这些类型底层本身就是引用类型(包含指针字段)。
→ 返回
(底层数组已分配,长度 5)
→ 返回
(已初始化,可直接使用)
→ 返回
(带缓冲)
若真需要指向 slice/map/channel 的指针(极少用),需显式取地址:
,但这通常没必要,因为它们本身已可共享修改。
立即学习
“
go语言免费学习笔记(深入)
”;
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
如何正确获得指针:结合字面量或 new
更常见、更清晰的方式是用取地址操作符
:
→ 明确、高效
→ 得到
(不常用)
→ 得到
(一般不需要)
注意:
不能和
混写成
—— 会编译错误,因为
返回的是不可寻址的临时值。
对比总结:什么时候用哪个
要一个指向零值的指针?→ 用
(如
)
要初始化 slice/map/channel?→ 必须用
(
对它们无效)
已有变量想取指针?→ 用
,最直观安全
自定义结构体?→ 推荐字面量 +
:
,比
更灵活
newmakenewmakenew(T)T*Tptr := new(int)int0*intptr := new(string)""*stringptr := new([3]int)
make:仅用于引用类型,返回值而非指针
make
slicemapchannels := make([]int, 5)[]intm := make(map[string]int)map[string]intc := make(chan int, 2)chan intptr := &s&i := 42; ptr := &is := []int{1,2,3}; ptr := &s*[]intm := make(map[string]bool); ptr := &m*map[string]boolmake&&make(...)makenew(T)new(bytes.Buffer)makenew&v&u := &User{Name: "Alice"}new(User)