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