У меня есть этот пример кодаметод Golang с указателем приемника
package main
import (
"fmt"
)
type IFace interface {
SetSomeField(newValue string)
GetSomeField() string
}
type Implementation struct {
someField string
}
func (i Implementation) GetSomeField() string {
return i.someField
}
func (i Implementation) SetSomeField(newValue string) {
i.someField = newValue
}
func Create() IFace {
obj := Implementation{someField: "Hello"}
return obj // <= Offending line
}
func main() {
a := Create()
a.SetSomeField("World")
fmt.Println(a.GetSomeField())
}
SetSomeField
не работает, как ожидалось, потому что его приемник не имеет тип указателя.
Если изменить метод приемника указателя, что я ожидал бы работать, это выглядит следующим образом:
func (i *Implementation) SetSomeField(newValue string) { ...
Компиляция это приводит к следующей ошибке:
prog.go:26: cannot use obj (type Implementation) as type IFace in return argument:
Implementation does not implement IFace (GetSomeField method has pointer receiver)
Как может У меня есть struct
реализовать интерфейс и метод SetSomeField
изменить значение фактического экземпляра без создания копии?
Вот фрагмент кода взломать: https://play.golang.org/p/ghW0mk0IuU
Я уже видел этот вопрос In go (golang), how can you cast an interface pointer into a struct pointer?, но я не могу понять, как это связано с этим примером.
Оба метода требуют указатель приемников, иначе вы только реализуете часть интерфейса. – elithrar