Я писал программу, которая считывает данные из io.Reader и кэширует их в байтах.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 налагает такое неудобное ограничение? –
@SomeNoobStudent интерфейс содержит указатель на данные, поэтому копирование интерфейса не имеет большого значения. Копирование структуры, в другой руке, является тем, что предотвращает изменчивость. – VonC
OH! Как просвещать! Спасибо огромное! Душевая с авокатами. –