go判断结构体是否实现接口的几种方式

简介: go判断结构体是否实现接口的几种方式

项目场景:

我们在某些特点场景下,需要判断我们定义的结构体是否实现了我们制定的接口。


解决方案

一般我们可以从两个方面来实现上面需要的功能。

  1. 如果没有实现接口,编译通不过(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("接口没有实现")
    }
}

在这里插入图片描述

相关文章
|
2月前
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
20 2
|
13天前
|
存储 缓存 NoSQL
在 Go 中使用接口进行灵活缓存
在 Go 中使用接口进行灵活缓存
|
13天前
|
XML 存储 JSON
在Go中使用接口:实用性与脆弱性的平衡
在Go中使用接口:实用性与脆弱性的平衡
|
13天前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
|
13天前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧
|
18天前
|
Go
Go 语言中的“继承”:使用结构体实现代码重用
Go 语言中的“继承”:使用结构体实现代码重用
23 0
|
22天前
|
Go 索引
go语言结构体使用小结
go语言结构体使用小结
26 0
|
2月前
|
Go
go结构体的定义
go结构体的定义
17 1
|
2月前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
2月前
|
Go
掌握Go语言:Go语言接口精解,实现多态性与灵活性的利器(31)
掌握Go语言:Go语言接口精解,实现多态性与灵活性的利器(31)