Golang 数组

Golang 数组

数组的四种初始化

func main() {
	var arr1 [3]int 
	fmt.Println(arr1)
    
	//int[] arr = new int[3]{1,3,4}; Java中报错
    var arr2 = [3]int{1, 2, 4}// var arr2 [3]int = [3]int{}
	fmt.Println(arr2)
    
	//形如Java int[] arr = new int[]{1,2,3,4}
	var arr3 = [...]int{1, 2, 3, 4}//var arr3 [...]int = [...]int{}错误
	fmt.Println(arr3)
    
	//类似于Js中的伪数组形式, 默认按照数组下标填充
	var arr4 = [...]int{1: 100, 0: 200, 2: 300}//200,100,300
	fmt.Println(arr4)
    
	arr5 := [...]string{1: "tom", 0: "Jack"}
	fmt.Println(arr5)
}

for - range

func main() {
	arr5 := [...]string{1: "tom", 0: "Jack",2:"Jessie",3:"Lucy"}
	//和Js中的forEach方法相似,可以同时获取到下标和值
	for idx, val := range arr5 {
		fmt.Printf("index = %d, val = %s \n",index,val)
	}
	fmt.Println(arr5)
}

注意事项

  1. 数组是多个相同类型数据的组合, 一个数组一旦声明/ 定义了, 其长度是固定的, 不能动态变化

  2. var arr[] int , arr就是一个slice切片, 注意没有初始长度

  3. Go的数组属于值类型, 在默认情况下是值传递, 因此会进行值拷贝, 数组间不会相互影响,

    不同于JavaC#

    //长度做为数组的一部分, [3]int != [4]int
    func method(arr [4]int) {
       for idx, _ := range arr {
          arr[idx] *= 10
       }
    }
    func main() {
       arr := [...]int{1, 2, 3, 4}
       fmt.Println(arr) // 1,2,3,4
       method(arr)
       fmt.Println(arr) // 1,2,3,4
    }
    
  4. 如果想在其它函数中, 修改原来的数组, 可以使用引用传递(指针)

    //使用指针类型
    func method(arr *[4]int) {
    	arr[0] = 10
    }
    func main() {
    	arr := [...]int{1, 2, 3, 4}
    	fmt.Println(arr) // 1,2,3,4
    	method(&arr)
    	fmt.Println(arr) // 10,2,3,4
    }
    
    
  5. 长度是数组类型的一部分, 在传递函数参数是, 需要考虑数组的长度

  6. Go中数组的长度必须是一个常量, 不能是变量, 否则就会报 non-constant array bound

    func findRepeatNumber(nums []int) int {
    	dict := [len(nums)]int{}//错误, 长度必须是一个常量
    	return -1
    }
    
posted @ 2020-08-10 22:28  CyberPelican  阅读(298)  评论(0编辑  收藏  举报