len()和cap()函数
package main
import "fmt"
func main() {
var num = make([]int, 2, 3)
printSlice(num)
}
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x) // 2, 3, [0 0]
}
结果:
// len = 2, cap = 3, num = [0 0]
空切片
一个切片在未初始化之前默认为nil,长度为0
package main
import "fmt"
func main() {
var num []int
printSlice(num)
if(num == nil) {
fmt.Printf("空切片")
}
}
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
结果:
// len = 0, cap = 0, num = [], 空切片
demo2
package main
import "fmt"
func main() {
// 创建切片
num := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
printSlice(num)
// 打印原始切片
fmt.Println("num =", num)
// 打印字切片从索引1(包含)到索引4(不包含)
fmt.Println("num[1:4]=", num[1:4])
// 默认下限为0
fmt.Println("num[:3]=", num[:3])
// 默认上限为 len(s)
fmt.Println("num[4:]=", num[4:])
num1 := make([]int, 0, 5)
printSlice(num1)
// 打印子切片从索引 0(包含) 到索引 2(不包含)
num2 := num[:2]
printSlice(num2)
// 打印子切片从索引 2(包含) 到索引 5(不包含)
num3 := num[2:5]
printSlice(num3)
}
// 打印函数
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
结果:

append() 和 copy() 函数
append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数
append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。 但当slice中没有剩 余空间(即(cap-len) == 0)时,此时将动态分配新的数组空间。返回的slice数组指针将指向这个空间,而原 数组的内容将保持不变;其它引用此数组的slice则不受影响
下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* 允许追加空切片 */ numbers = append(numbers, 0)
printSlice(numbers)
/* 向切片添加一个元素 */ numbers = append(numbers, 1)
printSlice(numbers)
/* 同时添加多个元素 */ numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* 创建切片 numbers1 是之前切片的两倍容量*/ numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* 拷贝 numbers 的内容到 numbers1 */ copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
结果:

注意:numbers1与numbers两者不存在联系,numbers发生变化时,numbers1是不会随着变化的。也就是说copy方法是不会建立两个切片的联系的
最后
刚学golang,希望大家监督并且一起努力
有兴趣的小伙伴,欢迎关注我订阅号:EntrepreneurialG