Ich benutze eine 2D-Scheibe von Bytes, um eine Reihe von Linien darzustellen, aber wenn ich an eine der Linien anhänge, bekomme ich sehr seltsames Verhalten. HierSeltsames Verhalten beim Anhängen an eine 2d-Schicht
ein Beispiel:
package main
import (
"bytes"
"fmt"
)
func main() {
str := []byte("first line\nsecond line\nthird line")
values := bytes.Split(str, []byte("\n"))
fmt.Println("Before:")
fmt.Println(string(values[0]))
fmt.Println(string(values[1]))
fmt.Println(string(values[2]))
fmt.Println()
values[0] = append(values[0], []byte("-inserted text-")...)
fmt.Println("After:")
fmt.Println(string(values[0]))
fmt.Println(string(values[1]))
fmt.Println(string(values[2]))
}
ich die Ausgabe dieses Programms erwarten
Before:
first line
second line
third line
After:
first line-inserted text-
second line
third line
Aber anstatt die Ausgabe sein:
Before:
first line
second line
third line
After:
first line-inserted text-
inserted te
t-ird line
https://play.golang.org/p/iNw6s1S66U
Warum passiert das und wie kann ich das beheben?
Interessanterweise geschieht dies nicht, wenn ich Werte nicht Split verwenden und stattdessen definieren wie folgt:
values := [][]byte{[]byte("first line"), []byte("second line"), []byte("third line")}
https://play.golang.org/p/pEflrhKLd4
Wenn Sie sagen, der Speicher ist geteilt, was meinst du? Beziehen Sie sich auf die Elemente der Scheibe hintereinander aufgereiht? – AJPennster
Das valriable 'str' ist ein Byte-Slice mit einer gewissen Menge an Backend-Speicher. Dann gibt 'byte.Slice' eine Scheibe von [] Byte zurück, die alle auf den gleichen Hintergrundspeicher zeigen. Sie zeigen also alle (zu Beginn) in denselben gemeinsamen Speicher. – Vatine
Rechts. Ich konnte es bestätigen. – AJPennster