Open
Description
- 下面两段代码的输出是什么
// 1.
func main() {
s := make([]int, 5)
s = append(s, 1, 2, 3)
fmt.Println(s)
}
// 2.
func main() {
s := make([]int, 0)
s = append(s,1,2,3,4)
fmt.Println(s)
}
输出:
[0 0 0 0 0 1 2 3]
[1 2 3 4]
new()
与make()
的区别
new(T)
和 make(T, args)
是 Go
语言内建函数,用来分配内存,但适用的类型不同。
new(T)
会为 T
类型的新值分配已置零的内存空间,并返回地址(指针),即类型为 *T
的值。换句话说就是,返回一个指针,该指针指向新分配类型为 T
的零值。适用于值类型,如数组、结构体等。
make(T, args)
返回初始化之后的 T
类型的值,这个值并不是 T
类型的零值,也不是指针 *T
,是经过初始化之后的 T
的引用。make()
只适用于 slice
、map
和 channel
。
- 判断下面代码能否通过编译
func main() {
list := new([]int)
list = append(list, 1)
fmt.Println(list)
}
结果:不能通过编译。
解析:new([]int)
返回一个*[]int
类型的指针,不能进行append
的操作。正确的方式是使用make()
或者字面量进行初始化。