一、切片
package main
import "fmt"
// 切片 (slice)
func main(){
var a0 []string
var a1 []int
var a2 = []bool{false, true}
fmt.Println(a0)
fmt.Println(a1)
fmt.Println(a2)
// 基于数组得到切片
a := [5]int{55, 56, 57, 58, 59}
b := a[1:4]
fmt.Println(b)
fmt.Printf("%T\n", b)
// 切片再次切片
c := b[1:len(b)]
fmt.Println(c)
fmt.Printf("%T\n", c)
// make函数构造切片
d := make([]int, 5, 10) // 切片类型 切片长度 切片容量(可省略)
fmt.Println(d)
fmt.Printf("%T\n", d)
// 通过len()函数获取切片的长度
fmt.Println(len(d))
// 通过cap()函数获取切片的容量
fmt.Println(cap(d))
// nil 判断切片是否为空 len(a) == 0
var e []int // 声明int类型切片
var f = []int{} // 声明并且初始化
g := make([]int, 0)
fmt.Println(e, len(e), cap(e))
if e == nil {
fmt.Println("e==nil")
}
fmt.Println(f, len(f), cap(f))
if f == nil {
fmt.Println("f==nil")
}
fmt.Println(g, len(g), cap(g))
if g == nil {
fmt.Println("g==nil")
}
}
二、切片的赋值拷贝
package main
import "fmt"
func main(){
// 切片的赋值拷贝
a := make([]int, 3) // [0, 0, 0]
b := a // a与b共用底层数组
b[0] = 100
fmt.Println(a) // [100, 0, 0]
fmt.Println(b) // [100, 0, 0]
}
三、切片的遍历
package main
import "fmt"
func main(){
// 切片的遍历
a := []int{1, 2, 3, 4, 5}
for i:=0; i<len(a); i++{
fmt.Println(i, a[i])
}
fmt.Println()
for index, value := range a{
fmt.Println(index, value)
}
}
四、切片的扩容、copy与删除
package main
import "fmt"
func main(){
// 切片的扩容
var a []int // 此时它并没有申请内存
for i:=0; i<10; i++{
a = append(a, i)
//fmt.Printf("%v len:%d cap:%d ptr:%p\n", a, len(a), cap(a), a)
}
a = append(a, 20, 21, 22, 23, 24)
fmt.Println(a)
b := []int{12, 13, 14, 15}
a = append(a, b...)
fmt.Println(a)
// 切片的copy
c := []int{1, 2, 3, 4, 5}
d := make([]int, 5, 5)
e := c
copy(d, c)
c[0] = 100
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
// 切片删除元素
f := []string{"北京", "上海", "广州", "深圳"}
f = append(f[0:2], f[3:]...)
fmt.Println(f)
// append(a[:index], a[index+1:]...)
}
作业:使用内置sort包队数组进行排序
package main
import (
"fmt"
"sort"
)
func main(){
// 使用内置的sort包对数组var a = [...]int{3, 7, 8, 9, 1}进行排序
var a = [...]int{3, 7, 8, 9, 1}
// a[:]得到的是一个切片 指向了底层的数组a
sort.Ints(a[:])
fmt.Println(a)
}