go学习笔记-接口
接口
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。也就是说我们只关心接口实现了什么功能,不关心接口具体怎么实现的。
可能有些东西同学不太理解为什么要有接口,下面举个例子
package main
import "fmt"
type cat struct {}
type dog struct {}
func hit(c cat) { //打猫 猫会叫
fmt.Println("i am speaking")
}
func main() {
c := cat{}
d := dog{}
hit(c) //猫叫可以
hit(d) //狗叫会报错,想要狗叫还得实现另外一个方法
}
我们实现的hit函数,希望传cat dog类型的参数都行,这时候就要用到我们的接口了,下面看看如下代码
package main
import "fmt"
type cat struct {}
type dog struct {}
func (c cat)speak() {
fmt.Println("miao miao miao")
}
func (d dog)speak(){
fmt.Println("wang wang wang")
}
type spaeker interface {
speak()
}
func hit(animal spaeker) { //打动物,动物会叫
animal.speak()
}
func main() {
c := cat{}
d := dog{}
hit(c)
hit(d)
}
接口可以理解成,定义了一个规范(方法),该规范不管传入何结构体,只要该结构体定义了该方法都能调用。在举一个更容易理解的例子,比如公司发工资,各种职工的工资发放不一样,我们只要定义一个发工资的接口,然后把各种职工作为参数穿进去就行了。
空接口
空接口一般用作函数参数,他可以接收任何类型的参数,例如:
func printType(arge... interface{}) {
for _ , v := range arge {
fmt.Printf("%T\n",v)
}
}
也经常用于map
var mp map[string]interface{}
mp的键是string类型,值可以是任何类型