golang中接口查询

时间:2021-01-24 18:26:41

什么是接口查询

接口查询,就是在一个接口变量中,去判断,那个把值赋给接口变量的对象,究竟有没有实现另一个接口,这个所谓的另一个接口,就是我要查询的那个接口。在这个已知的接口变量中,查询另一个接口的过程,就是接口查询了。

接口查询作用

通过接口查询,我们可以操作这个还原赋值给这个接口变量的对象的更加全面的功能。如赋值给这个接口变量的对象,实现了很多个接口,当他把值赋给这个接口后,那么这个接口变量就只能操作这个接口定义的方法了,相当于这个对象的一些功能就丢失了。通过接口查询,我们来充分的挖掘这个对象的更多功能

接口查询代码实操

package main

import (
"fmt"
)

type R interface {
Read()
}

type W interface {
Write(name string)
}

type RW interface {
R
W
}

type log struct {
name []string
r int
}

func (t *log) Read() {
if len(t.name) > t.r {
fmt.Println(t.name[t.r])
t.r++
} else {
fmt.Println("empty")
}
}
func (t *log) Write(name string) {
t.name = append(t.name, name)
fmt.Println("wirte success.", t.name)

}
func main() {
var r R = &log{}
var w W = &log{}
w.Write("write first")
w.Write("write second")
r.Read()
r.Read()
val, ok := w.(RW)
if !ok {
fmt.Println("hi")
} else {
val.Read()
val.Read()
}
}

上边代码中的R接口,定义了Read方法,W接口,定义了Write方法。RW接口通过组合R与W,相当于定义了Read方法与Write方法。
log类实现了上边的3个接口。在实例化log过程中,分别将值赋给R接口和W接口。那么问题就来了,R接口变量,只能访问Read方法,W接口变量,只能访问Write方法,也就是一个只能写进去,读不出来,一个只能读,但是没写入方法,读出来自然就是空值了。
下边通过接口查询,来充分发挥log对象的功能。
在W接口变量中,查询赋值给他的log对象,是否实现了RW接口,如果实现了,则返回一个RW接口变量,查询的语法也非常简单,如下所示:

    val, ok := w.(RW)

如果能查询到ok为true,否则为false。