一 切片的使用
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 图解
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 创建切片的示意图。
二 切片的遍历
切片的遍历和数组一样,也有两种方式。
-
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