Update golang_tutorial_11.md

pull/18/head
RickyWang1020 5 years ago committed by ShaoBo Wan(無尘)
parent 41f3e3863f
commit c9fc5db540

@ -10,7 +10,7 @@
数组是类型相同的元素的集合。例如,整数 5, 8, 9, 79, 76 的集合就构成了一个数组。Go不允许在数组中混合使用不同类型的元素比如整数和字符串
##
##
数组的类型为` [n]T`,其中 `n` 表示数组中元素的个数,`T` 表示数组中元素的类型。元素的个数 `n`也是数组类型的一部分(我们将在稍后详细讨论)。
@ -51,7 +51,7 @@ func main() {
`a[0]`表示数组中的第一个元素。程序的输出为:`[12 78 50]`。
(译者注:可以用下标运算符(`[]`)来访问数组中的元素,下标从 0 开始,例如 `a[0]` 表示数组 a 的第一个元素,`a[1] `表示数组 a 的第二元素,以此类推。)
(译者注:可以用下标运算符(`[]`)来访问数组中的元素,下标从 0 开始,例如 `a[0]` 表示数组 a 的第一个元素,`a[1]` 表示数组 a 的第二元素,以此类推。)
可以利用 **速记声明shorthand declaration** 的方式来创建同样的数组:
@ -212,7 +212,7 @@ func main() {
3 th element of a is 78.00
```
Go 提供了一个更简单,更简洁的遍历数组的方法:使用 `range for`range 返回数组的索引和索引对应的值。让我们用 range for 重写上面的程序(除此之外我们还计算了数组元素的总和)。
Go 提供了一个更简单,更简洁的遍历数组的方法:使用 range 形式的 for 循环。`range` 返回数组的索引和索引对应的值。让我们用 range for 重写上面的程序(除此之外我们还计算了数组元素的总和)。
```golang
package main
@ -247,7 +247,7 @@ for _, v := range a { //ignores index
}
```
上面的代码忽略了索引。同样的,也可以忽略值。
上面的代码忽略了索引。用类似的方法,也可以忽略值。
## 多维数组
@ -288,7 +288,7 @@ func main() {
}
```
上面的程序中,第 17 行利用速记声明创建了一个二维数组 a。第 20 行的逗号是必须的,这是因为词法分析器会根据一些简单的规则自动插入分号。如果你想了解更多请阅读https://golang.org/doc/effective_go.html#semicolons 。
上面的程序中,第 17 行利用速记声明创建了一个二维数组 a。第 20 行的逗号是必须的因为词法分析器会根据一些简单的规则自动插入分号。如果你想了解更多请阅读https://golang.org/doc/effective_go.html#semicolons 。
在第 23 行声明了另一个二维数组 b并通过索引的方式给数组 b 中的每一个元素赋值。这是初始化二维数组的另一种方式。
@ -429,11 +429,11 @@ func main() {
}
```
在上面的程序中,创建了一个以 fruitarray 为底层数组,索引从 1 到 3 的切片 `fruitslice`因此 fruitslice 长度为 2。
在上面的程序中,创建了一个以 `fruitarray` 为底层数组,索引从 1 到 2 的切片 `fruitslice`因此 fruitslice 长度为 2。
`fruitarray` 的长度是 7。`fruiteslice` 是从 `fruitarray` 的索引 1 开始的。因此 `fruiteslice` 的容量是从 `fruitarray` 的第 1 个元素开始算起的数组中的元素个数,这个值是 6。因此 `fruitslice` 的容量是 6。程序的输出为`length of slice 2 capacity 6`
切片的长度可以动态的改变(最大为其容量)。任何超出最大容量的操作都会发生运行时错误。
切片的长度可以动态地改变(最大长度为其容量)。任何超出切片容量的操作都会发生运行错误。
```golang
package main
@ -483,7 +483,7 @@ func main() {
`x …T` 表示 append 函数可以接受的参数个数是可变的。这种函数叫做变参函数。
你可能会问一个问题:如果切片是建立在数组之上的,而数组本身不能改变长度,那么切片是如何动态改变长度的呢?实际发生的情况是,当新元素通过调用 append 函数追加到切片末尾时如果超出了容量append 内部会创建一个新的数组。并将原有数组的元素拷贝给这个新的数组最后返回建立在这个新数组上的切片。这个新切片的容量是旧切片的二倍译者注当超出切片的容量时append 将会在其内部创建新的数组,该数组的大小是原切片容量的 2 倍。最后 append 返回这个数组的全切片,即从 0 到 length - 1 的切片)。下面的程序使事情变得明朗
你可能会问一个问题:如果切片是建立在数组之上的,而数组本身不能改变长度,那么切片是如何动态改变长度的呢?实际发生的情况是,当新元素通过调用 append 函数追加到切片末尾时如果超出了容量append 内部会创建一个新的数组。并将原有数组的元素拷贝给这个新的数组最后返回建立在这个新数组上的切片。这个新切片的容量是旧切片的二倍译者注当超出切片的容量时append 将会在其内部创建新的数组,该数组的大小是原切片容量的 2 倍。最后 append 返回这个数组的全切片,即从 0 到 length - 1 的切片)。下面的程序会帮助你理解这一知识点
```golang
package main
@ -666,9 +666,9 @@ func main() {
[深入解析 Go 中 Slice 底层实现](https://halfrost.com/go_slice/)
###### 创建(定义)数组
数组在Go中是值类型而不是引用其他语言的数组则是引用类型
PS切片slice是一个引用类型
数组不是统一的类型,大小不同的数组是不可以比较的
不同数组类型是不可以比较的
PS切片slice是一个引用类型。数组不是统一的类型,大小不同的数组是不可以比较的,不同数组类型是不可以比较的
```golang
var a[2]int
var b[3]string
@ -691,7 +691,7 @@ a := [...]int{19:100}
// 指向数组的指针
var p *[20]int = &a //长度为20的int型数组这里的数组长度 `20` 必须和a数组长度相等
fmt.Println(p) //以上表示取这样一个数组的地址
// 打印结果:&[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19]
// 打印结果:&[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100]
//指向指针的数组
x , y := 1, 2
@ -702,7 +702,7 @@ fmt.Println("pp is ",pp) // 打印结果pp is [0xc420012128 0xc420012130]
```golang
ppp := new([10]int)
fmt.Println("----ppp-------",ppp); //输出结果:`&[0 0 0 0 0 0 0 0 0 0]`
fmt.Println("----ppp-------",ppp); //输出结果:`----ppp------- &[0 0 0 0 0 0 0 0 0 0]`
//以上为指向数组的指针
```
@ -712,12 +712,12 @@ fmt.Println("----ppp-------",ppp); //输出结果:`&[0 0 0 0 0 0 0 0 0 0]`
// 第一种方式
n := [10]int{}
n[1] = 10
fmt.Println("-----1------",n) // 输出:`[0 10 0 0 0 0 0 0 0 0]`
fmt.Println("-----1------",n) // 输出:`-----1------ [0 10 0 0 0 0 0 0 0 0]`
// 第二种方式
m := new([10]int)
m[1] = 20
fmt.Println("-----2------",m) // 输出:`&[0 20 0 0 0 0 0 0 0 0]`
fmt.Println("-----2------",m) // 输出:`-----2------ &[0 20 0 0 0 0 0 0 0 0]`
```
###### 多维数组
@ -804,7 +804,7 @@ func main() {
s7 := []byte{'a','b','c','d','e','f','g','h','i','j','k'} // 切片底层对应的数组
slice_a := s7[2:5]
fmt.Println(slice_a) // 输出的assica码 值 [99 100 101]
fmt.Println(slice_a) // 输出的ascii码 值 [99 100 101]
fmt.Println(string(slice_a)) // 格式化为字符串输出
fmt.Println(len(slice_a),cap(slice_a))
@ -817,7 +817,7 @@ func main() {
s8 = append(s8, 12, 48)
fmt.Printf("%v %p", s8, s8) // 格式化打印值和内存地址:[0 0 0 12 48] 0xc042074030
// 追加的元素如果没有超切片容量,则切片的地址是不变的,否则内存地址会变
// 追加的元素如果没有超切片容量,则切片的地址是不变的,否则内存地址会变
s8 = append(s8, 66, 88)
fmt.Printf("%v %p\n", s8, s8) // [0 0 0 12 48 66 88] 0xc042048060
@ -828,7 +828,7 @@ func main() {
fmt.Println(s9) //[33 44 55 4 5 6 7]
copy(s10,s9)
fmt.Println(s10) // [33 44 55]
fmt.Println(s10) // [1 2 3]
copy(s9[2:4],s10[0:2])
fmt.Println(s9) // [1 2 33 44 5 6 7]

Loading…
Cancel
Save