一、数组和切片的初始化
1 var []int 格式
func main() {
var t1 []int
t1 = append(t1, 1)
fmt.Println(t1) //正常输出 1
var t11 []int
t11[0] = 11 //panic: runtime error: index out of range [0] with length 0
fmt.Println(t11)
var t12 [1]int
t12[0] = 12
fmt.Println(t12) //正常输出 12
var t13 [0]int
t13[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) //正常输出 2
t21 := make([]int, 0)
t21[0] = 21 //panic: runtime error: index out of range [0] with length 0
fmt.Println(t21)
t22 := make([]int, 1)
t22[0] = 22
fmt.Println(t22) //正常输出 22
t22=append(t22, 1)
fmt.Println(t22) //正常输出 [22 ,1]
t23 := make([]int, 0, 0)
t23 = append(t23, 23)
t23[0] = 1
fmt.Println(t23) //正常输出 1
t23[1] = 2 //panic: runtime error: index out of range [1] with length 1
fmt.Println(t23)
}
注意:有 t22.append()方法
3 []int{} 格式
func main(){
t3 := []int{}
t3 = append(t3, 3)
fmt.Println(t3) //正常输出 3
t31 := []int{}
t31[0] = 31 //panic: runtime error: index out of range [0] with length 0
fmt.Println(t31)
t32 := [1]int{}
t32[0] = 32
fmt.Println(t32) //正常输出 32
t33 := [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) //正常输出 4
t41 := new([]int) //返回的内存地址
(*t41)[0] = 41 //panic: runtime error: index out of range [0] with length 0
fmt.Println(*t41)
t42 := new([1]int) //返回的内存地址
(*t42)[0] = 42
fmt.Println(*t42) //正常输出 42
t43 := 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"] = 1
fmt.Println(m1) //输出 map[a1:1]
}
2 var map [string]int
func main(){
var m2 map[string]int
m2["a2"] = 2 //panic: assignment to entry in nil map
fmt.Println(m2)
}
认准 make(map[string]int)的用法去初始化map即可;
标签:int,make,Golang,var,Println,fmt,append From: https://blog.csdn.net/Runing_WoNiu/article/details/143418276