【前进】基本文法④(排列・切片)
简述
我按照 A Tour of Go 的顺序总结了我个人在学习基本 Go 语言方面的经验。
这次学习侧重于Arrays(数组)和slices(切片)。
数组
配列是一种包含相同类型的值(元素)的有序集合。
Go语言中的数组是固定长度的数组,因此无法改变最初声明的数组大小。
声明数组的方式
在Go中,可以如下声明数组。
① var 変数名 [長さ]型
② var 変数名 [長さ]型 = [大きさ]型{初期値1, 初期値n}
③ 変数名 := [...]型{初期値1, 初期値n}
使用了①中的方式来声明数组的示例。
使用了①方式宣告数组的例子。
func main(){
var arr[2] string
arr[0] = "Golange"
arr[1] = "Java"
fmt.Println(arr[0], arr[1]) //=> Golange Java
fmt.Println(arr) //=> [Golange Java]
}
用第二种方法声明数组的例子。
func main(){
var arr[2] string = [2]string {"Golang", "Java"}
fmt.Println(arr[0], arr[1]) //=> Golange Java
fmt.Println(arr) //=> [Golange Java]
}
使用方法③声明数组的示例
在这种声明方法中,可以省略元素的数量。
然而,它只是自动计算了后面写的元素数量,与明确声明元素数量的情况没有实质上的差异。
func main(){
arr := [...] string{"Golang", "Java"}
fmt.Println(arr[0], arr[1]) //=> Golange Java
fmt.Println(arr) //=> [Golange Java]
}
切片
Go的数组是类似于固定长度的数组,而Go的切片(Slice)则更加灵活,类似于可变长度的数组,可以更加灵活地存储数据(元素)。
声明切片的方法
在Go语言中,我们可以这样声明一个切片:
与数组声明不同的是,切片不需要在 [] 中指定大小。
此外,切片是对数组的引用类型,因此可以通过切片操作从数组中取出一个子序列并创建它。
① var 変数名 []型
② var 変数名 []型 = []型{初期値1, ..., 初期値n}
③ 変数名 := 配列[start:end]
//配列(またはスライス)のstartから(end - 1)を取り出す事でスライスを作成する。
用①方法宣布的示例
func main(){
var slice []string
fmt.Println(slice) //=> []
}
用2的方法声明的示例
func main(){
slice := [] string{"Golang", "Java"}
fmt.Println(slice) //=> [Golange Java]
}
以第③种方法声明的示例
func main(){
arr := [...] string{"Golang", "Java"}
slice := arr[0:2]
fmt.Println(slice) //=> [Golange Java]
}
在切片操作中,可以使用如下所示的方法。
在上述例子中,我们使用的是 Slice[start:end] 的例子。
如果进行切片操作,将与原始数组(或切片)共享元素。换句话说,修改切片的元素会同时修改其对应的原数组的元素。
func main(){
arr := [...] string{"Golang", "Java"}
slice := arr[0:2] //スライスの作成
slice[0] = "Ruby" //slice[0]の要素を変更
fmt.Println(arr) //=> [Ruby Java] //arrの要素も変更されている事を確認
}
添加要素
在Go语言中,数组在声明时其元素的数量是固定的,所以不能进行元素的添加。如果想要在切片中添加元素,可以使用内置函数append(),这样可以很方便地实现。需要注意的是,append()会返回一个新的切片。
通过以下方式,在原数组(切片)的末尾添加指定元素,并返回更新后的值。
newSlice = append(slice, 追加要素)
func main(){
slice := [] string{"Golang", "Java"}
newSlice := append(slice, "Ruby") //sliceに"Ruby"を追加
fmt.Println(newSlice) //=> [Golang Java Ruby]
fmt.Println(slice) //=> [Golang Java] //元の値は変わっていない。
}
切片的长度和容量
切片具有长度和容量两个属性。
長さ(length) は、それに含まれる要素の数です。
容量(capacity) は、スライスの最初の要素から数えて、元となる配列の要素数です。
可以使用 len() 和 cap() 函数来获取切片的长度和容量。
func main(){
arr := [...] string{"Golang", "Java"}
slice := arr[0:1]
fmt.Println(slice) //=> Golang
fmt.Println(len(slice)) //=> 1 //sliceの要素数は1つなので1を返す。
fmt.Println(cap(slice)) //=> 2 //sliceの生成元の要素数は2つなので2を返す。
}
切片赋值
如果切片的类型匹配,可以进行赋值操作。
func main(){
slice := [] string{"Golang", "Java"}
var slice2 []string //sliceと同型slice2を作成
slice2 = slice //sliceをslice2に代入
fmt.Println(slice2) //=> [Golange Java]
}
可以通过`slice`来访问`slice2`数组本身。此外,如果更改`slice[0]`的值,`slice2`的值也会发生变化。
func main(){
slice := [] string{"Golang", "Java"}
var slice2 []string //sliceと同型slice2を作成
slice2 = slice //sliceをslice2に代入
slice2[0] = "Ruby" //slice2[0]の値を変更
fmt.Println(slice2) //=> [Ruby Java]
fmt.Println(slice) //=> [Ruby Java] //slice2での変更によりsliceの要素も変更されている。
}
切片的零值
切片的零值是 nil。
nil 切片具有0的长度和容量,并且没有任何基础数组。
func main() {
var slice []int
fmt.Println(slice, len(slice), cap(slice)) //=> [] 0 0
if slice == nil {
fmt.Println("nil!") //=> nil!
//sliceの値がnilの場合にnil!を表示する。
}
}
用嵌入函数make()创建切片。
我们也可以使用内置函数 make() 来定义切片。
make([]T, len, cap)
上述的make()函数的第一个参数 []T 表示类型,第二个参数(len)表示长度,第三个参数(cap)表示容量。
func main() {
a := make([]int,5, 5)
fmt.Println(a) //=> [0 0 0 0 0]
}
请引用以下内容(只需一种选择)
我的Go之旅④
轻松学习Go语言编程入门
Go基础 | 数组和切片的区别
第一次学Go语言(切片1)