2021-04-17 淩亂°似流年 2021-07-24 16:46 131阅读 0赞 # 一 切片的使用 # ## 1 方式 1——定义一个切片,然后让切片去引用一个已经创建好的数组。 ## **示例** package main import ( "fmt" ) func main() { // 演示切片的基本使用 var intArr [5]int = [...]int{1, 22, 33, 66, 99} // 声明/定义一个切片 // slice := intArr[1:3] // 1 slice 就是切片名 // 2 intArr[1:3] 表示 slice 引用到 intArr 这个数组 // 3 引用 intArr 数组的起始下标为 1,最后的下标为3(但是不包含3) slice := intArr[1:3] fmt.Println("intArr=", intArr) fmt.Println("slice 的元素是 =", slice) // 22, 33 fmt.Println("slice 的元素个数 =", len(slice)) // 2 fmt.Println("slice 的容量 =", cap(slice)) // 切片的容量是可以动态变化 fmt.Printf("intArr[1]的地址=%p\n", &intArr[1]) fmt.Printf("slice[0]的地址=%p slice[0]==%v\n", &slice[0], slice[0]) slice[1] = 34 fmt.Println() fmt.Println("intArr=", intArr) fmt.Println("slice=", slice) // 22, 34 } ## 2 方式 2——通过 make 来创建切片. ## **a 基本语法** > var 切片名 \[\]type = make(\[\]type, len, \[cap\]) **b 参数说明** > type:数据类型。 > > len:大小 。 > > cap:切片容量,可选,如果指定了 cap, 则要求 cap >= len。 **c 代码** package main import ( "fmt" ) func main() { // 演示切片使用 make var slice []float64 = make([]float64, 5, 10) slice[1] = 10 slice[3] = 20 fmt.Println(slice) fmt.Println("slice的size=", len(slice)) fmt.Println("slice的cap=", cap(slice)) } **d 测试** > \[0 10 0 20 0\] > > slice的size= 5 > > slice的cap= 10 **e 图解** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70][] **f 说明** * 通过 make 方式创建切片可以指定切片的大小和容量。 * 如果没有给切片的各个元素赋值,那么就会使用默认值(int , float 为 0,string 为"" ,bool 为 false)。 * 通过 make 方式创建的切片,对应的数组是由 make 底层维护,对外不可见,即只能通过 slice 去访问各个元素。 ## 3 方式 3——定义一个切片,直接就指定具体数组,使用原理类似 make 的方式。 ## **a 代码** package main import "fmt" func main() { // 定义一个切片,直接就指定具体数组,使用原理类似make的方式 var strSlice []string = []string{"tom", "jack", "mary"} fmt.Println("strSlice=", strSlice) fmt.Println("strSlice size=", len(strSlice)) // 3 fmt.Println("strSlice cap=", cap(strSlice)) // 3 } **b 测试** > strSlice= \[tom jack mary\] > > strSlice size= 3 > > strSlice cap= 3 ## 4 方式 1 和方式 2 的区别 ## 方式1是直接引用数组,这个数组是事先存在的,程序员是可见的。 方式2是通过 make 来创建切片,make也会创建一个数组,是由切片在底层进行维护,程序员不可见。 make 创建切片的示意图。 ![20210417093721764.png][] # 二 切片的遍历 # 切片的遍历和数组一样,也有两种方式。 * for 循环常规方式遍历 * for-range 结构遍历切片 ## 1 代码 ## package main import ( "fmt" ) func main() { // 使用常规的 for 循环遍历切片 var arr [5]int = [...]int{10, 20, 30, 40, 50} slice := arr[1:4] // 20, 30, 40 for i := 0; i < len(slice); i++ { fmt.Printf("slice[%v]=%v ", i, slice[i]) } fmt.Println() // 使用for range 方式遍历切片 for i, v := range slice { fmt.Printf("i=%v v=%v \n", i, v) } } ## 2 测试 ## > slice\[0\]=20 slice\[1\]=30 slice\[2\]=40 > > i=0 v=20 > > i=1 v=30 > > i=2 v=40 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70]: /images/20210724/c6d407377dd04b7b9113e3ffd3437cb1.png [20210417093721764.png]: /images/20210724/4b216fac7a7d4d84a8f52569c77f0100.png
还没有评论,来说两句吧...