1.スライスの定義
Go言語のスライスは、一種の動的配列であり、配列の拡張です。
- アレイと比較して、カットの長さは固定されておらず、要素を追加できるため、カットの容量が増える可能性があります。
- カット自体にはデータがなく、既存の配列への参照にすぎません。
- カットはアレイを基準にしており、長さを設定する必要はなく、比較的自由な[]では設定値は使用されません。
- 概念的には、スライスは構造のようなものです。この構造には3つの要素が含まれます:
1)配列内のスライスによって指定された開始位置を指すポインター、
2)スライスの長さである長さ、
3)最大長さ、つまり、スライスの先頭から配列の最後の位置までの長さ。
第二に、スライスの構文
2.1スライスを宣言する
2.1.1カットを定義するために、不特定の長さの配列を宣言します
- 識別子[]タイプでした
- 長さを説明する必要はありません。
- ステートメントモードであり、初期化されていないスイッチは空のスイッチです。このカットはデフォルトでnilであり、その長さは0です。
2.1.2 make()関数を使用してカットを作成します。
- varスライス1 []タイプ= make([]タイプ、len)
- 省略可能:slice1:= make([] type、len)
- 容量を指定できます。ここで、容量はオプションのパラメーターです:make([] T、length、capacity)
//mySlice.go
package main
import (
"fmt"
)
func main() {
//fmt.Println("Hello World!")
//1)切片
var numbers = make([]int, 3, 5)
fmt.Printf("%T\n", numbers)
fmt.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)
}
効果は次のとおりです。
2.2初期化
2.2.1スライスを直接初期化する
s :=[] int {1,2,3 }
2.2.2アレイインターセプトによるスライスの初期化
数组: arr := [5]int {1,2,3,4,5}
- 1)s:= arr [:]
には配列のすべての要素が含まれます - 2)s:= arr [startIndex:endIndex]
は、新しいカット(前に閉じて開いた)としてarrのendIndex-1の添え字startIndexの下に要素を作成します。長さはendIndex-startIndexです。 - 3)s:= arr [startIndex:]
は、デフォルトでarrの最後の要素までの最後の要素を示します。 - 4)s:= arr [:endIndex]
は、デフォルトでarrの最初の要素から開始されます。
2.2.3スライスインターセプトによるスライスの初期化
下限と上限を設定することで、インターセプトカットを設定できます[下限:上限]
//mySlice2.go
package main
import (
"fmt"
)
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
func main() {
//fmt.Println("Hello World!")
//1)切片
// var numbers = make([]int, 3, 5)
// fmt.Printf("%T\n", numbers)
// fmt.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)
//2)截取切片
numbers := []int{
0, 1, 2, 3, 4, 5, 6, 7, 8}
printSlice(numbers)
//打印原始切片
fmt.Println("numbers== ", numbers)
//打印子切片,从索引1到索引4,左闭右开,[1,4)
fmt.Println("numbers[1:4]== ", numbers[1:4])
//默认下限为0,[0,3)
fmt.Println("numbers[:3]== ", numbers[:3])
//默认上限为len(s),[4,len(s))
fmt.Println("numbers[4:]== ", numbers[4:])
//打印子切片,[0,2)
number2 := numbers[:2]
printSlice(number2)
//打印子切片,[2,5)
number3 := numbers[2:5]
printSlice(number3)
}
効果は次のとおりです。
3つ目は、スライス内のlen()関数とcap()関数です。
- カットの程度は、カット内の要素の数です。
- カットの容量は、カットが作成されたインデックスから始まる、基になる配列内の要素の数です。
- カットはインデックス可能であり、長さはlen()メソッドで取得できます。カットは、カットの最大長を測定できる容量cap()を計算するためのメソッドを提供します。[配列計算の結果cap()はlen()と同じです]。
- 実用的なのは、配列の特定の部分、len cut <= cap cut <= lenarrayを取得することです。
- cap()の結果は、カットインターセプトの注意の詳細を決定します。
//mySlice02.go
// mySliceCap project main.go
package main
import (
"fmt"
)
func main() {
sliceCap()
}
func sliceCap() {
arry := [...]string{
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"}
fmt.Println("cap(arry)= ", cap(arry), arry)
//截取数组,形成切片
sli01 := arry[2:8]
fmt.Printf("%T\n", sli01)
fmt.Println("cap(sli01)= ", cap(sli01), sli01)
sli02 := arry[4:7]
fmt.Println("cap(sli02)= ", cap(sli02), sli02)
//截取切片,形成切片
sli03 := sli01[3:9]
fmt.Println("截取sli01[3:9]后形成sli03: ", sli03)
sli04 := sli02[4:7]
fmt.Println("截取sli02[4:7]后形成sli04: ", sli04)
//切片是引用类型
sli04[0] = "x"
fmt.Print(arry, sli01, sli02, sli03, sli04)
}
結果は次のとおりです。
第四に、スライスは参照タイプです
- スライスには独自のデータはなく、基になる配列への参照にすぎず、スライスに加えられた変更は基になる配列に反映されます。
- 配列は値型ですが、参照型です。
配列を変更する場合は次のとおりです
。//mySlice04.go
// mySliceCmp project main.go
package main
import (
"fmt"
)
func main() {
a := [4]float64{
67.7, 89.8, 21, 78}
b := []int{
2, 3, 5}
fmt.Printf("变量a -- 地址: %p, 类型: %T, 数值: %v, 长度: %d\n", &a, a, a, len(a))
fmt.Printf("变量b -- 地址: %p, 类型: %T, 数值: %v, 长度: %d\n", &b, b, b, len(b))
c := a
d := b
fmt.Printf("变量c -- 地址: %p, 类型: %T, 数值: %v, 长度: %d\n", &c, c, c, len(c))
fmt.Printf("变量d -- 地址: %p, 类型: %T, 数值: %v, 长度: %d\n", &d, d, d, len(d))
a[1] = 200
fmt.Println("a= ", a, " c= ", c)
d[0] = 100
fmt.Println("b= ", b, " d= ", d)
}
結果は次のとおりです。
- カット値の変更
複数のページが同じ基になる配列を共有している場合、各要素によって行われた変更は配列に反映されます。
スライスの値を変更します。例は次のとおりです
。//mySlice04.go
// mySliceChg project main.go
package main
import (
"fmt"
)
func main() {
//定义数组
arry := [3]int{
1, 2, 3}
//根据数组截取切片
nums1 := arry[:]
nums2 := arry[:]
fmt.Println("arry= ", arry)
nums1[0] = 100
fmt.Println("arry= ", arry)
nums2[1] = 200
fmt.Println("arry= ", arry)
fmt.Printf("变量arry --地址: %p\n", &arry)
fmt.Printf("变量nums1 --地址: %p\n", &nums1)
fmt.Printf("变量nums2 --地址: %p\n", &nums2)
}
結果は次のとおりです。