Ich wollte nur auf diese meine Gedanken teilen nach dem offiziellen Blog zu lesen: https://blog.golang.org/slices
Hier in Golang Blog wird die sliceHeader:
type sliceHeader struct {
Length int
ZerothElement *byte
}
Jetzt erklären Sie Ihre Scheibe:
s := []int{2, 3, 5, 7, 11, 13}
was ich glaube, tut etwas wie:
var array [6]int
slice := sliceHeader {
Length: 6,
ZerothElement: &array[0],
}
Dadurch: s = s[:2]
, verändert man effektiv die Länge des sliceHeader 6 bis 2, so dass Ihr sliceHeader wird wie folgt aussehen:
slice := sliceHeader {
Length: 2,
ZerothElement: &array[0],
}
Beachten Sie, dass die ZerothElement noch an der gleichen Stelle zeigen in Erinnerung.So können wir die Scheibe wieder auf ihre ursprüngliche Form s = s[:6]
verlängern, indem wir einfach die Länge erneut ändern.
Nun lassen Sie uns sagen, dass Sie nicht s = s[:2]
zu tun haben und stattdessen tat s = s[2:]
, was Sie haben, ist effektiv getan, um die ersten beiden Elemente versteckt durch 2 aus Länge subtrahiert und die ZerothElement beiden Indizes nach vorn verlagert, was zu einer sliceHeader von:
An diesem Punkt können Sie das Segment nicht in seine ursprüngliche Form wiederherstellen, da es keine Möglichkeit gibt, das Segment über das ZerothElement hinaus zu erweitern. Okay, was wäre, wenn Sie hypothetisch auf alle Elemente vor dem ZerothElement zugreifen könnten? Dann wird unser Slice undefiniert, weil es array[0...4]
, array[1...5]
oder array[2...6]
sein könnte.
Also ja, deshalb denke ich [n:] und [: n] verhält sich anders.
meine Frage ist w.r. Zuweisung, wenn wir s = s [: n], mein Denken war s wird von der neuen Scheibe überschrieben, wo in der alten Array \ Slice tatsächlich verloren ist, existiert nicht mehr. Aber zum Gegenteil, ich schneide weiterhin das ursprüngliche Array, das bereits geschnitten und gewürfelt wurde, was sich von Java unterscheidet. –