下面这段代码能否通过编译,不能的话原因是什么;如果通过,输出什么。
func main() { list := new([]int) list = append(list, 1) fmt.Println(list) }
不能通过编译,new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。可以使用 make() 初始化之后再用。同样的,map 和 channel 建议使用 make() 或字面量的方式初始化,不要用 new() 。
*[]int
list := new([]int) *list = append(*list, 1) fmt.Println(*list)
不能通过,new 产生的是指针类型,append要的是值类型
append函数的定义如下,不能接收指针类型。
func append(slice []Type, elems ...Type) []Type
ok
打卡
list := make([]int,0)
1
mark
mk
啊
new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。
为什么连着看到*slice的场景? 说实话,当引用func append(slice []Type, elems ...Type) []Type做论据的时候已经输了,因为在builtin里找到的(包括unsafe)都是文档性质的,只是告诉人们是什么和怎么用。它又不是一个真实的函数,既不符合签名规范,也找不到调用栈。 所以这个问题,需要从语义而不是语法的角度分析为什么不允许。 顺便说一下,issues包括proposals里有很多案例,官方团队没有接受并不是说不正确或不能实现,反而是添加到语言规范或者标准库会引入更多的inconsistency。
不能通过编译,new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。
list := new([]int) 出来的是一个指针,list = append(list, 1) 加号就可以
m
过
append只接受[]slice,不接受指针类型的!
make
发现重复了
oh
new只分配内存,并返回指向该类型零值的指针; make用于切片、映射和通道的初始化,并返回该引用类型的非零值。 不能对指针使用append操作,可以使用make初始化之后再用
不能通过编译,new([]int)之后的list是一个*[]int类型的指针,不能对指针执行append操作,可以使用make()初始化之后再用,同样的,map和channel建议使用make()或字面量的方式初始化,不要用new()
`单行代码`
不能通过,new 产生的是指针类型,append要的是值类型
append函数的定义如下,不能接收指针类型。
func append(slice []Type, elems ...Type) []Type
ok
打卡
list := make([]int,0)
打卡
1
mark
mark
mark
mk
啊
new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。
mark
1
mark
为什么连着看到*slice的场景? 说实话,当引用
func append(slice []Type, elems ...Type) []Type
做论据的时候已经输了,因为在builtin里找到的(包括unsafe)都是文档性质的,只是告诉人们是什么和怎么用。它又不是一个真实的函数,既不符合签名规范,也找不到调用栈。 所以这个问题,需要从语义而不是语法的角度分析为什么不允许。 顺便说一下,issues包括proposals里有很多案例,官方团队没有接受并不是说不正确或不能实现,反而是添加到语言规范或者标准库会引入更多的inconsistency。不能通过编译,new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。
list := new([]int) 出来的是一个指针,list = append(list, 1) 加号就可以
mk
m
mark
mark
过
append只接受[]slice,不接受指针类型的!
make
make
mark
new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。
打卡
mark
发现重复了
mark
mark
mark
func main() { list := new([]int) list = append(list, 1) fmt.Println(list) }
mk
oh
mark
new只分配内存,并返回指向该类型零值的指针; make用于切片、映射和通道的初始化,并返回该引用类型的非零值。 不能对指针使用append操作,可以使用make初始化之后再用
mark
不能通过编译,new([]int)之后的list是一个*[]int类型的指针,不能对指针执行append操作,可以使用make()初始化之后再用,同样的,map和channel建议使用make()或字面量的方式初始化,不要用new()