2

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 にする必要があります。

4

1 に答える 1