厚土Go学习笔记 | 20. slice 继续
时间:2022-05-06
本文章向大家介绍厚土Go学习笔记 | 20. slice 继续,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
slice是一个序列的值,可以根据序列号来访问。可以使用 len(s)
返回 slice s 的长度。
写一个例子,利用 for 循环,打印出 slice 的每一个值。利用下标来访问每一个值。
package main
import (
"fmt"
)
func main() {
s := []int{1,1,2,3,5,8,13,21,34}
fmt.Println("slice s is", s)
for i := 0; i < len(s); i++ {
fmt.Printf("s[%d] == %dn", i, s[i])
}
}
运行结果
slice s is [1 1 2 3 5 8 13 21 34]
s[0] == 1
s[1] == 1
s[2] == 2
s[3] == 3
s[4] == 5
s[5] == 8
s[6] == 13
s[7] == 21
s[8] == 34
slice的构成元素可以是任何类型,甚至也可以是其他slice。
比如:
game := [][]string{
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
}
slice game的元素类型是 []string
的slice。
请看完整代码
package main
import (
"fmt"
"strings"
)
func main() {
//填字游戏
game := [][]string{
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
}
//玩家填写的内容
game[0][0] = "X"
game[0][1] = "X"
game[0][2] = "X"
game[1][0] = "Y"
game[1][1] = "Y"
game[1][2] = "Y"
game[2][0] = "Z"
game[2][1] = "Z"
game[2][2] = "Z"
printGame(game)
}
func printGame(game [][]string) {
for i := 0; i < len(game); i++ {
fmt.Printf("%sn", strings.Join(game[i], " "))
}
}
运行看看结果
X X X
Y Y Y
Z Z Z
_ _ _
_ _ _
任何一个slice都是对数组的一个切片后的使用。而且,它不影响原数组的值。
slice也可以重新切片。
像这样
package main
import (
"fmt"
)
func main() {
s := []int{1,1,2,3,5,8,13,21,34,55}
fmt.Println("s ==", s)
fmt.Println("s[1:4] ==", s[1:4])
fmt.Println("s[2:5] ==", s[2:5])
//省略的写法, : 符号左边省略,表示从0开始
fmt.Println("s[:3] ==", s[:3])
//省略的写法, : 符号右边省略,表示到最后一个元素
fmt.Println("s[4:] ==", s[4:])
}
重新切片的切面,注意省略的写法。
s == [1 1 2 3 5 8 13 21 34 55]
s[1:4] == [1 2 3]
s[2:5] == [2 3 5]
s[:3] == [1 1 2]
s[4:] == [5 8 13 21 34 55]
可以看到,此例中的多个slice都是针对同一个数组在操作。切片的切片的表达式是 s[lo:hi]
。
我们可以看到,hi 是不包含在新的slice内的。
所以,s[lo:lo]
是空的,而 s[lo:lo + 1] 有一个元素。
使用 make 创建 slice 的时候,可以使用第三个参数,指定容量。
容量用 cap() 表示。
b := make([]int, 0, 5) //创建一个slice,长度为0,容量为5
b = b[:cap(b)] //b的长度为5,容量为5
b = b[1:] //b的长度为4,容量为4
用一个列子,看一下slice容量的变化。
package main
import (
"fmt"
)
func main() {
a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[:2]
printSlice("c", c)
d := c[2:5]
printSlice("d", d)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %vn", s, len(x), cap(x), x)
}
运行结果
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0]
d len=3 cap=3 [0 0 0]
新声明的 slice 如果没有赋值的话,它的零值是 nil 。长度和容量都是 0
。
以下代码可证
package main
import (
"fmt"
)
func main() {
var z []int
fmt.Println(z, len(z), cap(z))
if z == nil {
fmt.Println("nil !")
}
}
运行结果
[] 0 0
nil !
- 高性能JavaScript-JS脚本加载与执行对性能的影响
- CSS3伪类和伪元素的特性和区别
- Kafka剖析系列之Benchmark
- 初探React与D3的结合-或许是visualization的新突破?
- Redis 在Centos Linux 上的启动脚本
- 理解JavaScript的临时包装对象
- JavaScript实现私有属性
- 使用LRU算法缓存图片,android 3.0
- 深入理解JavaScript原型:prototype,__proto__和constructor
- Comparable 与 Comparator 浅析
- 必应首页平铺背景图片的实现方案
- 我们是如何优化HAProxy以让其支持200万个并发SSL连接的?
- 【译】《Understanding ECMAScript6》- 第八章-Module
- 【译】《Understanding ECMAScript6》- 第七章-Promise
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 云原生时代高性能Java框架—Quarkus(二)
- 使用TypeScript积累自己的类库
- 在Egret项目中使用protobuf
- JavaScript原型与继承
- 当TKE遇上Coding, 业务如何实现快速迭
- cocos creator 1.x透明渐变效果实现
- Cocos Creator 2.x透明渐变效果实现
- Themeleaf通过ajax局部更新
- ubuntu下利用expect实现screen多窗口开机运行
- hetzner服务器购买和安装debian系统
- 安全通告 | Apache SkyWalking SQL注入漏洞安全风险公告(CVE-2020-13921)
- Cmd Markdown 迁移备份的流程
- PyTorch3:计算图torch.autograph
- spark shell 配置 Kryo 序列化
- Mac里捣腾Kerberos(一)