2017-03-17 18 views
1

私は、次のコードは動作しない理由を把握することはできません。代わりに、それはでresultReceiver.bodyを設定されていないことでなぜ追加がスライスで機能しないのですか?

received 'foo' 
rr.body = 'foo' 
received 'foo' 
rr.body = 'foofoo' 
result = 'foofoo' 

type Writer interface { 
    Write(input []byte) (int, error) 
} 

type resultReceiver struct { 
    body []byte 
} 

func (rr resultReceiver) Write(input []byte) (int, error) { 
    fmt.Printf("received '%s'\n", string(input)) 
    rr.body = append(rr.body, input...) 
    fmt.Printf("rr.body = '%s'\n", string(rr.body)) 

    return len(input), nil 
} 

func doWrite(w Writer) { 
    w.Write([]byte("foo")) 
} 

func main() { 
    receiver := resultReceiver{} 
    doWrite(receiver) 
    doWrite(receiver) 
    fmt.Printf("result = '%s'\n", string(receiver.body)) 
} 

https://play.golang.org/p/pxbgM8QVYB

を私は出力を受け取ることを期待しますすべて?

+7

受信機がポインタである必要があります。https://play.golang.org/p/zsF8mTtWpZ – mkopriva

+0

ありがとうございました!私は参照によってそれを渡そうとしましたが、同じことをしました。修正は、Write()がポインタ上にある必要があるということでした: '* resultReceiver' –

答えて

1

の単なるコピーを受信するための方法を

値構造体へのポインタ。あなたが代わりにメソッドの機能を持っている:

https://play.golang.org/p/zsF8mTtWpZ

チェックアウト囲碁ミスのスティーブFanciaの話。数値45、関数vsメソッドとポインタvs値は、それぞれあなたのために良いリフレッシャーになります。

関連する問題