Использование интерфейса в Go - PullRequest
13 голосов
/ 12 августа 2011

Я хотел бы понять тип интерфейса с помощью простого примера его использования в Go (Language).

Я читаю веб-документацию, но не понимаю.

Ответы [ 2 ]

39 голосов
/ 12 августа 2011

Идея интерфейсов go - это duck typing . Что просто означает: если вы похожи на утку и крякаете как утка, значит, вы утка. Это означает, что если ваш объект реализует все функции утки, то не должно быть проблем с использованием его в качестве утки. Вот пример:

package main

import (
    "fmt"
)

type Walker interface {
    Walk() string
}

type Human string
type Dog string

func (human Human) Walk() string { //A human is a walker
    return "I'm a man and I walked!"
}

func (dog Dog) Walk() string { //A dog is a walker
    return "I'm a dog and I walked!"
}

//Make a walker walk
func MakeWalk(w Walker) {
    fmt.Println(w.Walk())
}

func main() {
    var human Human
    var dog Dog
    MakeWalk(human)
    MakeWalk(dog)
}

Здесь Human - это Walker, а Dog - это Walker. Зачем? Потому что они оба .. ну ... Walk. Они оба реализуют функцию Walk () string. Вот почему вы можете выполнить MakeWalk для них.

Это очень полезно, когда вы хотите, чтобы разные типы вели себя одинаково. Практическим примером могут быть объекты типа файла (сокеты, файловые объекты) - вам нужны функции записи и чтения для всех из них. Тогда вы можете использовать «Писать и читать» одинаково, независимо от их типа, что здорово.

1 голос
/ 24 января 2013

Другой рабочий пример, показывающий взаимодействие между интерфейсом и структурой

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())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...