"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que recebo um erro de limites de fatia fora do intervalo no Go Slicing?

Por que recebo um erro de limites de fatia fora do intervalo no Go Slicing?

Publicado em 2024-12-21
Navegar:745

Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

Slicing: Erro fora dos limites no Go

No Go, o fatiamento envolve a extração de uma parte de uma fatia existente para criar uma nova fatiar. Quando ocorre um erro fora dos limites durante o fatiamento, isso indica que o intervalo especificado excede os limites de índice válidos para o fatiamento de origem.

Considere o seguinte snippet de código:

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)

}

A execução deste código resulta em um erro fora dos limites:

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

Para entender por que esse erro ocorre, precisamos nos aprofundar nas regras que regem o fatiamento em Go.

Fatiamento Regras

Ao fatiar uma fatia ou array, os índices especificados podem ser explícitos ou implícitos. Se um índice não for fornecido explicitamente, o padrão será um valor específico. Para fatias:

  • Um limite inferior ausente é padronizado como 0.
  • Um limite superior ausente é padronizado como len(slice) (não cap(slice)).

No código fornecido, o erro ocorre porque a expressão de fatiamento para criar a fatia c é:

c := b[1:]

Isso significa que o limite inferior (1) é especificado explicitamente, mas o limite superior não. Portanto, o padrão é len(b), que é 0. No entanto, o limite inferior especificado (1) deve ser menor ou igual a o limite superior (0). Esta condição não é atendida, resultando em um erro de fora dos limites.

Para evitar esse erro, você pode especificar explicitamente os limites inferior e superior. Por exemplo, para extrair apenas o segundo elemento da fatia b, você escreveria:

c := b[1:2] // c len=1 cap=4 [0]

Alternativamente, se você quiser extrair a fatia b inteira começando do segundo elemento, você pode usar:

c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3