# 厚土Go学习笔记 | 20. slice 继续

slice是一个序列的值，可以根据序列号来访问。可以使用 `len(s)` 返回 slice s 的长度。

```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] == %d\n", 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("%s\n", strings.Join(game[i], "  "))
}
}```

```X   X   X
Y   Y   Y
Z   Z   Z
_   _   _
_   _   _```

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]```

```b := make([]int, 0, 5) //创建一个slice，长度为0，容量为5
b = b[:cap(b)] //b的长度为5，容量为5
b = b[1:] //b的长度为4，容量为4```

```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 %v\n", 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]```

```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 !```

1782 篇文章379 人订阅

0 条评论

## 相关文章

400110

### Golang语言社区-【基础知识】切片

Go编程切片是一种抽象了Go编程数组。由于Go编程数组允许您定义的变量，可容纳同类的几个数据项类型，但它不提供任何内置的方法来动态地增加它的大小或得到一个子数组...

36980

### jquery对象和dom对象的相互转换

1、关于页面元素的引用 通过jquery的\$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法，且返回的对象为jqu...

37840

### JavaScript学习笔记

【如果大家对程序员，web前端感兴趣，想要学习的，关注一下小编吧。加群：731771211。免费赠送web前端系统的学习资料！！前端学习必备公众号ID：mtbc...

24320

### Go语言创建、初始化数组的各种方式

//数组初始化的各种方式 func arraySliceTest0201() { //创建数组(声明长度) var array...

40870

### JavaScript DOM基础

DOM（Document Object Model）即文档对象模型，针对HTML和XML文档的API（应用程序接口）。 一．DOM介绍 DOM中的三个字母，D（...

21890

### go语言数组的拷贝

go语言的数组与c语言的数据有一点不太一样的地方，go语言的赋值是值拷贝 package main import "fmt" func main...

40490

9220

31050