设为首页 加入收藏

TOP

Golang: 数组和切片(一)
2018-12-14 12:08:46 】 浏览:167
Tags:Golang: 切片

数组

同其他语言一样,数组是一些相同类型的元素的集合。数组声明

数组的类型为 n[T],其中 n 表示数组中元素的个数,T 表示数组中元素的类型。数组元素的个数 n 也是数组类型的一部分

1 package main
2 
3 import "fmt"
4 
5 func main() {
6     var a [5]int //int array a and   length is 5
7     fmt.Println(a)
8 }
var a [5]int 是我们常用的一种声明数组的方式。同时也会给数组种的所有元素赋值int的初始值0.运行代码我们得到:[0 0 0 0 0]

我们还可以用shorhand 速记声明的方式声明和赋值数组:
1 package main
2 
3 import "fmt"
4 
5 func main() {
6     a := [5]int{1, 3, 4, 5, 6} //int array a and   length is 5
7     fmt.Println(a)
8 }

这个代码的运行结果是:[1 3 4 5 6]

如果没有给所有的元素赋值,那么后面的元素会被赋予默认值。

 

在声明数组的时候,可以使用...来代替数组长度,编译器会帮我们计算数组长度

1 package main
2 
3 import "fmt"
4 
5 func main() {
6     a := [...]int{1, 3, 6} //int array a and   length is 3
7     fmt.Println(len(a))
8 }

这个代码的运行结果是3,表明编译器帮我们计算好了数组长度。

由于数组的长度属于数组类型的一部分,那么[3]int和[5]int 不是相同一类型,不可以相互赋值。

 

数组遍历

Go提供了for rang来让我们遍历数组,这样比用for 循环简洁一些。

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     a := [...]string{"a", "b"}
 7 
 8     for i, v := range a { //range returns both the index and value
 9         fmt.Printf(" the element %d of a is %s \n", i, v)
10     }
11 }

上面的代码运行结果是:

the element 0 of a is a
the element 1 of a is b 

切片

由于数组长度不可变,导致数组的应用场景大幅减少。还好Go给我们提供了切片。

把上面的代码稍微修改一下,我们来创建一个切片

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     a := [...]string{"a", "b", "c", "d", "e"}
 7 
 8     for i, v := range a { //range returns both the index and value
 9         fmt.Printf(" the element %d of a is %s \n", i, v)
10     }
11 
12     b := a[2:3]
13     fmt.Println(b)
14 }

运行结果是

 the element 0 of a is a 
 the element 1 of a is b 
 the element 2 of a is c 
 the element 3 of a is d 
 the element 4 of a is e 
[c]

我们通过 a[start:end] 这样的语法创建了一个从 a[start] 到 a[end -1] 的切片。在上面代码中,我们用这种方式创建了长度为1 的切片b。

 

我们还可以使用和创建数组相似的方式来创建切片

1 package main
2 
3 import "fmt"
4 
5 func main() {
6     b := []string{"a", "b", "c", "d", "e"}
7     fmt.Println(b)
8 }

需要注意的是[]中间是没有长度或者...的。这段代码创建了一个切片b,然后代码的运行结果是:[a b c d e]

切片的长度和容量

切片的长度就是切片中元素的个数。切片的容量是 切片创建的数组的长度减去创建切片时的start值。

具体我们看代码

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     a := [...]string{"a", "b", "c", "d", "e"}
 7     b := a[1:2]
 8     fmt.Printf("length of slice %d capacity %d", len(b), cap(b)) //length is 1 and capacity is 4
 9 
10 }

运行结果是:length of slice 1 capacity 4

append 追加数据到切片上

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     a := [...]string{"a", "b", "c", "d", "e"}
 7     b := a[1:2]
 8     fmt.Printf("length of slice %d capacity %d\n", len(b), cap(b)) //length is 1 and capacity is 4
 9     b = append(b, "x", "y", "z", "m", "n")
10     fmt.Printf("length of slice %d capacity %d\n", len(b), cap(b)) //length is 1 and capacity is 8
11 
12 }

第8行代码给切片b追加了5个元素,那么长度就是6,长度超过了容量4,go是怎么做的?如果容量超了,go会创建一个新的数组,容量翻倍,然后返回新数组的完整切片。

代码的运行结果是

length of slice 1 capacity 4
length of slice 6 capacity 8

 

我们还可以使用append把一个切片完整的追加到一个切片上:

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     a := []string{"a", "b"}
 7     b := []string{"c", "d", "e"}
 8     a = append(a, b...)
 9     fmt
编程开发网
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Golang:sync.Map 下一篇滑动窗口最大值的golang实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }