Rumah >pembangunan bahagian belakang >Golang >Mengapa Menghiris `b[1:]` Menyebabkan Ralat Luar Had dalam Go?

Mengapa Menghiris `b[1:]` Menyebabkan Ralat Luar Had dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 03:43:14760semak imbas

Why Does Slicing `b[1:]` Cause an Out-of-Bounds Error in Go?

Slicing: Out of Bounds Error in Go

Apabila melaksanakan 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[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)
}

anda menghadapi ralat "luar sempadan". Ralat ini berlaku kerana ungkapan penghirisan yang tidak sah semasa membuat kepingan c.

Dalam Go, menghiris tatasusunan atau kepingan mengikut peraturan ini:

  • Indeks berada dalam julat jika 0 < = rendah <= tinggi <= len(a) untuk tatasusunan atau rentetan.
  • Untuk hirisan, indeks atas terikat lalai kepada kapasiti hirisan (cap(a)) dan bukannya panjangnya.

Ungkapan penghirisan b[1:] cuba mencipta kepingan c baharu dengan sempadan bawah 1. Walau bagaimanapun, sempadan yang lebih tinggi tiada dan lalai kepada panjang b, iaitu 0. Ini menghasilkan kepingan dengan sempadan bawah lebih besar daripada sempadan atasnya, yang membawa kepada "di luar sempadan" ralat.

Untuk membetulkan ralat ini, anda mesti memastikan bahawa sempadan lebih tinggi bagi ungkapan penghirisan adalah lebih besar daripada atau sama dengan sempadan bawah. Sebagai contoh, anda boleh menggunakan ungkapan berikut untuk mencipta kepingan c yang sah:

c := b[1:2]

Ini menghasilkan kepingan c dengan sempadan bawah 1 dan sempadan atas 2, yang sah sejak 1 < = 2 <= cap(b) (kapasiti b ialah 5).

Atas ialah kandungan terperinci Mengapa Menghiris `b[1:]` Menyebabkan Ralat Luar Had 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