一、切片是长度可变的数组,切片由三部分组成
1、指针,指向切片第一个元素指向的数组元素的地址
2、长度,切片元素的数量
3、容量,切片开始到结束位置元素的数量
二、声明
切片声明需要指定组成元素的类型
但不需要指定存储元素的数量(长度)
在切片声明后,会被初始化为nil,表示暂不存在的切片
// []string, true, []
var names []string
fmt.Printf("%T, %t, %v\n", names, names == nil, names)
package main
import "fmt"
func main() {
var name []int
// []int
fmt.Printf("%T\n", name)
// true
fmt.Println(name == nil)
// 字面量
var num []int
num = []int{1, 2, 3}
// []int{1, 2, 3}
fmt.Printf("%#v\n", num)
num = []int{1, 2, 3, 4}
// []int{1, 2, 3, 4}
fmt.Printf("%#v\n", num)
// []string, true, []
var names []string
fmt.Printf("%T, %t, %v\n", names, names == nil, names)
// make函数
num = make([]int, 3)
// []int{0, 0, 0} 3 3
fmt.Printf("%#v %d %d\n", num, len(num), cap(num))
// 容量肯定是大于等于长度的
num = make([]int, 3, 5)
// []int{0, 0, 0} 3 5,长度是3表示已经存储了3个数据了
fmt.Printf("%#v %d %d\n", num, len(num), cap(num))
// 元素操作#查
fmt.Println(num[0])
fmt.Println(num[1])
fmt.Println(num[2])
// 元素操作#改
num[2] = 10
fmt.Println(num[2])
// 元素操作#增
num = append(num, 1)
fmt.Printf("%#v %d %d\n", num, len(num), cap(num))
num = append(num, 2)
fmt.Printf("%#v %d %d\n", num, len(num), cap(num))
num = append(num, 3)
fmt.Printf("%#v %d %d\n", num, len(num), cap(num))
// 元素操作#遍历
for i := 0; i < len(num); i++ {
fmt.Println(i, num[i])
}
for index, value := range num {
fmt.Println(index, value)
}
// 切片操作之得到一个新的切片
fmt.Println(num[1:5])
fmt.Printf("%T\n", num[1:5])
nums := make([]int, 3, 10)
n := nums[1:3:10]
//cap= n's cap - n's start
fmt.Printf("%T %#v %d %d\n", n, n, len(n), cap(n))
n = nums[2:3]
// n's cap = nums_cap - start
fmt.Printf("%T %#v %d %d\n", n, n, len(n), cap(n))
}