项目场景:
我们在某些特点场景下,需要判断我们定义的结构体是否实现了我们制定的接口。
解决方案
一般我们可以从两个方面来实现上面需要的功能。
- 如果没有实现接口,编译通不过(ide 也会直接报错)
具体代码
package main
import (
"fmt"
"reflect"
)
type Dark interface {
Run(string)
Speak(string) string
}
type bird struct {
}
type chick struct {
}
func (c *chick) Run(msg string) {
fmt.Printf(msg)
}
func (c *chick) Speak() string {
return ""
}
func (b *bird) Run(msg string) {
fmt.Print(msg)
}
func (b *bird) Speak(string) string {
return ""
}
var (
//判断结构体bird是否实现了Dark接口
_ Dark = (*bird)(nil) //把nil转化成*bird类型 赋值后即丢弃
_ Dark = (*chick)(nil) //没有实现所有方法,所有编译报错
)
func main() {
var bird Dark = (*bird)(nil)
var chick Dark = (*chick)(nil)
fmt.Print(reflect.TypeOf(bird), reflect.TypeOf(chick))
}
可以看到 IDE会直接报错
2 运行时判断是否实现了接口(采用断言的形式来做判断)
package main
import (
"fmt"
)
type People interface {
Say(content string)
}
type Student struct {
}
func (s Student) Say(content string) {
fmt.Println(content)
}
func main() {
var Studenttest interface{}
Studenttest = Student{}
if _, ok := Studenttest.(People); !ok {
panic("接口没有实现")
}
}
如果为上述代码。运行不会报错
如果改为下述代码
package main
import (
"fmt"
)
type People interface {
Say(content string)
}
type Student struct {
}
func (s Student) Say2(content string) {
fmt.Println(content)
}
func main() {
var Studenttest interface{}
Studenttest = Student{}
if _, ok := Studenttest.(People); !ok {
panic("接口没有实现")
}
}