Go- 切片的使用
发布于: 49 分钟前
Go 学习笔记,学习内容《Go入门指南》
主要介绍以下内容:
for range 用于一维数组和切片
for range 用于二维数组和切片
切片扩缩容
切片的拷贝和追加
代码示例可以直接运行
package main
import (
"fmt"
)
func printDivider(str ...string) {
fmt.Println()
fmt.Println("-----------------------------------------------")
if len(str) > 0 {
fmt.Println(str)
}
}
func main() {
/*
for range 用于一维数组和切片
*/
printDivider("for range 用于数组和切片")
s := []int{1, 2, 3}
for ix, value := range s { // ix 为索引值,value 为索引位置的值,他们都是作用域在 for 中的局部变量,value 是 s 中值的一个拷贝,不能用来修改 s 里元素的值
fmt.Printf("ix = %d, value = %d\n", ix, value) // 输出:ix = 0, value = 1 ...
}
for ix := range s { // 忽略第二个参数
fmt.Printf("ix = %d\n", ix)
}
for _, value := range s { // 忽略第一个参数
fmt.Printf("value = %d\n", value)
}
items := [...]int{10, 20, 30}
fmt.Println(len(items), cap(items))
/*
for range 用于多维数组和切片
*/
printDivider("for range 用于多维数组和切片")
ss := [][]string{{"Hello", "World"}, {"I", "Have", "a", "Dream"}}
for row := range ss {
for column := range ss[row] {
fmt.Println(ss[row][column])
}
}
/*
切片扩缩容
*/
printDivider("切片扩缩容")
s1 := make([]int, 5, 10)
fmt.Println(s1) // 输出:[0 0 0 0 0]
fmt.Printf("len(s1) = %d, cap(s1) = %d\n\n", len(s1), cap(s1)) // 输出:len(s1) = 5, cap(s1) = 10
s1 = s1[0 : len(s1)+1]
fmt.Println(s1) // 输出:[0 0 0 0 0 0]
fmt.Printf("len(s1) = %d, cap(s1) = %d\n\n", len(s1), cap(s1)) // 输出:len(s1) = 6, cap(s1) = 10
s1 = s1[0 : len(s1)-1]
fmt.Println(s1) // 输出:[0 0 0 0 0]
fmt.Printf("len(s1) = %d, cap(s1) = %d\n\n", len(s1), cap(s1)) // 输出:len(s1) = 5, cap(s1) = 10
s1 = s1[0:cap(s1)]
fmt.Println(s1) // [0 0 0 0 0 0 0 0 0 0]
fmt.Printf("len(s1) = %d, cap(s1) = %d\n\n", len(s1), cap(s1)) // len(s1) = 10, cap(s1) = 10
//s1 = s1[-1:0] // 编译错误:invalid slice index -1 (index must be non-negative)
//s1 = s1[0 : cap(s1)+1] // 编译错误:panic: runtime error: slice bounds out of range [:11] with capacity 10
/*
切片的拷贝和追加
*/
printDivider("切片的拷贝和追加")
s11 := make([]int, 5, 10)
s12 := []int{1, 2, 3}
fmt.Printf("Copy Before: s11 = %v, s12 = %v\n", s11, s12) // 输出:Copy Before: s11 = [0 0 0 0 0], s12 = [1 2 3]
cnt := copy(s11, s12) // 覆盖拷贝,返回拷贝的元素个数
fmt.Printf("Copy After : s11 = %v, s12 = %v\n", s11, s12) // 输出:Copy After : s11 = [1 2 3 0 0], s12 = [1 2 3]
fmt.Printf("Copy Return = %d\n", cnt) // 输出:Copy Return = 3
fmt.Printf("Append Before: s11 = %v\n", s11) // 输出:Append Before: s11 = [1 2 3 0 0]
s11 = append(s11, 4, 5) // 添加元素之后未超过容量
fmt.Printf("Append After : s11 = %v\n", s11) // 输出:Append After : s11 = [1 2 3 0 0 4 5]
s11 = append(s11, 6, 7, 8, 9, 10, 11) // 添加元素之后超过容量,append会分配新的切片保证新增元素的存储,返回的切片指向的数组已经和之前不同
fmt.Printf("Append After : s11 = %v\n", s11) // 输出:Append After : s11 = [1 2 3 0 0 4 5 6 7 8 9 10 11]
}
复制代码
划线
评论
复制
发布于: 49 分钟前阅读数: 2
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/d062ba0ca785bf0dc0b1e852a】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论