Удалить элемент из разницы срезов 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.