89123


[こちら](https://github.com/golang/go/wiki/CodeReviewComments#copying)にbytes.Buffer型をコピーするときは注意したほうがいいと書いてありますが、副作用に関する記述がよくわかりませんでした。

> the slice in the copy may alias the array in the original, causing
> subsequent method calls to have surprising effects.

bytes.Bufferの中身は確認してbufというスライスがあるのは確認できました。

[code]

    // A Buffer is a variable-sized buffer of bytes with Read and Write methods.
    // The zero value for Buffer is an empty buffer ready to use.
    type Buffer struct {
        buf      []byte // contents are the bytes buf[off : len(buf)]
        off      int    // read at &buf[off], write at &buf[len(buf)]
        lastRead readOp // last read operation, so that Unread* can work correctly.
    }
    
[/code]

bytes.Buffer型をコピーする際は結局どうすればよろしいでしょうか。  
そもそもコピーしてはいけないのでしょうか。


CC BY-SA 4.0
2022-05-21T20:31:12.007
88974
2022-05-29T13:43:36.817
52736
question
go
構造体の変数をコピーする危険性について詳しく教えて下さい。


  * sliceをコピーするというのは、実際にはポインタをコピーしていて、実際の値が格納されているメモリはコピー元とコピー先で同一のものを参照する 
    * 参考: [Golang における配列とスライスのコピー時の違い - Qiita](https://qiita.com/k_yuda/items/11fac8895511ed46ce66)の図がわかりやすいかと。
  * つまりsliceを持っているような構造体を不用意にコピーしてしまうと、コピー先だけ変更したつもりが、コピー元も同時に変更してしまう、というようなことが起こりうる 
    * これはSliceに限らず、構造体のメンバがポインタ型の場合には起こりうる
  * このため、提示されたリンク先では、よく知らない別パッケージの構造体の不用意なコピーはするんじゃないぞ、と言っているのだと思います。

バッファをコピーする意図がよくわかりませんが、`byte.Buffer`でバッファリングしてるデータを別のBufferでも持ちたいということであれば、[go
- Write (or copy) the contents of one bytes.Buffer to another - Stack
Overflow](https://stackoverflow.com/questions/69758147/write-or-copy-the-
contents-of-one-bytes-buffer-to-
another)に記載されているように、コピー元のバッファを一度書き出して、それをコピー先のバッファで`byte.Buffer.Write`するのが一案かもしれません

※なお、単純にsliceをcopyするようなケースでは、ビルトインのcopy関数を使うと想定したように値まで含めてコピーしてくれます


CC BY-SA 4.0
2022-05-29T13:43:36.817
89123
2022-05-29T13:43:36.817
12561
88974
answer