切片的声明|创建
代码
package main
import (
"io"
"log"
"os"
)
// 切片定义声明
func main() {
log.SetOutput(io.MultiWriter(os.Stdout))
log.SetFlags(log.Lshortfile)
//声明 slice1 是一个切片,并且初始化,默认值是1, 2, 3。长度len是3
slice1 := []int{1, 2, 3}
// 声明 slice2 是一个切片,但是并没有给slice分配空间
var slice2 []int
slice2 = make([]int, 5) //开辟5个空间,默认值是0
//声明 slice3 是一个切片,同时给 slice3 分配空间,6个空间,初始化值是0
var 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= []int
main.go:29: len = 5, slice = [0 0 0 0 0], type= []int
main.go:30: len = 6, slice = [0 0 0 0 0 0], type= []int
main.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时的倍数开辟空间, 也就是 3
log.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>
### 输出
```go
main.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 main
import (
"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 []int
log.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)
}
输出
```go
main.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]