Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengelakkan Ralat \'Slice Bounds Out of Range\' Apabila Menghiris dalam Go?

Bagaimana untuk Mengelakkan Ralat \'Slice Bounds Out of Range\' Apabila Menghiris dalam Go?

Linda Hamilton
Lepaskan: 2024-12-04 00:21:09
asal
308 orang telah melayarinya

How to Avoid

Menghiris dalam Go: Memahami Ralat Di Luar Sempadan

Apabila menghiris kepingan dalam Go, adalah penting untuk mematuhi had tertentu untuk mengelakkan ralat. Salah satu ralat tersebut ialah ralat "sempadan sempadan di luar julat". Ralat ini berlaku apabila ungkapan kepingan menghasilkan indeks yang berada di luar julat yang dibenarkan.

Dalam coretan kod yang disediakan:

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)
}
Salin selepas log masuk

Ralat berlaku apabila cuba mencipta kepingan c dengan ungkapan c := b[1:]. Ralat ini timbul bukan disebabkan oleh sempadan bawah (yang boleh sama dengan atau lebih besar daripada panjang), tetapi lebih kepada sempadan yang lebih tinggi.

Dalam Go, batas lalai lebih tinggi untuk menghiris ialah panjang operan yang dihiris . Walau bagaimanapun, dalam kes ini, operan yang dihiris b mempunyai panjang 0. Oleh itu, batas lalai lebih tinggi menjadi 0. Akibatnya, ungkapan c := b[1:] menghasilkan sempadan bawah 1 dan sempadan lebih tinggi 0 .

Ini melanggar peraturan penghirisan yang menyatakan bahawa untuk kepingan, indeks mesti memenuhi perkara berikut syarat:

0 <= low <= high <= cap(a)
Salin selepas log masuk

Di mana:

  • rendah ialah batas bawah
  • tinggi ialah batas lebih tinggi
  • cap(a) ialah kapasiti operan yang dihiris

Dalam kes ini, kerana 1 tidak kurang daripada atau sama dengan 0, ungkapan tersebut menghasilkan ralat di luar sempadan.

Untuk menyelesaikan isu ini, sempadan eksplisit mesti dinyatakan semasa menghiris. Contohnya:

c := b[1:1]        // Slice from index 1 to 1 (empty slice)
c := b[1:2]        // Slice from index 1 to 2 (contains the element at index 1)
c := b[1:cap(b)]   // Slice from index 1 to the capacity of the operand (contains all elements)
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat \'Slice Bounds Out of Range\' Apabila Menghiris dalam Go?. 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