概述
Go的切片("动态数组") 与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
切片的定义、赋值
func main() {
// 定义
var classSeven []string // 定义切片初始长度为0,不可以使用索引方式添加!只能使用append方法动态添加
// 动态添加元素
classSeven = append(classSeven, "卡卡西")
classSeven = append(classSeven, "鸣人")
classSeven = append(classSeven, "佐助")
classSeven = append(classSeven, "小樱")
}
切片的初始化方式
使用 string{} 方式
func main() {
// 初始化1
var classEight []string = []string{"红", "雏田", "牙", "志乃"}
// 初始化2
classTen := []string{"阿斯玛", "鹿丸", "丁次", "井野"}
}
从数组直接创建
func main() {
kage := [5]string{"千手柱间", "千手扉间", "猿飞日斩", "波风水门", "纲手"}
kageCopy1 := kage[:]
kageCopy2 := kage[0:len(kage)] // [) 左闭右开
}
使用 make 函数
func main() {
threeNinjas := make([]string, 3)
threeNinjas[0] = "大蛇丸"
threeNinjas[1] = "自来也"
threeNinjas[2] = "纲手"
}
访问切片元素
参考 python 切片用法,算是 python 的子集,不能有负数!
func main() {
// 支持
fmt.Println(sliceData[0])
fmt.Println(sliceData[1:4])
fmt.Println(sliceData[2:])
fmt.Println(sliceData[:6])
fmt.Println(sliceData[:])
// 不支持
fmt.Println(sliceData[:-1]) // ❌ index -1 (constant of type int) must not be negative
}
添加切片元素
func main() {
var classSeven []string
classSeven = append(classSeven, "卡卡西")
classSeven = append(classSeven, "鸣人", "佐助", "小樱") // 支持多个值
fmt.Println(classSeven) // [卡卡西 鸣人 佐助 小樱]
// 切片的拼接
classNew := []string{"大和", "鸣人", "小樱", "佐井"}
classLast := []string{"凯", "宁次", "小李", "天天"}
classData := append(classNew[1:], classLast[1:]...) // 三个点代表展开
fmt.Println(classData) // [鸣人 小樱 佐井 宁次 小李 天天]
}
删除切片元素
删除切片其中的元素,虽然操作起来比较麻烦,但也只能这样拼接
func main() {
knife := []string{
"断刀·斩首大刀",
"大刀·鲛肌",
"长刀·缝针",
"钝刀·兜割", // 删除这个
"爆刀·飞沫",
"雷刀·牙",
"双刀·鲆鲽",
}
newKnife := append(knife[:3], knife[4:]...)
fmt.Println(knife) // 原切片: [断刀·斩首大刀 大刀·鲛肌 长刀·缝针 钝刀·兜割 爆刀·飞沫 雷刀·牙 双刀·鲆鲽]
fmt.Println(newKnife) // 删除后: [断刀·斩首大刀 大刀·鲛肌 长刀·缝针 爆刀·飞沫 雷刀·牙 双刀·鲆鲽]
}
切片的深浅拷贝
func main() {
// 拷贝
monsters := []string{"蛤蟆文太", "蛤蟆吉", "蛤蟆龙"}
// 浅拷贝
monstersCopy := monsters[:]
// 深拷贝
var monstersCopyDeep = make([]string, len(monsters))
copy(monstersCopyDeep, monsters)
monsters[1] = "万蛇"
monstersCopy[2] = "蛞蝓"
fmt.Println(monsters) // 原切片: [蛤蟆文太 万蛇 蛞蝓]
fmt.Println(monstersCopy) // 浅拷贝: [蛤蟆文太 万蛇 蛞蝓]
fmt.Println(monstersCopyDeep) // 深拷贝: [蛤蟆文太 蛤蟆吉 蛤蟆龙]
}