我是靠谱客的博主 淡定茉莉,这篇文章主要介绍Go 语言中new与make的区别,现在分享给大家,希望可以做个参考。

前言

在go语言中有这么一个库 builtin 它提供了一些类型、变量和常量的声明。比如any等价于interface{}就是在这里面声明的,我们可以直接使用该库中的方法或者变量而不需要导包。其中我们要介绍的new与make就在这个库中

源代码

复制代码
1
2
3
func make(t Type, size ...IntegerType) Type func new(Type) *Type

从方法中可以看出,都是要传入类型,new是返回该类型的指针,而make则是直接返回该类型本身。下面我们通过代码来观察

测试分析

复制代码
1
2
3
4
5
6
7
8
9
10
11
package main import "fmt" func main() { _new := new([]int) _make := make([]int, 5) fmt.Println(_new) fmt.Println(*_new == nil) fmt.Println(_make) fmt.Println(_make == nil) }

执行结果

复制代码
1
2
3
4
5
6
&[] true [0 0 0 0 0] false Process finished with the exit code 0

可以发现使用new来分配引用类型内存,发现引用类型值为nil,我们知道值为nil时该对象是不可用的,而make不仅分配了内存还给我们初始化了,只不过初始化后的值为零值。

官网对new的描述是返回一个该类型对应的零值的指针。而引用类型的零值就是nil。对make的介绍是可以用于对slice、map、chan的内存分配并初始化

从官网的介绍可以看出对于引用类型的内存分配我们基本上都是使用make,因为new根本毫无意义,返回的是nil最终还是得make才能用。而对于基本类型比如int的零值为0,那么new出来自然是可以用的。但是编码中却是不常用的,通常我们使用简短的语句声明比如 i := 1

总结

总的来看new能不用就不用吧,但是make就没得选择了,对于引用类型不使用make就无法初始化也就不可用。

make的使用如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main import "fmt" func main() { m := make(map[string]any, 5) s := make([]any, 5) c := make(chan any, 5) m["key"] = "value" s[0] = "first" c <- "hello" fmt.Println(m) fmt.Println(s) fmt.Println(<-c) }

执行结果

复制代码
1
2
3
4
5
map[key:value] [first <nil> <nil> <nil> <nil>] hello Process finished with the exit code 0

欢迎关注,学习不迷路!

最后

以上就是淡定茉莉最近收集整理的关于Go 语言中new与make的区别的全部内容,更多相关Go内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部