Golang 切片append

强烈建议:go的50度灰

在用Golang切片的时候,
case1.
比如声明:nums := make([]int, 0)
这里给nums append的时候,需要使用 nums = append(nums, 1);

case2.
如果是:nums := make([]int, 10) 进行声明定义,
第一次 可以直接 append(nums, 1) 是没问题的, nums会push进去1;

但是之后的append(nums, 变量) ,nums就不一定真的append进去来。
如果用 nums = append(nums, 变量); 就可以append进去。

原因在于:append可能涉及到扩容操作,针对case1,初始容量是0,append的时候一定会扩容,但是扩容后的切片地址(append的返回)不一定和原来的一样!!
所以,如果不涉及到扩容操作,可以直接使用append(nums, 变量)

但是,一般使用 nums = append(nums, 1); 来确保成功!!!

此外,在一个nil的slice中添加元素是没问题的,但对一个map做同样的事将会生成一个运行时的panic。
正确:

package main
func main() {
    
      
    var s []int
    s = append(s,1) // 正确
}

错误:

package main
func main() {
    
      
    var m map[string]int
    m["one"] = 1 //error
}

多维slice

    table := make([][]int, 2)
    
	table[0] = []int{
    
    1,2,3}//正确
	//table[0][5] = 8 // error 索引溢出
    //table[1][0]=7 panic: runtime error: index out of range [0] with length 0
    table[1] = append(table[1], 4,5,6)//正确
   //table[2] = []int{7,8,9} panic: runtime error: index out of range [2] with length 2
    table = append(table, []int{
    
    7,8,9}) // 正确

综上,slice可以直接append,但是不能直接用索引取不存在的index(性质相同于Java的List: 可以add,但是不能用不存在的index取get() )

猜你喜欢

转载自blog.csdn.net/qq_43778308/article/details/115356740