Понимание интерфейса

Я новичок в 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() звонки верны и будут работать.

Другие вопросы по тегам