Zauważyłem dziwne zachowanie z dopiskiem Golanga(). Rozumiem podstawową koncepcję tego, w jaki sposób zdolność segmentacji wpływa na to, czy nowa tablica bazowa zostanie przydzielona, ale dlaczego jest taka, czy używam opcji fmt.Println()
PO ZASTOSOWANIU, co miało wpływ na wynik dodania?Dziwne zachowanie z dopiskiem Golang() jest dotknięte przez fmt.Println()
package main
import "fmt"
func main() {
a := []byte("AAA")
b := append(a, []byte("BBB")...)
fmt.Println(" a: ", string(a), " b: ", string(b))
c := append(a, []byte("CCC")...)
fmt.Println(" a: ", string(a), " b: ", string(b), " c: ", string(c))
fmt.Println(&b) //try commenting this out and in and running the program
}
link, aby uruchomić kod tutaj: https://play.golang.org/p/jJ-5ZxTBIn
OP, uprościłem Twój przykład, usuwając nieprzydatny pierwszy przydział. Możesz się wycofać, jeśli się nie zgadzasz. –
To naprawdę wygląda na to, że kompilator błędnie pomyślał, że może coś zoptymalizować, i zachowuje tylko poprawną wartość b, gdy zostanie wydrukowany później. Potwierdziłem, że tak się nie dzieje na przykład z 1.4.2. Powinno to przyciągnąć uwagę golang-nuts, na wypadek, gdyby nie było już błędów. –
Rozumiem, że ten przykład może bardzo Cię zdezorientować. Miłym artykułem jest https://blog.golang.org/go-slices-usage-and-internals. Kawałek jest czymś, co wskazuje na tablicę - pamięta tablicę, gdzie wskazuje, swoją długość i pojemność.Zwykle nie dbamy o pojemność, ale w dołączeniu jest bardzo ważne. Append może współdzielić pamięć z poprzednią, jeśli jest wystarczająco dużo miejsca, ale nie będzie współdzielona, jeśli nie jest. W naszym przypadku umieść * fmt.Println (cap (a)) * po a = [] bajcie. Zwróciło mi 8. Oznacza to, że podczas gdy b i c będą krótsze, wskażą na to samo wspomnienie. – lofcek