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

检查值是否实现接口的说明

检查值是否实现接口的说明

Go
慕容森 2021-09-10 17:22:27
我已经阅读了“Effective Go”和其他类似这样的问答:golang interface compliance compile type check,但我仍然无法正确理解如何使用这种技术。请看例子:type Somether interface {    Method() bool}type MyType stringfunc (mt MyType) Method2() bool {    return true}func main() {    val := MyType("hello")    //here I want to get bool if my value implements Somether    _, ok := val.(Somether)    //but val must be interface, hm..what if I want explicit type?    //yes, here is another method:    var _ Iface = (*MyType)(nil)    //but it throws compile error    //it would be great if someone explain the notation above, looks weird}如果它实现了一个接口,是否有任何简单的方法(例如不使用反射)检查值?
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

如果您不知道值的类型,则只需检查值是否实现了接口。如果类型已知,则该检查由编译器自动完成。


如果你真的想检查一下,你可以用你给出的第二种方法来做:


var _ Somether = (*MyType)(nil)

这会在编译时出错:


prog.go:23: cannot use (*MyType)(nil) (type *MyType) as type Somether in assignment:

    *MyType does not implement Somether (missing Method method)

 [process exited with non-zero status]

您在这里所做的是将MyType类型(和nil值)的指针分配给类型的变量Somether,但由于变量名称是_它被忽略。


如果MyType实现Somether,它将编译并且什么都不做


查看完整回答
反对 回复 2021-09-10
?
繁星coding

TA贡献1797条经验 获得超4个赞

以下将起作用:


val:=MyType("hello")

var i interface{}=val

v, ok:=i.(Somether)


查看完整回答
反对 回复 2021-09-10
?
白板的微信

TA贡献1883条经验 获得超3个赞

也可以通过以下方式使用Implements(u Type) bool方法reflect.Type:


package main


import (

    "reflect"

)


type Somether interface {

    Method() bool

}


type MyType string


func (mt MyType) Method() bool {

    return true

}


func main() {


    inter := reflect.TypeOf((*Somether)(nil)).Elem()


    if reflect.TypeOf(MyType("")).Implements(inter) {

        print("implements")

    } else {

        print("doesn't")

    }

}

您可以在文档中阅读更多相关内容。


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

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