登录
首页 >  Golang >  Go问答

如何检查接口是否实现了结构体的全部公开方法?

来源:stackoverflow

时间:2024-02-23 10:36:23 457浏览 收藏

哈喽!今天心血来潮给大家带来了《如何检查接口是否实现了结构体的全部公开方法?》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我正在开发一个 go 库,其中使用 interfacer 工具 (https://github.com/rjeczalik/interfaces) 从结构创建接口,然后运行 ​​moq (https:// github.com/matryer/moq)为该接口生成模拟对象。现在我想编写一个单元测试,如果有人向结构添加导出的方法而不更新接口和模拟,该测试就会失败。

在高层次上,在我看来,我可以获取接口和结构的 reflect.value 并在每个上调用 nummethod() ,然后检查数字是否相等。然而,我正在努力实现这个想法。

例如,如果我尝试这样做:

package main

import (
    "fmt"
    "reflect"
)

type personinterface interface {
    getname() string
}

type person struct {
    name string
}

func (person *person) getname() string {
    return person.name
}

func main() {
    person := person{}
    v := reflect.valueof(&person)
    fmt.println(v.nummethod())

    var personinterface personinterface
    w := reflect.valueof(personinterface)
    fmt.println(w.nummethod())
}

我可以调用 get person 的方法数量,但不能调用 personinterface 的方法数量,因为这会出现错误消息

反射:对零值调用reflect.value.nummethod

这是完整的错误:

> go run assert_struct.go
1
panic: reflect: call of reflect.Value.NumMethod on zero Value

goroutine 1 [running]:
reflect.Value.NumMethod(0x0, 0x0, 0x0, 0x1)
    /usr/local/Cellar/[email protected]/1.12.12/libexec/src/reflect/value.go:1262 +0xc1
main.main()
    /Users/kurt/Documents/Scratch/assert_struct.go:27 +0x1a5
exit status 2

如何获取 interface 实现的方法数量,更一般地说,如何检查接口是否实现结构体的所有导出方法?


解决方案


要将 mkopriva 的 go 练习注释转换为答案,需要在指向接口 (personinterface) 的指针上调用 reflect.valueof(),然后需要在该接口上调用 elem()

package main

import (
    "fmt"
    "reflect"
)

type PersonInterface interface {
    GetName() string
}

type Person struct {
    Name string
}

func (person *Person) GetName() string {
    return person.Name
}

func main() {
    person := Person{}
    v := reflect.ValueOf(&person)
    fmt.Println(v.NumMethod())

    var personInterface PersonInterface
    w := reflect.ValueOf(&personInterface)
    fmt.Println(w.Elem().NumMethod())
}

这实际上类似于“反射三定律”博客 (https://blog.golang.org/laws-of-reflection) 中描述的设置值的过程。

本篇关于《如何检查接口是否实现了结构体的全部公开方法?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>