跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在Golang中使用指针初始化变量_new和make创建指针示例

new用于分配零值内存并返回指向它的指针,仅支持基本类型、结构体等,不支持slice/map/channel;make仅用于slice/map/channel的初始化,返回值本身而非指针。 在 Go 中,
new
和
make
都用于内存分配,但它们用途不同,且都不能直接“创建指针”——
new
返回指针,
make
返回值本身(仅用于 slice、map、channel),需额外取地址才能获得指针。 new:分配零值内存并返回指向它的指针
new(T)
为类型
T
分配零值内存,返回
*T
。它不调用构造函数(Go 没有构造函数),也不支持 slice/map/channel。
ptr := new(int)
→ 分配一个
int
(值为
0
),返回
*int
ptr := new(string)
→ 分配一个空字符串
""
,返回
*string
ptr := new([3]int)
→ 分配长度为 3 的数组(全 0),返回

make:仅用于引用类型,返回值而非指针

make

只适用于
slice
、
map
、
channel
,返回的是该类型的值(不是指针),但这些类型底层本身就是引用类型(包含指针字段)。
s := make([]int, 5)
→ 返回
[]int
(底层数组已分配,长度 5)
m := make(map[string]int)
→ 返回
map[string]int
(已初始化,可直接使用)
c := make(chan int, 2)
→ 返回
chan int
(带缓冲) 若真需要指向 slice/map/channel 的指针(极少用),需显式取地址:
ptr := &s
,但这通常没必要,因为它们本身已可共享修改。 立即学习 “ 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 更常见、更清晰的方式是用取地址操作符
&
:
i := 42; ptr := &i
→ 明确、高效
s := []int{1,2,3}; ptr := &s
→ 得到
*[]int
(不常用)
m := make(map[string]bool); ptr := &m
→ 得到
*map[string]bool
(一般不需要) 注意:
make
不能和
&
混写成
&make(...)
—— 会编译错误,因为
make
返回的是不可寻址的临时值。 对比总结:什么时候用哪个 要一个指向零值的指针?→ 用
new(T)
(如
new(bytes.Buffer)
) 要初始化 slice/map/channel?→ 必须用
make
(
new
对它们无效) 已有变量想取指针?→ 用
&v
,最直观安全 自定义结构体?→ 推荐字面量 +
&
:
u := &User{Name: "Alice"}
,比
new(User)
更灵活

相关文章