Удалить элемент из разницы срезов gccgo vs gc

Я нашел действительно странную проблему с GCCGO, и мне было интересно, если кто-то может объяснить это.

Я пытаюсь удалить элемент из слайса по индексу, используя предложенные хитрости слайса ( https://github.com/golang/go/wiki/SliceTricks).

Следующий код ( https://play.golang.org/p/f039m1h7Z1):

package main

import "fmt"

func main() {
    xs := []int{0,1,2,3,4}
    i := 2
    xs, xs[len(xs)-1] = append(xs[:i], xs[i+1:]...), 0
    fmt.Println(xs)
}

Работает с компилятором go (go run), но когда я пытаюсь скомпилировать его с

gccgo -g -static-libgcc 

Я получаю

panic: runtime error: index out of range 

на линии:

    xs, xs[len(xs)-1] = append(xs[:i], xs[i+1:]...), 0

Почему это происходит?

Примечание: я пишу xs[len(xs)-1] = 0 потому что в моем полном случае использования это на самом деле фрагмент указателей на структуры, поэтому в соответствии с уловками фрагментов мне нужно сделать окончательный указатель нулевым в старом фрагменте, чтобы предотвратить утечки памяти.

1 ответ

Я считаю, что gccgo здесь правильно в соответствии со спецификацией языка. Это https://golang.org/issue/23188.

Другие вопросы по тегам