清风徐来
Michael's Blog
Go的接口

在本教程中,我们将看看Go编程语言中的接口。 go的接口

本节包括2个主题:

  • 接口的基本知识
  • 定义我们自己的接口

##简单案例

如果您看到一个需要空接口的函数或方法,那么您通常可以将任何内容传递给此函数/方法。

package main

import (
    "fmt"
)

func myFunc(a interface{}) {
    fmt.Println(a)
}

func main() {
    var my_age int
    my_age = 25

    myFunc(my_age)
}

运行它

$ go run main.go
25

###有什么作用 通过定义interface{}的函数,我们基本上可以灵活地传递任何我们想要的东西。这个函数接受了一些东西,但我们不一定需要关心它的类型是什么。

##定义接口 那么,什么是接口?为什么我们在Go中使用它们?好吧,通过在Go中定义一个接口,我们基本上定义了一个契约。如果我们根据此接口定义类型,那么我们将必须实现该接口类型中定义的所有函数或方法。

比如说,我们想为吉他手定义一个interface。我们可以定义我们的接口以包含PlayGuitar()函数,如下所示:

type Guitarist interface {
  // PlayGuitar在终端打印出“弹吉他”
  PlayGuitar()
}

通过定义我们的吉他手interface,我们可以定义一个BaseGuitarist和一个AcousticGuitarist结构。

package main

import "fmt"

type Guitarist interface {
    PlayGuitar()
}

type BaseGuitarist struct {
    Name string
}

type AcousticGuitarist struct {
    Name string
}

func (b BaseGuitarist) PlayGuitar() {
    fmt.Printf("%s 演奏低音吉他\n", b.Name)
}

func (b AcousticGuitarist) PlayGuitar() {
    fmt.Printf("%s 弹奏原声吉他\n", b.Name)
}

func main() {
    var player BaseGuitarist
    player.Name = "Paul"
    player.PlayGuitar()

    var player2 AcousticGuitarist
    player2.Name = "Ringo"
    player2.PlayGuitar()
}

我们可以创建一个类型吉他手阵列/数组,可以存储我们的BaseGuitarist和AcousticGuitarist对象。

var guitarists []Guitarist
guitarists = append(guitarists, player)
guitarists = append(guitarists, player2)

##返回值 在实际示例中,我们通常在接口中具有更复杂的函数,这些函数具有返回值。我们可以像这样定义这些接口:

type Employee interface {
    Name() string
    Language() string
    Age() int
    Random() (string, error)
}

##实现接口 假设我们想要在公司中创建一个所有员工的数组。在这个阵列中,我们想要存储所有的工程师。 我们需要我们的Engineer类型来满足Employee接口,否则它将不允许我们编译我们的程序:

package main

type Employee interface {
    Language() string
    Age() int
    Random() (string, error)
}

type Engineer struct {
    Name string
}

func (e *Engineer) Language() string {
    return e.Name + " programs in Go"
}

func main() {
    // 这会引发错误
    var programmers []Employee
    elliot := Engineer{Name: "Elliot"}
    // Engineer 没有实现Employee接口 
    // 你需要实现Age()和Random()
    programmers = append(programmers, elliot)
}

运行不了吧 改成下面的:

package main

type Employee interface {
	Language() string
	Age() int
	Random() (string, error)
}

type Engineer struct {
	Name string
}

func (e Engineer) Language() string {
	return e.Name + " programs in Go"
}

func (e Engineer) Age() int {
	return 18
}

func (e Engineer) Random() (string, error) {
	return e.Name + "hello", nil
}

func main() {
	var programmers []Employee
	elliot := Engineer{Name: "Elliot"}
	programmers = append(programmers, elliot)
}

#小结 go的接口可以模拟oop,需要多花点时间练习。


最后修改于 2019-07-29