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

在这里插入图片描述

相关文章
|
12月前
|
存储 Go
Go语言之接口与多态 -《Go语言实战指南》
Go 语言中的接口是实现多态的核心机制,通过一组方法签名定义行为。任何类型只要实现接口的所有方法即视为实现该接口,无需显式声明。本文从接口定义、使用、底层机制、组合、动态行为到工厂模式全面解析其特性与应用,帮助理解 Go 的面向接口编程思想及注意事项(如 `nil` 陷阱)。
316 22
|
7月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
341 3
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
12月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
337 15
|
12月前
|
Go
Go语言接口的定义与实现
Go 语言的接口提供了一种灵活的多态机制,支持隐式实现和抽象编程。本文介绍了接口的基本定义、实现方式、空接口的使用、类型断言以及接口组合等核心概念,并探讨了接口与 nil 的关系及应用场景。通过示例代码详细说明了如何利用接口提升代码的可扩展性和可测试性,总结了接口的关键特性及其在依赖注入、规范定义和多态调用中的重要作用。
437 14
|
12月前
|
JSON Go C语言
Go语言之定义结构体(Struct)-《Go语言实战指南》
Go 语言中的结构体(`struct`)是一种复合数据类型,可将多个不同类型的字段组合成一个类型。本文介绍了结构体的基本定义、实例创建方式、字段访问与修改、零值特性、比较规则、嵌套使用及标签功能。通过示例代码详细讲解了如何定义和操作结构体,以及其在 JSON 编码等场景的应用。
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
434 71
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
346 1
Go nil 空结构体 空接口有什么区别?
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
234 3

热门文章

最新文章