为了账号安全,请及时绑定邮箱和手机立即绑定

检查方法类型是否与函数类型匹配

检查方法类型是否与函数类型匹配

Go
幕布斯6054654 2022-06-06 17:13:58
给定以下示例,如何检查方法是否与函数签名匹配?package mainimport (    "fmt"    "context"    "reflect")// signature to checktype Fn func(context.Context)type testStruct struct {}func (*testStruct) DoSomething(context.Context){}func (*testStruct) DoSomethingElse([]byte){}func main() {    structType := reflect.TypeOf(&testStruct{})    for i := 0; i < structType.NumMethod(); i++ {        fmt.Println("======================")        method := structType.Method(i)        fmt.Println(method.Name)        fmt.Println(method.Type.String())        // compare method and Fn signature    }}https://play.golang.org/p/rIDfp0E14ge
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

1.使用reflect.Value.Type().ConvertibleTo

注意reflect.ValueOfinstedreflect.TypeOf


package main


import (

    "context"

    "fmt"

    "reflect"

)


type Fn func(context.Context)


type testStruct struct{}


func (*testStruct) DoSomething(context.Context)           {}

func (*testStruct) DoSomethingElse([]byte)                {}

func (*testStruct) DoSomethingElse2(context.Context) error { return nil }


func main() {

    structType := reflect.ValueOf(&testStruct{})

    for i := 0; i < structType.NumMethod(); i++ {

        fmt.Println("======================")

        method := structType.Method(i)


        // compare method and Fn

        if method.Type().ConvertibleTo(reflect.TypeOf((Fn)(nil))) {

            fmt.Println("function of correct type")

        }

    }

}


https://play.golang.org/p/A9_bpURinad


2. 分别检查输入和输出

package main


import (

    "context"

    "fmt"

    "reflect"

)


type Fn func(context.Context)


type testStruct struct{}


func (*testStruct) DoSomething(context.Context) {}

func (*testStruct) DoSomethingElse([]byte)      {}


func main() {

    structType := reflect.TypeOf(&testStruct{})

    rctx := reflect.TypeOf(new(context.Context)).Elem()

    for i := 0; i < structType.NumMethod(); i++ {

        fmt.Println("======================")

        method := structType.Method(i)

        fmt.Println(method.Name)

        fmt.Println(method.Type.String())


        if method.Type.NumIn() != 2 {

            fmt.Println("wrong number of inputs, expected 1")

            continue

        }


        if method.Type.In(1) != rctx {

            fmt.Println("input of wrong type, expected context.Context")

            continue

        }


        if method.Type.NumOut() != 0 {

            fmt.Println("wrong number of outputs, expected 0")

            continue

        }


        fmt.Printf("%v is a function of correct type\n", method.Name)

    }

}

https://play.golang.org/p/YDsJ9MSiumF


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信