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("接口没有实现")
    }
}

在这里插入图片描述

相关文章
|
14天前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
2月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
31 7
|
2月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
37 5
|
2月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
存储 缓存 NoSQL
在 Go 中使用接口进行灵活缓存
在 Go 中使用接口进行灵活缓存
|
3月前
|
XML 存储 JSON
在Go中使用接口:实用性与脆弱性的平衡
在Go中使用接口:实用性与脆弱性的平衡
|
3月前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
|
3月前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
43 0
|
3月前
|
存储 安全 程序员