あなたがおっしゃるとおり The Go Playgroundバージョンは(go1.6.2
)古いためで、新しいバージョンを使用します。
(go version go1.7rc6
を使用して)正しい出力は次のとおり
a: AAA b: AAABBB
a: AAA b: AAACCC c: AAACCC
1-移動遊び場(go1.6.2
):
package main
import "fmt"
func main() {
a := make([]byte, 100, 1000)
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
}
出力:
a: AAA b: AAABBB
a: AAA b: AAABBB c: AAACCC
2-移動遊び場(go1.6.2
):
package main
import "fmt"
func main() {
a := make([]byte, 100, 1000)
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
}
出力:go version go1.7rc6
を用い
a: AAA b: AAABBB
a: AAA b: AAACCC c: AAACCC
&[65 65 65 67 67 67]
:
package main
import "fmt"
func main() {
a := make([]byte, 100, 1000)
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
}
O utput:
a: AAA b: AAABBB
a: AAA b: AAACCC c: AAACCC
OP、私は無駄な最初の割り当てを取り除くことで例を簡略化しました。あなたが反対するなら元に戻すことができます。 –
これは実際にはコンパイラが間違って何かを最適化できると誤って思っていて、後で印刷されるときにbの正しい値しか保持しないように見えます。私は、これが例えば1.4.2では起こらないことを確認しました。これは、既に満たされているバグがない場合に、ゴランナットの注意を引くべきです。 –
私は、この例はあなたに多くのことを混乱させる可能性があることを理解します。素晴らしい記事はhttps://blog.golang.org/go-slices-usage-and-internalsです。スライスは何か、それはアレイを指します - それは、どこにポイント、彼の長さと容量を覚えています。通常、容量については気にしませんが、追加では非常に重要です。十分なスペースがあればAppendは前のものとメモリを共有するかもしれませんが、そうでなければ共有しません。私たちの場合は、a = []バイトの後に* fmt.Println(cap(a))*を入れてください。それは私に8を返しました。つまり、bとcは短くなりますが、同じメモリを指し示すことになります。 – lofcek