我正在寫一個程序,它從一個io.Reader讀取數據並將它們緩存在一個bytes.Buffer中。指針和值接收器類型有什麼區別?
type SecureReader struct {
pipe io.Reader
shared *[32]byte
decrypted bytes.Buffer
}
func (s SecureReader) Read(b []byte) (int, error) {
s.decryptPipeIntoBuffer()
return s.decrypted.Read(b)
}
func (s SecureReader) decryptPipeIntoBuffer() (int, error) {/*Lots of code...*/}
我第一次使用價值接收器,因爲我認爲它們是相同的。但是,我注意到我的方法在被調用時不會執行任何操作:SecureReader.Read()將始終返回io.EOF。
我身邊拍着我的頭,改變了接收器類型
func (s *SecureReader) decryptPipeIntoBuffer() (int, error) {/*Lots of code...*/}
現在我的代碼可以神奇地運行。到底是怎麼回事?
這是否意味着每次我調用Read()時都會傳入一個新的SecureReader?爲什麼io.Reader會施加如此尷尬的限制? – 2015-04-05 22:10:08
@SomeNoobStudent一個接口包含一個指向數據的指針,所以複製一個接口並不是什麼大問題。另一方面,複製結構是因爲它阻止了可變性。 – VonC 2015-04-05 22:17:32
哦!多麼啓發!非常感謝!用upvotes淋浴你。 – 2015-04-05 22:20:51