четверг, 5 ноября 2020 г.

Go style guides: приемники и интерфейсы

Методы с приемниками значений могут вызываться как для указателей, так и для значений. Методы с получателями указателей могут вызываться только для указателей или адресуемых значений.

Например:

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


Читайте также:


Комментариев нет:

Отправить комментарий