Я пытаюсь понять интерфейсы Golang (1.12). Я обнаружил, что указатели на интерфейсы должны быть явно разыменованы, в отличие от структур:
import "fmt"
// A simple interface with one function
type myinter interface {
hello()
}
// Implement myinter
type mystruct struct {}
func (mystruct) hello() {
fmt.Println("I am T!")
}
// Some function that calls the hello function as defined by myinter
func callHello(i *myinter) {
i.hello() // <- cannot resolve reference 'hello'
}
func main() {
newMystruct := &mystruct{}
callHello(newMystruct)
}
Здесь моя функция callHello
не может разрешить ссылку на мою функцию hello
, как определено в интерфейсе. Конечно, разыменование интерфейса работает:
func callHello(i *myinter) {
(*i).hello() // <- works!
}
Но в структурах мы можем вызвать функцию напрямую, Нет необходимости в этой громоздкой записи разыменования :
func callHello(s *mystruct) {
s.hello() // <- also works!
}
Почему это так? Есть ли причина, по которой мы должны явно разыменовывать указатели interface
? Go пытается отговорить меня от передачи interface
указателей в функции?