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
",index,val)
}
fmt.Println(arr5)
}
注意事项
-
数组是多个相同类型数据的组合, 一个数组一旦声明/ 定义了, 其长度是固定的, 不能动态变化
-
var arr[] int
, arr就是一个slice
切片, 注意没有初始长度 -
Go的数组属于值类型, 在默认情况下是值传递, 因此会进行值拷贝, 数组间不会相互影响,
不同于
Java
和C#
//长度做为数组的一部分, [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 }
-
如果想在其它函数中, 修改原来的数组, 可以使用引用传递(指针)
//使用指针类型 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 }
-
长度是数组类型的一部分, 在传递函数参数是, 需要考虑数组的长度
-
Go中数组的长度必须是一个常量, 不能是变量, 否则就会报
non-constant array bound
func findRepeatNumber(nums []int) int { dict := [len(nums)]int{}//错误, 长度必须是一个常量 return -1 }