💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
> 数组是一组同类型数据的集合,数组初始化后长度是固定的,无法修改数组长度; [TOC] ## 数组 ### 数组定义 > 语法: `var 变量名 [数组大小]元素类型` ~~~ // 定义拥有10个元素的数组a,元素类型是int var a [3]int // 定义拥有2个元素的字符串数组 var arr [2]string ~~~ ### 数组变量默认值 > 数组定义后会默认初始化,根据数组元素类型进行复制,比如int为0,string为空字符 ~~~ // 默认初始化为 [0, 0, 0] var arr1 [3]int // 默认初始化为 ["", ""] var arr2 [2]string fmt.Println(arr1, arr2) ~~~ ### 数组初始化 > 可以在定义数组的时候直接初始化数组元素 ~~~ // 数组大小为6, 后面花括号直接初始化6个元素 primes := [6]int{2, 3, 5, 7, 11, 13} ~~~ ### 读写数组元素 > 通过下标引用数组元素,下标从0开始计算,最大不能超过数组长度 ~~~ // 定义字符串数组a,数组大小等于2 var a [2]string // 给数组第一个元素赋值 a[0] = "Hello" // 给数组第二个元素赋值 a[1] = "World" // 打印数组第1和2个元素 fmt.Println(a[0], a[1]) ~~~ ### 获取数组大小 > 可以通过len获取数组大小 ~~~ primes := [6]int{2, 3, 5, 7, 11, 13} // 打印数组大小 fmt.Println(len(primes)) ~~~ ## 切片 ### 切片定义 > 语法1: `var 变量名 []元素类型` > 语法2: `变量名 := make([]type, len)` > 语法2: `变量名 := make([]type, len, capacity)`,len (长度)、capacity(容量) > 切片如果没有初始化,默认值是nil ~~~ var slice1 []int slice2 := make([]int, 3) slice3 := make([]int, 0, 5) // 创建int类型切片,包含0个元素,切片容量为5 if(slice1 == nil){ fmt.Printf("切片是空的") } fmt.Println(slice1, slice2, slice3) ~~~ ### 切片变量默认值 > 没有初始化的切片变量,默认值是nil ~~~ var slice1 []int if slice1 == nil { fmt.Println("is nil") } fmt.Println(slice1) ~~~ ### 切片初始化 ~~~ slice1 := []int {1, 2, 3} arr := [3]string {"111", "222", "333"} slice2 := arr[0:2] ~~~ ### 切片截取 > 可以通过设置下限及上限来设置截取切片 [startIndex:endIndex] ~~~ arr := [3]string {"111", "222", "333"} //arr := []string {"111", "222", "333"} // 从arr【可为数组/或切片】 [切割 startIndex <= 下标范围 < endIndex] 初始化切片slice1 slice1 := arr[startIndex:endIndex] // 从arr【可为数组/或切片】 [切割 startIndex <= 下标范围 < len(arr)] 初始化切片slice1 slice1 := arr[startIndex:] // 从arr【可为数组/或切片】 [切割 0 <= 下标范围 < endIndex] 初始化切片slice1 slice1 := arr[:endIndex] // 忽略开始和结束位置,代表切割所有数据,相当于引用整个数组或切片 slice1 := arr[:] ~~~ ### 切片的大小和容量 > 使用 len() 和 cap() 函数 ~~~ slice1 := []int{2, 3, 5, 7, 11, 13} fmt.Println(len(slice1), cap(slice1)) ~~~ ### 向切片添加元素 ~~~ package main import "fmt" func main() { var slice1 []int // 将1增加到切片尾部 slice1 = append(slice1, 1) // append函数支持一次性添加多个元素 slice1 = append(slice1, 2, 3, 4) fmt.Printf("len=%d cap=%d %v\n", len(slice1), cap(slice1), slice1) } ~~~ ### 读写切片元素 > 需要注意的是,因为切片底层引用的是数组,如果多个切片引用同一个数组,修改其中一个切片的元素,会影响关联的所有切片。 ~~~ package main import "fmt" func main() { names := [4]string{"John", "Paul", "George", "Ringo"} fmt.Println(names) // 创建a,b两个切片 a := names[0:2] b := names[1:3] fmt.Println(a, b) // 修改切片b的第一个元素 b[0] = "XXX" fmt.Println(a, b) fmt.Println(names) } ~~~ > 输出 ~~~ [John Paul George Ringo] [John Paul] [Paul George] [John XXX] [XXX George] [John XXX George Ringo] ~~~ ## 遍历数组或切片 > 通过range关键词结合for语句遍历切片 ~~~ package main import "fmt" // 定义切片或数组 items := []string{"aaa", "bbb", "ccc"} //items := [3]string{"aaa", "bbb", "ccc"} func main() { // index 为切片下标,value 为对应的元素值 for index, value := range items { fmt.Printf("%d = %s\n", index, value) } } ~~~