Понимание интерфейса
Я новичок в Go lang, я пытался понять интерфейс Go, написав простой кусок кода. Я получаю сообщение об ошибке, так как не могу понять, как правильно обращаться к методу интерфейса. Пожалуйста, скажите мне, где я ошибаюсь.
type Info interface {
Noofchar() int
}
type Testinfo struct {
noofchar int
}
func (x Testinfo)Noofchar() int {
return x.noofchar
}
func main(){
var t Info
fmt.Println(x.Testinfo)
fmt.Println("No of char ",t.Noofchar())
x.noofchar++
fmt.Println("No of char ",t.Noofchar())
}
Правильно ли я ссылаюсь на метод с помощью t.Noofchar()? или есть что-то еще, что мне не хватает
2 ответа
Методы обычно получают указатели на структуру.
func (x Testinfo)Noofchar() int {
изменился на
func (x *Testinfo)Noofchar() int {
Достал var x Info
в начале, рефакторинг вашего main()
немного, и полученный код в игре:
package main
import "fmt"
type Info interface {
Noofchar() int
Increment()
}
type Testinfo struct {
noofchar int
}
func (x *Testinfo) Noofchar() int {
return x.noofchar
}
func (x *Testinfo) Increment() {
x.noofchar++
}
func main(){
var t Info = &Testinfo{noofchar:1}
fmt.Println("No of char ",t.Noofchar())
t.Increment()
fmt.Println("No of char ",t.Noofchar())
}
http://play.golang.org/p/6D-LzzYYMU
В вашем примере вы модифицируете x
непосредственно. Если вы передаете интерфейс, у вас нет доступа к базовым структурам данных, только к методам. Так что я изменил ваш прямой прирост на Increment()
метод.
x
переменная, которой вы можете назначить все, что реализует Info
интерфейс. Вы ничего не присвоили этой переменной.
Как только вы назначаете что-то, x.noofchar++
не будет работать, потому что снова x
может содержать все, что реализует Info
интерфейс, что означает, что вы можете получить доступ только к методам, определенным этим интерфейсом. Интерфейсы не позволяют прямой доступ к полям.
Единственный метод, определенный в Info
интерфейс является Noofchar() int
метод, так что это единственный способ взаимодействия со значением, хранящимся в x
,
x
определяется методом приемника (x Testinfo)
совсем не связано с var x Info
переменная. Тот x
имеет прямой доступ к полям структуры.
t.Noofchar()
звонки верны и будут работать.