一、数组 Array
数组是具有唯一相同类型
且固定长度
的一个序列,序列中的元素可以是任意类型如字符串、整型或者是自定义类型,但是类型一定要一致。
数组中的元素可以通过索引来读取或者修改,索引从 0 开始。
数组的初始化方式
// 定义一个数组 // var 数组名 [数组长度/元素个数]元素类型 var arrayName [arrayLen]eleType // 初始化并赋值 var arrayName = [arrayLen]eleType{ele1,ele2,ele3...} // 自动判断数组的长度 var arrayName = [...]eleType{ele1,ele2,ele3...} 复制代码
func main() { var heros = [3]string{"stark", "steve", "thor"} fmt.Printf("%T", heros) var hero_arr = [...]string{"stark", "thor", "steve"} fmt.Printf("%T, %v", hero_arr, len(hero_arr)) } 复制代码
执行上述代码,输出结果如下:
[3]string [3]string, 3 复制代码
数组的长度也是数组类型的一部分,不同长度的数组即使包含的元素一样也不能算作是同一类型。
需要注意的是声明数组时定义的长度或者元素的个数要大于等于在赋值时给的元素的个数,否则会报错。
使用默认值的初始化方式
在定义数组时如果赋值的元素个数小于数组定义的长度,则缺失的元素会使用元素数据类型的默认值填充。
func main() { var nums = [5]int{1, 3} fmt.Printf("%T, %v", nums, nums) } 复制代码
执行上述代码,输出结果如下:
[5]int, [1 3 0 0 0] 复制代码
如果元素类型为 string,则默认值为空字符串。
通过索引操作数组元素
数组的操作包括读取和修改,都可以通过索引来完成
func main() { var hero_arr = [...]string{"stark", "thor", "steve"} fmt.Printf("%T, %v\n", hero_arr, len(hero_arr)) hero_arr[0] = "tony stark" fmt.Println(hero_arr) thuner := hero_arr[1] fmt.Println(thuner) } 复制代码
执行上述代码,输出结果如下:
[3]string, 3 [tony stark thor steve] thor 复制代码
数组的遍历
数组的遍历有两种方式,一种是通过 for ... i
方式遍历,另一种是通过 for ... range
方式遍历。
func main() { var nums = [...]int{11, 22, 33} // 数组长度的获取使用 len() 函数 // for 遍历 fmt.Println("for 遍历:") for i := 0; i < len(nums); i++ { fmt.Printf("索引:%v, 对应值为:%v\n", i, nums[i]) } // for range 遍历 fmt.Println("for range 遍历:") for idx, item := range nums { fmt.Printf("索引:%v, 对应值为:%v\n", idx, item) } } 复制代码
执行上述代码,输出结果如下:
for 遍历: 索引:0, 对应值为:11 索引:1, 对应值为:22 索引:2, 对应值为:33 for range 遍历: 索引:0, 对应值为:11 索引:1, 对应值为:22 索引:2, 对应值为:33 复制代码
二、数组是值类型
Go 中的数据类型还可以分为值类型和引用类型,Go 中的基本数据类型包括数组都是值类型。
定义一个函数 ArrayHandler,该函数需要一个固定长度的数组作为参数,函数体会对传入的数组进行修改并打印出修改前后的值。
func main() { codes := [3]string{"zulu", "yankee", "xray"} ArrayHandler(codes) fmt.Println(codes) } func ArrayHandler(arr [3]string) { fmt.Println("修改前:", arr) // for idx, item := range arr { // 将每个元素字母改为大写 arr[idx] = strings.ToTitle(item) } fmt.Println("修改后:", arr) } 复制代码
执行上述代码,输出结果如下:
修改前: [zulu yankee xray] 修改后: [ZULU YANKEE XRAY] [zulu yankee xray] 复制代码
Go 中的数组是值传递,作为参数传递时时会重新拷贝一个副本,所有的修改操作都是在副本上进行的,对原数据无任何影响。
其他语言如 Python ,Java 中的数组使用的是引用传递。