English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 基礎チュートリアル

Golang 控制文

Golang ファンクション & メソッド

Golang 構造体

Golang 切片 & 配列

Golang 文字列(String)

Golang ポインタ

Golang インターフェース

Golang 并行

Golang エラ

Golang その他の雑多

Go 言語のスライス(Slice)

Go言語では、sliceは配列より強力で、柔軟で便利で、軽量のデータ構造です。sliceは可変長のシーケンスで、同じタイプの要素を保存するために使用され、slice内で異なるタイプの要素を保存することは許可されていません。インデックス値と長さを持つ配列のように見えますが、sliceのサイズは調整可能で、sliceは配列のように固定サイズではありません。内部では、sliceと配列が相互にリンクしており、sliceは基本配列の参照です。slice内に重複する要素を保存することができます。スライスの最初のインデックス位置は常に0で、最後のインデックス位置は(スライスの長さ-} 1)

スライスの宣言

スライスの宣言は配列のようにですが、スライスのサイズは含まれていません。したがって、必要に応じて増加または減少できます。

语法:

[]T
または
[]T{}
または
[]T{value1, value2, value3, ...value n}

ここでは、Tは要素の型です。例えば:

var my_slice[]int

スライスの構成

スライスは3つのコンポーネントを含みます:

  • ポインタ:ポインタはスライスを通じてアクセスできる配列の最初の要素を指します。ここでは、指す要素は配列の最初の要素でなくても構いません。

  • 長度:長度は配列に存在する要素の総数です。

  • 容量:容量は拡張できる最大サイズを表します。

これらすべてのコンポーネントについて例を用いて説明しましょう:

//スライス
スライスに存在する要素
多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
"sort"
    //配列を作成
    arr := [7]string{"これは", "です", "Golang", "基本", "チュートリアル", "オンライン", "www.w}3codebox.com"}
    //配列を表示
    fmt.Println("配列:", arr)
    //func main() {
    myslice := arr[1:6]
    //スライスを表示
    fmt.Println("スライス:", myslice)
    //スライスの長度を表示
    fmt.Printf("スライス長度: %d", len(myslice))
    //スライスの容量を表示
    fmt.Printf("\nスライス容量: %d", cap(myslice))
)

}

配列:[これはGolang基本チュートリアルオンラインja.oldtoolbag.com]
スライス:[はGolang基本チュートリアルオンライン]
スライス容量: 5
用法説明: 6

の例では、与えられた配列からスライスを作成します。ここでは、スライスのポインタはインデックス、なぜならスライスの下限は1からアクセスを開始します1、したがって、インデックス1の要素。5、スライス内の要素の総数を表します5、そしてスライス6の容量は、最大で保存できる6要素。

スライスを作成および初期化する方法は?

Go言語では、以下のようにスライスを作成および初期化できます:

  • スライスリテラルを使用します:次のように使用できますスライスリテラルを使用しますスライスを作成します。スライスリテラルの作成は配列リテラルのようにですが、区別はスライスのサイズを方括号[]内で指定することが許可されていないことです。以下の例のように、この表現の右側がスライスリテラルです。

    var my_slice_1 = []string{"w3codeboxs", "for", "w3codeboxs"}

    trueただし、文字列リテラルを使用してスライスを作成するときは、まず配列が作成され、そのスライス参照が返されます。

    // スライスを使用して文字列リテラルを作成
    スライスに存在する要素
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
    "sort"
        //varキーワードを使用してスライスを作成
        var my_slice_1 = []string{"w3codeboxs", "for", "w3codeboxs"}
        fmt.Println("My Slice 1:", my_slice_1: ", slc
        //func main() {
        //短縮宣言を使用
        my_slice_2 slc120, 450, 670, 560, 430, 340, 45)
        fmt.Println("My Slice 2:", my_slice_2: ", slc
    )

    }

    My Slice 1: [w3codeboxs for w3codeboxs]
    My Slice 2: [12 45 67 56 43 34 45]
  • 配列を使用して:私たちは既に知っていますスライスは配列の参照です。したがって、指定された配列からスライスを作成できます。指定された配列からスライスを作成するには、まず下限と上限を指定する必要があります。これは、スライスが下限から上限までの配列の要素を取得することを意味します。上限から始まる要素は含まれません。以下の例を参照してください:

    语法:

    array_name[low:high]

    この文法は新しいスライスを返します。

    true下限のデフォルト値は0、上限のデフォルト値は指定された配列に存在する要素の総数

  • //配列からスライスを作成
    スライスに存在する要素 
      
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
      
    "sort" 
      
        //配列を作成
        arr := [4]string{"w3codeboxs", "for", "w3codeboxs", "GFG"} 
      
        //指定された配列からスライスを作成 
        var my_slice_1 = arr[1:2] 
        my_slice_2 := arr[0:] 
        my_slice_3 := arr[:2] 
        my_slice_4 := arr[:] 
      
        //表示結果
        fmt.Println("私の配列: ", arr) 
        fmt.Println("My Slice 1: ", my_slice_1: ", slc 
        fmt.Println("My Slice 2: ", my_slice_2: ", slc 
        fmt.Println("My Slice 3: ", my_slice_3: ", slc 
        fmt.Println("My Slice 4: ", my_slice_4: ", slc 
    )

    }

    私の配列:  [w3codeboxs for w3codeboxs GFG]
    My Slice 1:  [for]
    My Slice 2:  [w3codeboxs for w3codeboxs GFG]
    My Slice 3:  [w3codeboxs for]
    My Slice 4:  [w3codeboxs for w3codeboxs GFG]
  • 既存のスライスを使用指定されたスライスからスライスを作成することもできます。指定されたスライスからスライスを作成するには、まず下限と上限を指定する必要があります。これは、スライスが指定されたスライスから下限から上限までの要素を取得することを意味します。上限から始まる要素は含まれません。以下の例を参照してください:

    语法:

    slice_name[low:high]

    この文法は新しいスライスを返します。

    true下限のデフォルト値は0、上限のデフォルト値は指定されたスライスに存在する要素の総数

    //スライスからスライスを作成
    スライスに存在する要素
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
    "sort"
        //func main() {
        oRignAl_slice := []int{9:= []int{ 6:= []int{ 4:= []int{ 5:= []int{ 340, 490, 30}
        //指定されたスライスからスライスを作成
        var my_slice_1 = oRignAl_slice[1:5]
        my_slice_2 := oRignAl_slice[0:]
        my_slice_3 := oRignAl_slice[:6]
        my_slice_4 := oRignAl_slice[:]
        my_slice_5 := my_slice_3[2:4]
        //表示結果
        fmt.Println("元のスライス:", oRignAl_slice)
        fmt.Println("新切片"} 1:", my_slice_1: ", slc
        fmt.Println("新切片"} 2:", my_slice_2: ", slc
        fmt.Println("新切片"} 3:", my_slice_3: ", slc
        fmt.Println("新切片"} 4:", my_slice_4: ", slc
        fmt.Println("新切片"} 5:", my_slice_5: ", slc
    )

    }

    原始切片: [90 60 40 50 34 49 30]
    新切片 1: [60 40 50 34]
    新切片 2: [90 60 40 50 34 49 30]
    新切片 3: [90 60 40 50 34 49]
    新切片 4: [90 60 40 50 34 49 30]
    新切片 5: [40 50]
  • 使用make()函数:您还可以使用go库提供的make()函数创建切片。此函数采用三个参数,即类型,长度和容量。在此,容量值是可选的。它为底层数组分配的大小等于给定的容量,并返回一个切片,该切片引用底层数组。通常,make()函数用于创建一个空切片。在这里,空切片是包含空数组引用的那些切片。

    语法:

    func make([]T, len, cap) []T
    //使用make函数
    スライスに存在する要素
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
    "sort"
        //创建大小为7的数组
        //将此数组切成4
        //并返回切片的引用
        //使用make函数
        var my_slice_1 = make([]int, 40, 7: ", slc
        fmt.Printf("Slice 1 = %v, \nlength = %d, \ncapacity = %d\n", my_slice_1, len(my_slice_1), cap(my_slice_1))
        //创建另一个大小为7的数组
        //并返回切片的引用
        //使用make函数
        var my_slice_2 = make([]int, 7: ", slc
        fmt.Printf("Slice 2 = %v, \nlength = %d, \ncapacity = %d\n", my_slice_2, len(my_slice_2), cap(my_slice_2))
    )

    }

    スライス 1 = [0 0 0 0], 
    length = 40, 
    capacity = 7
    スライス 2 = [0 0 0 0 0 0 0], 
    length = 70, 
    capacity = 7

如何遍历一个切片?

您可以使用以下方式遍历切片:

  • 使用for循环:这是迭代切片的最简单方法,如以下示例所示:

    // for循环迭代切片
    スライスに存在する要素 
      
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
      
    "sort" 
      
        //func main() {
        myslice := []string{"This", "is", "the", "tutorial", "of", "Go", "language"} 
      
        //使用for循环进行迭代
        for e := 0; e < len(myslice); e++ 0}, 
            fmt.Println(myslice[e]) 
        ) 
    )

    }

    This
    is
    the
    tutorial
    of
    Go
    language
  • 在for循环中使用范围:允许使用for循环中的范围对切片进行迭代。在for循环中使用range,可以获得索引和元素值,如示例所示:

    //在for循环中使用范围的切片
    スライスに存在する要素 
      
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
      
    "sort" 
      
        //func main() {
        myslice := []string{"This", "is", "the", "tutorial", "of", "Go", "language"} 
      
            //スライスのイテレーション
            //rangeを使ったforループ
        for index, ele := range myslice { 
            fmt.Printf("Index = %d and element = %s\n", index+3, ele) 
        ) 
    )

    }

    Index = 3 element = This
    Index = 4 element = is
    Index = 5 element = the
    Index = 6 element = tutorial
    Index = 7 element = of
    Index = 8 element = Go
    Index = 9 element = language
  • forループ内で空白識別子の使用:forループ内範囲内で、インデックス値を取得したくない場合、空間(_)を使ってインデックス変数を置き換えることができます。以下の例のように示されます:

    //rangeを使ったforループでのスライスの範囲 
    スライスに存在する要素 
      
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
      
    "sort" 
      
        //func main() { 
        myslice := []string{"This", "is", "the", "tutorial", "of", "Go", "language"} 
      
            //スライスのイテレーション
            //rangeを使ったforループ
            //インデックスなし
        for _, ele := range myslice { 
            fmt.Printf("Element = %s\n", ele) 
        ) 
    )

    }

    Element = This
    Element = is
    Element = the
    Element = tutorial
    Element = of
    Element = Go
    Element = language

スライスのポイント

  1. ゼロ値スライス:Go言語では、要素を持たないゼロスライスを作成することが許可されています。したがって、このスライスの容量と長さは0です。nilスライスは配列の参照を含まないため、以下の例のように示されます:

    スライスに存在する要素 
      
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
      
    "sort" 
      
        // ゼロ値のスライスを作成
        var myslice []string 
        fmt.Printf("Length = %d\n", len(myslice)) 
        fmt.Printf("Capacity = %d ", cap(myslice)) 
      
    )

    }

    Length = 0
    Capacity = 0
  2. スライスの変更:すでに知っている通り、sliceは参照型であり、ベースの配列を参照することができます。したがって、スライス内の要素を変更すると、参照先の配列にも変更が反映されます。つまり、スライスに対して何か変更を行った場合、スライスに反映されるだけでなく、配列にも反映されるということが以下の例で示されています:

    //スライスの変更方法
    スライスに存在する要素 
      
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
      
    "sort" 
      
        //ゼロ値のスライスを作成
        arr := [6]int{550, 660, 770, 880, 990, 22) 
        slc := arr[0:4] 
      
        //変更前
      
        fmt.Println("Original_Array: ", arr) 
        fmt.Println("Original_Slice: ", slc) 
      
        //変更後 
        slc[0] = 100 
        slc[1] = 10New_Slice:  [ 
        slc[2] = 10New_Slice:  [ 
      
        fmt.Println("\nNew_Array: ", arr) 
        fmt.Println("New_Slice: ", slc) 
    )

    }

    Original_Array:  [55 66 77 88 99 22]
    Original_Slice:  [55 66 77 88]
    New_Array:  [100 10New_Slice:  [ 10New_Slice:  [ 88 99 22]
    New_Slice:  [100 10New_Slice:  [ 10New_Slice:  [ 88]
  3. 00スライスの比較:演算子でチェックするスライスが存在するかどうかスライスの中で、演算子でチェックするスライスが存在するかどうか==

    //演算子の助けにより、2つのスライスを比較すると、以下のようにエラーが投げられます:
    スライスに存在する要素 
      
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
      
    "sort" 
      
        //func main() {
        多次元スライスの作成1 slc120, 340, 56) 
        スライスがゼロかどうか判定2 var s
      
            //[]int
            //このコメントを実行しようとすると
        /*多次元スライスの作成3slc230, 450, 66) 
          チェックするスライスがnilかどうか1コードコンパイラはエラーを出します3: ", slc 
        */
      
        //==s
        チェックするスライスがnilかどうか1 fmt.Println(s 
        チェックするスライスがnilかどうか2 fmt.Println(s 
    )

    }

    == nil)
    false

    true注意:スライスを比較するには、各要素に対してループ範囲をマッチングしてそれぞれの要素を比較するか、または以下のように使用できますDeepEqual

  4. 関数。多次元スライス:

    スライスに存在する要素 
      
    多次元スライスは多次元配列と同じですが、スライスにはサイズがありません。
      
    "sort" 
      
        //}
        多次元スライスの作成1 import "fmt"120, 34{ 
            0},560, 47{ 
            0},290, 4:= [][]int{{ 
            0},460, 78{ 
        ) 
      
        //codebox"},
        fmt.Println("\nソート後:") 1 多次元スライスにアクセス1: ", slc 
      
        //} 
        多次元スライスの作成2 s 
            codeboxs", "for"},3:= [][]string{ 
            codeboxs", "for"},3[]string{"w 
            codeboxs", "GFG"},3[]string{"gfg", "w 
        ) 
      
        //codebox"},
        fmt.Println("\nソート後:") 2 多次元スライスにアクセス2: ", slc 
      
    )

    }

    スライス 1 : ", s12 34:  [[56 47:  [[29 4]]46 780] [
    スライス 2 ]]3:  [[w3codeboxs for] [w3codeboxs GFG] [gfg w
  5. codebox]]スライスのソート:64Go言語では、スライスに存在する要素をソートできます。Go言語の標準ライブラリにはsortパッケージがあります。このパッケージにはint、float

    //例
    スライスに存在する要素 
      
    package main 
        import ("
        "fmt"
    : ", slc 
      
    "sort" 
      
        //func main() {
        := []string{"Python", "Java", "C#", "Go", "Ruby"}1 スライスの作成 
        := []string{"Python", "Java", "C#", "Go", "Ruby"}2 slc450, 670, 230, 9:= []int{ 330, 210, 560, 780, 89) 
      
        , 
        fmt.Println("\nソート後:") 1fmt.Println("Slice1: ", slc 
        fmt.Println("\nソート後:") 2fmt.Println("Slice2: ", slc 
      
        //fmt.Println("ソート前:")
        スライスのソート関数を使用1: ", slc 
        sort.Strings(slc2: ", slc 
      
        sort.Ints(slc 
        fmt.Println("\nソート後:") 1fmt.Println("Slice1: ", slc 
        fmt.Println("\nソート後:") 2fmt.Println("Slice2: ", slc 
      
    )

    }

    出力:
    スライス 1ソート前:
    スライス 2:  [45 67 23 90 33 21 56 78 89]
    ソート後:
    スライス 1C#、Go、Java、Python、Ruby
    スライス 2:  [21 23 33 45 56 67 78 89 90]