それはGolangで私の最初の日だ、と私はappend()
のように、そのスライス操作をしようとすると、私はとても混乱になり、一つのことがあります:私は2つのだけ番号が追加するとなぜGolangのスライス操作は非常に複雑
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
a:= s[2:4];
a = append(a, 1000, 1001);
a[1] = 100;
printSlice("a:", a)
printSlice("s:", s)
}
func printSlice(title string, s []int) {
fmt.Printf("%s len=%d cap=%d %v\n", title, len(s), cap(s), s)
}
a
に、のように:
a = append(a, 1000, 1001);
...結果は次のとおりです。
a: len=4 cap=4 [5 100 1000 1001]
s: len=6 cap=6 [2 3 5 100 1000 1001]
s
への参照として、a
が表示されていると思います。
しかし、私は、コードの行を変更する場合:
a = append(a, 1000, 1001, 1002);
...結果は次のようになります。
a
は、メモリの他のセグメントに再割り当てされた、私が思うに、
a: len=5 cap=8 [5 100 1000 1001 1002]
s: len=6 cap=6 [2 3 5 7 11 13]
、全体を保持し、s
への参照を切り離します。
これは非常に矛盾しているので、混乱させてしまいます。追加する値の乱数がある場合など、このエラーを起こすのは本当に簡単なことがあります。
なぜGolangはこのように設計されていますか? JavaScriptのslice
とpush
のような操作をしたいのであれば、これを避ける方法はありますか?
私は、共有データへのビューには「追加」しないという考えがあると思います。サブスライスを付けてそれに追加する場合は、コピーを作成します。 – user2357112
スライスの背後にあるシンプルなセマンティクスを理解していないと矛盾しているように見えます。何が起こっているのかわからない場合は、[Go Slices:usage and internals](https://blog.golang.org/go-slices-usage-and-internals)、[A Go:Slices](https://tour.golang.org/moretypes/7)、[Slice Types](https://golang.org/ref/spec#Slice_types)および[Copying Slicesを追加する](https://golang.org/ref/spec#Appending_and_copying_slices)、[Go By Example:Slices](https://gobyexample.com/slices)、[Slice Tricks](https://github.com/ golang/go/wiki/SliceTricks) – JimB
@ user2357112ありがとう、今私は明確です。 – Kuan