Ich habe mit Scheiben experimentieren. Hier ist ein BeispielprogrammWachsen eine Scheibe, während seine Subslice um
for n := 1; n <= 10; n++ {
a := make([]int, 0)
for j := 0; j < n; j++ {
a = append(a, 0)
}
b := a[:1]
a = append(a, 0)
a[0] = 1
fmt.Println(n, b[0])
}
Der Ausgang ist
1 0
2 0
3 1
4 0
5 1
6 1
7 1
8 0
9 1
10 1
Ich verstehe, was hier vor sich geht. Die Zeile a = append(a, 0)
weist ein neues Array zu, wenn das alte Array keine ausreichende Länge hat und das neue Array die doppelte Länge wie das Original hat. Deshalb, wenn n
eine Potenz von 2, die Linie
a[0] = 1
nicht das Array von b
als neues Array gesichert ändern wurden, bevor in der Zeile zugeordnet.
Allerdings konnte ich in der Dokumentation keine explizite Aussage finden, dass das neu zugewiesene Array immer doppelt so lang ist. Bedeutet dies, dass mein Code implementierungsabhängig ist? Ist es eine schlechte Übung, auf diese Weise ein Slice eines anderen Slices in einer Variablen zu speichern, oder sollte ich einfach jedes Mal a[j:k]
machen, wenn ein Subslice benötigt wird?
Meine letzten 2 Fragen sind nicht besonders klar, ich stimme zu. Ich habe versucht, herauszufinden, ob es idiomatisch ist, einen Unterschnitt einer Scheibe in eine Variable für den späteren Gebrauch zu legen. Das ist fragil, weil Zwischenoperationen die Elemente des Slice möglicherweise verändert haben oder auch nicht. –