Методы с приемниками значений могут вызываться как для указателей, так и для значений. Методы с получателями указателей могут вызываться только для указателей или адресуемых значений.
Например:
type S struct {
data string
}
func (s S) Read() string {
return s.data
}
func (s *S) Write(str string) {
s.data = str
}
sVals := map[int]S{1: {"A"}}
// Вы можете вызвать только Read, используя значение
sVals[1].Read()
// Это не будет компилироваться:
// sVals[1].Write("test")
sPtrs := map[int]*S{1: {"A"}}
// Вы можете вызвать как Read, так и Write,
// используя указатель
sPtrs[1].Read()
sPtrs[1].Write("test")
Точно так же интерфейс может быть удовлетворен указателем, даже если у метода есть приемник значения.
type F interface {
f()
}
type S1 struct{}
func (s S1) f() {}
type S2 struct{}
func (s *S2) f() {}
s1Val := S1{}
s1Ptr := &S1{}
s2Val := S2{}
s2Ptr := &S2{}
var i F
i = s1Val
i = s1Ptr
i = s2Ptr
// Следующее не компилируется,
// поскольку s2Val является значением,
// а для f нет получателя значения.
// i = s2Val
Читайте также:
- Эффективный Go: методы - указатели и значения
- Эффективный Go: интерфейсы и методы
- Go style guides: указатели на интерфейсы, проверка интерфейса
Комментариев нет:
Отправить комментарий