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
私の完全なユースケースでは、これは実際には構造体へのポインターのスライスであるため、私が書いているため、スライスのトリックに従って、メモリリークを防ぐために古いスライスの最終ポインターを null にする必要があります。