写点什么

Go- 切片的使用

用户头像
HelloBug
关注
发布于: 49 分钟前
Go- 切片的使用

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
用户头像

HelloBug

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Go- 切片的使用