切片的声明|创建
代码
package mainimport ("io""log""os")// 切片定义声明func main() {log.SetOutput(io.MultiWriter(os.Stdout))log.SetFlags(log.Lshortfile)//声明 slice1 是一个切片,并且初始化,默认值是1, 2, 3。长度len是3slice1 := []int{1, 2, 3}// 声明 slice2 是一个切片,但是并没有给slice分配空间var slice2 []intslice2 = make([]int, 5) //开辟5个空间,默认值是0//声明 slice3 是一个切片,同时给 slice3 分配空间,6个空间,初始化值是0var slice3 []int = make([]int, 6)//声明 slice4 是一个切片,同时给 slice 分配空间,8个空间,初始化值是0,通过 := 推导出 slice5 是一个切片slice4 := make([]int, 8)log.Printf("len = %d, slice = %v, type= %T\n", len(slice1), slice1, slice1)log.Printf("len = %d, slice = %v, type= %T\n", len(slice2), slice2, slice2)log.Printf("len = %d, slice = %v, type= %T\n", len(slice3), slice3, slice3)log.Printf("len = %d, slice = %v, type= %T\n", len(slice4), slice4, slice4)// // 循环遍历数组// for _, vaule := range dynamicArray1 {// log.Println("value = ", vaule)// }}
输出
main.go:28: len = 3, slice = [1 2 3], type= []intmain.go:29: len = 5, slice = [0 0 0 0 0], type= []intmain.go:30: len = 6, slice = [0 0 0 0 0 0], type= []intmain.go:31: len = 8, slice = [0 0 0 0 0 0 0 0], type= []int
切片中的 make
// 切片与make import ( “io” “log” “os” )
func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile)
v1 := make([]int, 3, 4) //超出容量时 以make时的德第二个参数 5 来开辟空间v2 := make([]int, 3) //超出容量时 以make时的倍数开辟空间, 也就是 3log.Printf("len=%d, cap=%d, slice=%v\n", len(v1), cap(v1), v1)v1 = append(v1, 1)log.Printf("len=%d, cap=%d, slice=%v\n", len(v1), cap(v1), v1)v1 = append(v1, 2)log.Printf("len=%d, cap=%d, slice=%v\n", len(v1), cap(v1), v1)v2 = append(v2, 100)log.Printf("len=%d, cap=%d, slice=%v\n", len(v2), cap(v2), v2)
}
<a name="cssIs"></a>### 输出```gomain.go:17: len=3, cap=4, slice=[0 0 0]main.go:19: len=4, cap=4, slice=[0 0 0 1]main.go:22: len=5, cap=8, slice=[0 0 0 1 2]main.go:25: len=4, cap=6, slice=[0 0 0 100]
切片的截取
代码
package mainimport ("io""log""os")func main() {log.SetOutput(io.MultiWriter(os.Stdout))log.SetFlags(log.Lshortfile)/* 创建切片 */numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}printSlice(numbers)/* 打印原始切片 */log.Println("numbers ==", numbers)/* 打印子切片从索引1(包含) 到索引4(不包含)*/log.Println("numbers[1:4] ==", numbers[1:4])/* 默认下限为 0*/log.Println("numbers[:3] ==", numbers[:3])/* 默认上限为 len(s)*/log.Println("numbers[4:] ==", numbers[4:])numbers1 := make([]int, 0, 5)printSlice(numbers1)/* 打印子切片从索引 0(包含) 到索引 2(不包含) */number2 := numbers[:2]printSlice(number2)/* 打印子切片从索引 2(包含) 到索引 5(不包含) */number3 := numbers[2:5]printSlice(number3)}func printSlice(x []int) {log.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)}
输出
main.go:43: len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]main.go:18: numbers == [0 1 2 3 4 5 6 7 8]main.go:21: numbers[1:4] == [1 2 3]main.go:24: numbers[:3] == [0 1 2]main.go:27: numbers[4:] == [4 5 6 7 8]main.go:43: len=0 cap=5 slice=[]main.go:43: len=2 cap=9 slice=[0 1]main.go:43: len=3 cap=7 slice=[2 3 4]
append() 和 copy() 函数
- 如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。
- 下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。 ```go package main
import ( “io” “log” “os” )
func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile)
var numbers []intlog.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)/* 允许追加空切片 */numbers = append(numbers, 0)log.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)/* 向切片添加一个元素 */numbers = append(numbers, 1)log.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)/* 同时添加多个元素 */numbers = append(numbers, 2, 3, 4)log.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)/* 创建切片 numbers1 是之前切片的两倍容量*/numbers1 := make([]int, len(numbers), (cap(numbers))*2)/* 拷贝 numbers 的内容到 numbers1 */copy(numbers1, numbers)log.Printf("len=%d cap=%d slice=%v\n", len(numbers1), cap(numbers1), numbers1)
}
输出```gomain.go:14: len=0 cap=0 slice=[]main.go:18: len=1 cap=1 slice=[0]main.go:22: len=2 cap=2 slice=[0 1]main.go:26: len=5 cap=6 slice=[0 1 2 3 4]main.go:33: len=5 cap=12 slice=[0 1 2 3 4]
