Go言語でのスライスの宣言と使用

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)
}

効果は次のとおりです。

図(1)スライスの長さ、容量、データ要素を印刷する

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)
}

    効果は次のとおりです。

図(2)インターセプト方式でスライスを取得する

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)

}


    結果は次のとおりです。

図(3)スライス内のcap()関数

第四に、スライスは参照タイプです

  • スライスには独自のデータはなく、基になる配列への参照にすぎず、スライスに加えられた変更は基になる配列に反映されます。
  • 配列は値型ですが、参照型です。

    配列を変更する場合は次のとおりです
。//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)
}

    結果は次のとおりです。

図(4)配列の値を変更する
  • カット値の変更
        複数のページが同じ基になる配列を共有している場合、各要素によって行われた変更は配列に反映されます。
        スライスの値を変更します。例は次のとおりです
    。//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)
}

    結果は次のとおりです。

図(5)スライスの値を変更する

おすすめ

転載: blog.csdn.net/sanqima/article/details/108895065