先说说接口,接口我理解为一些行为的集合。先来看看代码和允许效果。
package main
import "fmt"
type TypeCalculator interface {
TypeCal() string
}
type Worker struct {
Type int
Name string
}
type Student struct {
Name string
}
func (w Worker) TypeCal() string {
if w.Type == 0 {
return w.Name +"是蓝翔毕业的员工"
} else {
return w.Name+"不是蓝翔毕业的员工"
}
}
func (s Student) TypeCal() string {
return s.Name + "还在蓝翔学挖掘机炒菜"
}
func main() {
worker := Worker{Type:0, Name:"小华"}
student := Student{Name:"小明"}
workers := []TypeCalculator{worker, student}
for _, v := range workers {
fmt.Println(v.TypeCal())
}
}
//运行效果
//小华是蓝翔毕业的员工
//小明还在蓝翔学挖掘机炒菜
开始解释
1. 首先我们写了一个interface,里面有个待实现的方法TypeCal()
type TypeCalculator interface {
TypeCal() string
}
2. 又写了两个结构体Worker和Student
type Worker struct {
Type int
Name string
}
type Student struct {
Name string
}
3. 分别为他们实现了一个与结构体中同名的函数
func (w Worker) TypeCal() string {
if w.Type == 0 {
return w.Name + "是蓝翔毕业的员工"
} else {
return w.Name + "不是蓝翔毕业的员工"
}
}
func (s Student) TypeCal() string {
return s.Name + "还在蓝翔学挖掘机炒菜"
}
4. 分别创建worker和student的实例
worker := Worker{Type:0, Name:"小华"}
student := Student{Name:"小明"}
5. 重点来了,把这两个实例放同一个TypeCalculator的切片中
workers := []TypeCalculator{worker, student}
6. 遍历这个切片,并调用切片中的函数打印结果
for _, v := range workers {
fmt.Println(v.TypeCal())
}
简单分析
从结果上看,确实是不同的实例调用的是各自的函数,这个函数和interface中的函数名和返回值是相同的。那么加入要是某个实例没有实现interface中的函数呢?当把Student对应的函数注释掉,然后再运行程序,程序报错如下(用我的散装英语翻译就是,Student 没有实现TypeCalculator,TypeCal这个函数/方法找不到)
Student does not implement TypeCalculator (missing TypeCal method)
感谢作者:小小程序员Eric
查看原文:Golang中的interface,一看就明白
添加小编微信:grey0805,加入知识学习小分队~!
有疑问加站长微信联系(非本文作者)