GOスライス

まず、スライス(スライス)

1.1スライスし、何

配列の言語抽象スライスを移動します。
セットは、特定のシナリオのように有用ではないように、配列の長さを変更することができない移動、移動は、柔軟で強力な内蔵型のスライス(「ダイナミックアレイ」)、アレイスライスの長さに比べてが固定されていない提供します場合、追加のセクションの容量を大きくすることができるように、要素は、添加してもよいです

スライスは、便利で柔軟かつ強力なラッパーです。スライスは、任意のデータを持っていません。彼らは、既存のアレイへの参照だけです。

配列スライスと比較して、長さではなく、[]の設定値を設定する必要が比較的自由ではありません

構造のようなスライスの上記の概念から、この構造は、3つの要素を含みます:

  1. 指定された配列のスライス内の開始位置へのポインタ
  2. スライスの長さ、すなわち長さ
  3. 最大の長さは、配列の長さの最後の位置にスライス開始位置であります

文法の1.2スライス

定義されたセクション

var identifier []type

スライス長は説明する必要はありません。
またはスライスを作成するには()関数を作ります:

var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)
make([]T, length, capacity)

初期化

s[0] = 1
s[1] = 2
s[2] = 3
s :=[] int {1,2,3 } 
s := arr[startIndex:endIndex] 

新しいスライス(1-要素をendIndexのためにstartIndexのARRから作成されたインデックス前面開閉)と長さendIndexの-のstartIndex

s := arr[startIndex:] 

endIndexにまでARRのデフォルトの最後の要素

s := arr[:endIndex] 

デフォルトのstartIndexは、ARRの最初の要素から始まります

package main
 
import (  
    "fmt"
)
 
func main() {  
    a := [5]int{76, 77, 78, 79, 80}
    var b []int = a[1:4] //creates a slice from a[1] to a[3]
    fmt.Println(b)
}

1.3スライスを修正します

スライスは、任意のデータを所有していません。これは、基になる配列の単なる表現です。元の配列に反映されている変更をスライス。

サンプルコード:

package main
 
import (  
    "fmt"
)
 
func main() {  
    darr := [...]int{57, 89, 90, 82, 100, 78, 67, 69, 59}
    dslice := darr[2:5]
    fmt.Println("array before",darr)
    for i := range dslice {
        dslice[i]++
    }
    fmt.Println("array after",darr) 
}

結果:

array before [57 89 90 82 100 78 67 69 59]  
array after [57 89 91 83 101 78 67 69 59]  

複数のピースが同じ基本配列を共有する場合、配列の各要素に加えられた変更が反映されます。

サンプルコード:

package main
 
import (  
    "fmt"
)
 
func main() {  
    numa := [3]int{78, 79 ,80}
    nums1 := numa[:] //creates a slice which contains all elements of the array
    nums2 := numa[:]
    fmt.Println("array before change 1",numa)
    nums1[0] = 100
    fmt.Println("array after modification to slice nums1", numa)
    nums2[1] = 101
    fmt.Println("array after modification to slice nums2", numa)
}

結果:

array before change 1 [78 79 80]  
array after modification to slice nums1 [100 79 80]  
array after modification to slice nums2 [100 101 80]  

1.4 LEN()及びCAP()関数

スライスの長さは、スライス内の要素の数です。スライスの容量は、インデックス作成スライスから始まる元の配列内の要素の数です。

スライスは割り出し可能であり、LEN()長さによって取得することができる
方法のスライス(計算容量CAPを提供する)までとすることができるどのように多くのスライスを測定することができます。

package main
 
import "fmt"
 
func main() {
   var numbers = make([]int,3,5)
 
   printSlice(numbers)
}
 
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

業績

len=3 cap=5 slice=[0 0 0]

空のタイル

nilに初期化されていないデフォルトの前にスライス、0の長さ

package main
 
import "fmt"
 
func main() {
   var numbers []int
 
   printSlice(numbers)
 
   if(numbers == nil){
      fmt.Printf("切片是空的")
   }
}
 
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

業績

len=0 cap=0 slice=[]
切片是空的
package main
 
import "fmt"
 
func main() {
   /* 创建切片 */
   numbers := []int{0,1,2,3,4,5,6,7,8}   
   printSlice(numbers)
 
   /* 打印原始切片 */
   fmt.Println("numbers ==", numbers)
 
   /* 打印子切片从索引1(包含) 到索引4(不包含)*/
   fmt.Println("numbers[1:4] ==", numbers[1:4])
 
   /* 默认下限为 0*/
   fmt.Println("numbers[:3] ==", numbers[:3])
 
   /* 默认上限为 len(s)*/
   fmt.Println("numbers[4:] ==", numbers[4:])
 
   numbers1 := make([]int,0,5)
   printSlice(numbers1)
 
   /* 打印子切片从索引  0(包含) 到索引 2(不包含) */
   number2 := numbers[:2]
   printSlice(number2)
 
   /* 打印子切片从索引 2(包含) 到索引 5(不包含) */
   number3 := numbers[2:5]
   printSlice(number3)
 
}
 
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

業績

len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len=0 cap=5 slice=[]
len=2 cap=9 slice=[0 1]
len=3 cap=7 slice=[2 3 4]

1.5 APPEND()およびコピー()関数

一つ以上の要素に追加のスライスを追加し、その後、スライスタイプとしてスライスを返す
DSTに先スライスにソースSRCからコピー機能のコピーをコピー素子、及びコピーされた要素の数を返します

他のスライスが同じ配列を参照影響スライスによって参照配列の内容を変化させる機能を追加します。残りないスライス
Iスペース(すなわち(CAP-LEN)== 0)は 、 この場合は、新しい配列動的に割り当てられた空間ないであろう。アレイへ返されたポインタポイントは、この空間をスライスし、元の
配列の内容は変更されないままであろう。この配列スライスへの他の参照は影響を受けません

次のコードは、メソッドからのスライスに新しい要素を追加するスライスappendメソッドのコピーのコピーを記述します

package main
 
import "fmt"
 
func main() {
   var numbers []int
   printSlice(numbers)
 
   /* 允许追加空切片 */
   numbers = append(numbers, 0)
   printSlice(numbers)
 
   /* 向切片添加一个元素 */
   numbers = append(numbers, 1)
   printSlice(numbers)
 
   /* 同时添加多个元素 */
   numbers = append(numbers, 2,3,4)
   printSlice(numbers)
 
   /* 创建切片 numbers1 是之前切片的两倍容量*/
   numbers1 := make([]int, len(numbers), (cap(numbers))*2)
 
   /* 拷贝 numbers 的内容到 numbers1 */
   copy(numbers1,numbers)
   printSlice(numbers1)   
}
 
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

業績

len=0 cap=0 slice=[]
len=1 cap=2 slice=[0]
len=2 cap=2 slice=[0 1]
len=5 cap=8 slice=[0 1 2 3 4]
len=5 cap=12 slice=[0 1 2 3 4]

どちらも、数字、数字が変更されたとき、numbers1は変更にないとの接触がないnumbers1。そのコピーの方法は、接触の2つのスライスを確立することではありません

おすすめ

転載: www.cnblogs.com/puqunzhu/p/11700734.html
おすすめ