接口(interface)
快一周啦,感觉自己的进度还是有点慢,害,代码就是要多打,不能停,不然过几个月就忘了,所以博客的重要性就来了,继续继续
- 接口是一种类型,通俗来说就是一种约定。
- 使用接口以后,我不关系调用者的类型,只关心能否使用他的某个方法。
- 只要是有这个方法的类型,都可以传入进行
例如:
package main
import "fmt"
type dog struct{}
type cat struct{}
type person struct{}
func (d dog) speak() {
fmt.Println("汪汪汪~")
}
func (c cat) speak() {
fmt.Println("喵喵喵~")
}
func (p person) speak() {
fmt.Println("嘤嘤嘤~")
}
type speaker interface {
speak()
}
func da(x speaker) {
x.speak()
}
func main() {
var d dog
var c cat
var p person
da(d)
da(c)
da(p)
}
//汪汪汪~
//喵喵喵~
//嘤嘤嘤~
- 设置三个类,狗,猫,人,然后调用一个函数,能够调用这个类型里面的speak方法。
- 这就是接口的作用拉。
同一个结构体可以实现多个接口
接口之间还可以进行嵌套
空接口的使用
- 我们在使用map的时候,存放的都是相同的类型变量,如果我们的map里面的v想存放多个类型的时候,我们就可以使用空接口来装了
例如:
- 这样子,我们就可存放多重不同类型的value了。
但是这也有一个新的问题哈,我怎么知道这个map里面的对应的value是什么类型的呢?总不能看一个输出一个 %T 去看一下吧!!啊哈哈哈哈哈
- 想要判断空接口中的值这个时候就可以使用类型断言,其语法格式:
x.(T)
是不是看不明白呀,没关系
- x:表示类型为interface{}的变量
- T:表示断言x可能是的类型。
就是不停的猜猜猜,啊哈哈哈哈哈哈
举个例子
- 是不是直观?啥,你问我有什么用?
- emmmm,遇到了需求就有用了,啊哈哈哈哈哈哈
但是这一直猜下去也不是一个事呀?怎么搞
- 这个,我们搞个函数,用switch语句,一个一个格式都搞里面去,下次直接调用即可啦
- 例子
func isType(x interface{}) {
switch v := x.(type) {
case string:
fmt.Printf("x is a string,value is %v\n", v)
case int:
fmt.Printf("x is a int is %v\n", v)
case bool:
fmt.Printf("x is a bool is %v\n", v)
default:
fmt.Println("unsupport type!")
}
}
- 直接调用即可,嘿嘿