一、数组和切片的初始化
1 var []int 格式
func main() {var t1 []intt1 = append(t1, 1)fmt.Println(t1) //正常输出 1var t11 []intt11[0] = 11 //panic: runtime error: index out of range [0] with length 0fmt.Println(t11)var t12 [1]intt12[0] = 12fmt.Println(t12) //正常输出 12var t13 [0]intt13[0] = 13 //编译报错 Invalid array index '0' (out of bounds for the 0-element array)fmt.Println(t33)
}
注意:没有 t12.append()方法
2 make([]int) 格式
func main() {t2 := make([]int, 0)t2 = append(t2, 2)fmt.Println(t2) //正常输出 2t21 := make([]int, 0)t21[0] = 21 //panic: runtime error: index out of range [0] with length 0fmt.Println(t21)t22 := make([]int, 1)t22[0] = 22fmt.Println(t22) //正常输出 22t22=append(t22, 1)fmt.Println(t22) //正常输出 [22 ,1]t23 := make([]int, 0, 0)t23 = append(t23, 23)t23[0] = 1fmt.Println(t23) //正常输出 1t23[1] = 2 //panic: runtime error: index out of range [1] with length 1fmt.Println(t23)
}
注意:有 t22.append()方法
3 []int{} 格式
func main(){t3 := []int{}t3 = append(t3, 3)fmt.Println(t3) //正常输出 3t31 := []int{}t31[0] = 31 //panic: runtime error: index out of range [0] with length 0fmt.Println(t31)t32 := [1]int{}t32[0] = 32fmt.Println(t32) //正常输出 32t33 := [0]int{}t33[0] = 33 //编译报错 Invalid array index '0' (out of bounds for the 0-element array)fmt.Println(t33)}
注意:没有 t32.append()方法
4 new([]int)
func main(){t4 := new([]int)(*t4) = append((*t4), 4)fmt.Println(*t4) //正常输出 4t41 := new([]int) //返回的内存地址(*t41)[0] = 41 //panic: runtime error: index out of range [0] with length 0fmt.Println(*t41)t42 := new([1]int) //返回的内存地址(*t42)[0] = 42fmt.Println(*t42) //正常输出 42t43 := new([0]int) (*t43)[0] = 43 //编译报错 Invalid array index '0' (out of bounds for the 0-element array)fmt.Println(*t43)
}
注意:没有 t42.append()方法
5 场景分析
从上面的情况可以总结一下几点:
(1) var t1 []int , t2 := make([]int, 0) , t3 := []int{} , t4 := new([]int):
都有appeng方法,且 t = appeng(t,1) 可以正常插入数据;
t[0]=1 都插入数据失败,报 panic: runtime error: index out of range [0] with length
(2) var t12 [0]int, t22 := make([]int, 0,0),t32 := [0]int{}, t42 := new([0]int):
只有make([]int, 0,0) 有append方法,t=append(t,1)可以成功插入数据,
也是只有且只有make([]int, 0,0) 有t[0]=1, 且在append扩出来的空间内进行t[i]=3的赋值操作,超过会报panic;
(3) var t12 [1]int, t22 := make([]int, 1),t32 := [1]int{}, t42 := new([1]int):
只有 t22 := make([]int, 1)有append方法t = appeng(t,1)可以正常插入数据
t[0]=1 都插入数据成功
6 总结
初始化数组为nil,可以append插入数据,不能用下标t[i]=1插入数据;
初始化数值长度为0,没有append方法,t[0]=1也会在编译时报错;
初始化数组长度>0,没有append方法,用下标t[i]=1的方法可以正常插入数据;
初始化一个长度为0容量为nil的切片即make([]int, 0) ,t = appeng(t,1)可以正常插入数据;
初始化一个长度为0容量为nil的切片即make([]int, 0,0),t = appeng(t,1)可以正常插入数据;
初始化一个长度为1容量为nil的切片即make([]int, 1),t = appeng(t,1)可以正常插入数据;
7 基本规则
初始化的数组和切片,只有长度>0,且在数组和切片长度范围内可以用下标的方式赋值;
在数组长度已经确定的情况下即数组长度>=0,数组没有append()方法,需要用下标去插入数据;
切片可以比较灵活的用append方法去插入数据,但是用下标插入数据要遵循第一条规则。
二、Map的初始化
1 make(map[string]int)
func main(){var m1 = make(map[string]int)m1["a1"] = 1fmt.Println(m1) //输出 map[a1:1]
}
2 var map [string]int
func main(){var m2 map[string]intm2["a2"] = 2 //panic: assignment to entry in nil mapfmt.Println(m2)
}
认准 make(map[string]int)的用法去初始化map即可;