Golang new() make var []int 使用的具体区别

一、数组和切片的初始化

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即可;

猜你喜欢

转载自blog.csdn.net/Runing_WoNiu/article/details/143418276