Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Penghirisan Semula Berkelakuan dengan Tatasusunan Dasar dalam Go Slices?

Bagaimanakah Penghirisan Semula Berkelakuan dengan Tatasusunan Dasar dalam Go Slices?

Susan Sarandon
Lepaskan: 2024-12-26 19:02:10
asal
505 orang telah melayarinya

How Does Re-slicing Behave with Underlying Arrays in Go Slices?

Menghiris Semula Slices dalam Go: Kekeliruan dan Kejelasan

In Go, slices ialah cara yang berkuasa dan cekap untuk mewakili tatasusunan data. Walau bagaimanapun, memahami selok-belok mereka boleh mencabar untuk pemula. Salah satu aspek tersebut ialah konsep menghiris semula kepingan.

Pertimbangkan kod berikut:

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}
Salin selepas log masuk

Atur cara mencipta empat kepingan: a, b, c dan d. Keputusan yang mengejutkan ialah kepingan c, yang dicipta sebagai kepingan daripada dua elemen pertama b, mempunyai kapasiti 5 dan bukannya 2.

Untuk memahami tingkah laku ini, kita perlu menyelidiki konsep tatasusunan asas . Dalam Go, kepingan tidak menyimpan data sebenar; sebaliknya, mereka merujuk tatasusunan asas. Apabila hirisan dibuat, ia menunjuk kepada segmen tatasusunan pendasar ini.

Dalam contoh di atas, apabila b dicipta dengan panjang 0 tetapi kapasiti 5, ia menyimpan 5 slot dalam tatasusunan pendasar . Apabila kepingan c dicipta daripada b, ia menjadi tetingkap di atas dua elemen pertama b. Walau bagaimanapun, tatasusunan asas dan dengan itu kapasiti c kekal 5, termasuk slot yang tidak digunakan dalam b.

Konsep penghirisan semula ini digambarkan lebih lanjut dengan mengubah suai kod sedikit:

func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // this is equivalent to d := b[1:5]
    d[0] = 1
    printSlice("c", c)
    printSlice("d", d)
}
Salin selepas log masuk

Dalam kes ini, mengubah suai nilai d juga mengubah suai nilai c, menunjukkan bahawa c dan d hanyalah tetingkap yang berbeza di atas asas yang sama tatasusunan.

Memahami konsep menghiris semula adalah penting untuk berfungsi dengan berkesan dengan kepingan dalam Go. Ia membolehkan anda membuat kepingan yang melaraskan secara dinamik kepada saiz data yang berbeza tanpa perlu menyalin atau mengagihkan semula memori.

Atas ialah kandungan terperinci Bagaimanakah Penghirisan Semula Berkelakuan dengan Tatasusunan Dasar dalam Go Slices?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan