网站建设按钮,详情页设计图,上海人才教育网官网,wordpress导航栏编辑Go中new和make的区别
变量声明
当我们声明变量时可以使用var关键字#xff0c;当不指定变量的默认值时#xff0c;这些变量的默认值就是他们的零值#xff0c;比如int的默认值为0#xff0c;string的默认值为#xff0c;引用类型的零值为nil。
但是当我们在…Go中new和make的区别
变量声明
当我们声明变量时可以使用var关键字当不指定变量的默认值时这些变量的默认值就是他们的零值比如int的默认值为0string的默认值为引用类型的零值为nil。
但是当我们在声明引用类型的变量并直接使用时会panic。
package mainimport fmtfunc main() {var i *int*i 10fmt.Println(*i)
}//output: panic: runtime error: invalid memory address or nil pointer dereference所以对于引用型变量时除了要声明它以外还要为其分配空间。要分配内存就需要使用make或者new。
new
上面的问题使用new我们可以这样解决
package mainimport fmtfunc main() {var i *inti new(int)*i 10fmt.Println(*i)
}
//output: 10对于new这个内置函数
// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type它只接受一个类型参数内存分配完毕之后会返回一个指向该内存的同类型的指针同时将该内存的值改为该类型的零值。
再看一个例子
package mainimport (fmtsync
)type user struct {lock sync.Mutexname stringage int
}func main() {u : new(user)u.lock.Lock()u.name demou.lock.Unlock()fmt.Println(u)
}在这个例子中可以看到使用new的好处在user中lock不需要自行的去初始化new之后可以直接使用。
make
make也是用于内存分配但是和new不同的是它只用于chan、map以及切片的内存创建而且它返回的类型就是这三个类型本身而不是它们的指针类型因为这三种类型就是引用类型所以没有必要返回它们的指针。
func make(t Type, size ...IntegerType) Type异同
二者都是在堆上进行内存分配但make只用于slice、map、channel的初始化make返回的还是这三个引用类型本身而new返回的是指向类型的指针
为什么既有make又有new? rujews使用make的好处是可以指定len和capmake(type,len,cap)合适的len和cap可以提升性能。 YahuiAn在使用make()函数创建切片时如果我们能够预计出合理的容量大小太大浪费内存空间太小会不断的扩容哪么我们在进行切片的append时可能不会发生扩容也就避免了切片元素的复制减少了开销。