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

在这里插入图片描述

相关文章
|
18天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
18天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
93 71
|
1月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
1月前
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
41 3
|
3月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
34 7
|
3月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
40 5
|
3月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
3月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
4月前
|
XML 存储 JSON
在Go中使用接口:实用性与脆弱性的平衡
在Go中使用接口:实用性与脆弱性的平衡
|
4月前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
50 0