Pergi sepotong bahasa (Slice)


Kepingan bahasa Go ialah abstraksi tatasusunan.

Panjang tatasusunan Go tidak boleh diubah Dalam senario tertentu, koleksi sedemikian tidak sesuai dengan jenis terbina dalam yang fleksibel dan berkuasa ("tatasusunan dinamik"). slice tidak tetap. Elemen boleh ditambah, yang boleh meningkatkan kapasiti kepingan.


Menentukan Slices

Anda boleh mengisytiharkan tatasusunan saiz yang tidak ditentukan untuk menentukan kepingan:

var identifier []type

Slice tidak perlu menentukan panjangnya.

Atau gunakan fungsi make() untuk mencipta kepingan:

var slice1 []type = make([]type, len)

也可以简写为

slice1 := make([]type, len)

Anda juga boleh menentukan kapasiti, dengan kapasiti ialah parameter pilihan.

make([]T, length, capacity)

Di sini len ialah panjang tatasusunan dan juga panjang awal hirisan.

Pengamatan hirisan

s :=[] int {1,2,3 }

Asalkan hirisan secara langsung, [] menunjukkan jenis hirisan, nilai pemulaan {1,2,3} ialah 1,2,3 mengikut urutan 3

s := arr[:]

Initialize slice s, yang merupakan rujukan kepada array arr

s := arr[startIndex:endIndex]

Cipta elemen dalam arr daripada subskrip startIndex ke endIndex-1 sebagai kepingan baharu

s := arr[startIndex:]

Tiada Apabila endIndex diabaikan, ia akan mewakili sehingga ke elemen terakhir arr

s := arr[:endIndex]

Apabila startIndex lalai, ia akan mewakili bermula dari elemen pertama arr

s1 := s[startIndex:endIndex]

Mulakan kepingan s1 hingga slice s

s :=make([]int,len,cap)

Memulakan slice s melalui fungsi terbina dalam make(), []int mengenal pasti kepingan yang jenis elemennya adalah int


len() dan cap() fungsi

kepingan boleh diindeks, dan panjang boleh diperolehi dengan kaedah len().

Slices menyediakan kaedah untuk mengira kapasiti cap() boleh mengukur berapa lama kepingan boleh.

Berikut ialah contoh khusus:

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

Hasil keluaran contoh di atas ialah:

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

Kepingan kosong (tiada)

Potongan pada masa hadapan Sebelum pemulaan, lalai adalah sifar dan panjangnya ialah 0. Contoh adalah seperti berikut:

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

Hasil output contoh di atas ialah:

len=0 cap=0 slice=[]
切片是空的

Slice interception

boleh ditetapkan dengan menetapkan had bawah dan Had atas digunakan untuk menetapkan slice interception [lower-bound:upper-bound] Contohnya adalah seperti berikut:

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

Hasil keluaran melaksanakan kod di atas ialah:

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]

tambah( ) dan copy() fungsi

Jika kita ingin meningkatkan kapasiti kepingan , kita mesti mencipta kepingan baru yang lebih besar dan menyalin kandungan kepingan asal.

Kod berikut menerangkan kaedah salin daripada kepingan dan kaedah tambah untuk menambahkan elemen baharu pada kepingan.

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

Hasil keluaran melaksanakan kod di atas ialah:

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=16 slice=[0 1 2 3 4]