【前进】基本文法④(排列・切片)

简述

我按照 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] 的例子。

操作意味Slice[start:end]start から end – 1 までSlice[start:]start から最後尾までSlice[:end]先頭から end – 1 までSlice[:]先頭から最後尾まで

如果进行切片操作,将与原始数组(或切片)共享元素。换句话说,修改切片的元素会同时修改其对应的原数组的元素。

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)

广告
将在 10 秒后关闭
bannerAds