Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengelakkan Ralat Di Luar Sempadan Semasa Menghiris dalam Go?

Bagaimana untuk Mengelakkan Ralat Di Luar Sempadan Semasa Menghiris dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-03 03:57:14597semak imbas

How to Avoid Out-of-Bounds Errors When Slicing in Go?

Slicing: Out of Bounds Error in Go

In Go, menghiris ialah operasi berkuasa yang membolehkan anda mencipta kepingan baharu daripada yang sedia ada. Walau bagaimanapun, adalah penting untuk memahami kemungkinan perangkap untuk mengelakkan ralat masa jalan.

Isunya

Kod berikut menunjukkan ralat di luar sempadan apabila menghiris sifar- kepingan panjang:

package main

import "fmt"

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

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

Apabila dijalankan, kod ini menghasilkan di luar sempadan ralat:

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
panic: runtime error: slice bounds out of range

goroutine 1 [running]:
main.main()
   /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 +0x150

Memahami Ralat

Untuk memahami ralat, adalah penting untuk menjelaskan konsep penghirisan hirisan. Dalam Go, hirisan ialah rujukan kepada kawasan ingatan yang bersebelahan. Apabila anda mencipta kepingan yang dihiris, anda sedang mencipta rujukan baharu kepada subset hirisan asal.

Dalam kes kod di atas, kepingan b mempunyai panjang 0 dan kapasiti 5. Mengikut kepada spesifikasi Go, "indeks hirisan i merujuk kepada elemen ke-i hirisan dalam keadaan semasanya." Oleh itu, percubaan untuk mengakses elemen pada indeks 1 hirisan dengan panjang 0 adalah di luar batas.

Penyelesaian

Untuk mengelakkan keluar dari- ralat sempadan, pastikan bahawa indeks yang digunakan semasa menghiris berada dalam julat yang sah untuk kepingan asal. Untuk kepingan, julat ini ditentukan oleh panjang dan kapasiti kepingan.

Sebagai contoh, operasi berikut akan sah:

  • c := b[1:1]: Mencipta sekeping panjang 0 dan kapasiti 4.
  • c := b[1:2]: Mencipta sekeping panjang 1 dan kapasiti 4.
  • c := b[1:cap(b)]: Mencipta kepingan panjang 4 dan kapasiti 4.

Kesimpulan

Menghiris dalam Go ialah operasi asas untuk memanipulasi data. Walau bagaimanapun, adalah penting untuk memahami batasan untuk mengelakkan ralat masa jalan. Dengan memastikan bahawa indeks yang digunakan semasa menghiris berada dalam julat yang sah, anda boleh mengelakkan ralat luar sempadan dengan berkesan dan berfungsi dengan hirisan dengan selamat.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat Di Luar Sempadan Semasa Menghiris dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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