- Golang中new和make的区别?
- 复杂结构的类型如何正确初始化
new()
vs make()
需要区分在Golang中声明
、初始化
的区别?
1 | var a []int // 声明,未初始化,此时为nil slice |
new()
The built-in function new takes a type T, allocates storage for a variable of that type at run time, and returns a value of type *T pointing to it.The variable is initialized as described in the section on initial values.
new()
是内存分配的内置函数,传入类型T
,则在运行时分配内存,返回*T
类型的值(指向新分配内存地址的指针)。
变量将按照类型对应的零值
来进行初始化,如map/slice零值均为nil。
make()
The built-in function make takes a type T, which must be a slice, map or channel type, optionally followed by a type-specific list of expressions. It returns a value of type T (not *T). The memory is initialized as described in the section on initial values.
内置函数make()
仅支持特定类型参数(slice/map/channel),返回类型为T的变量值(注意:new返回*T类型值,make返回T类型值)。变量初始化和new
保持一致的策略,均按零值处理。
- slice
- map
- channel
- 或者上述类型,再加其他参数
1 | Call Type T Result |
复杂结构体的初始化
1 | type Foo struct { |
对于上面Foo
类型的复合结构,初始化时要注意下,直接new Foo()
的对象中map是没有分配空间的,也就是nil map
,此时不能直接使用。
下面的代码,会抛出panic:panic: assignment to entry in nil map
1 | h1 := &Foo{} |
正确的用法:定义类型对应的NewTypeName()
方法专门用于类型初始化
1 | func NewFoo() *Foo { |
结论
make
仅用于map
、slice
、channel
new
可用于类型T的内存分配,类型各字段初始值为类型对应零值- 复合类型,多通用
NewTypeName()
自定义函数,返回新建类型变量,而类型内字段在此方法内进行有效的内存分配操作。(如map应通过make开辟空间)