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

Golang 中的“instanceof”等价物

Golang 中的“instanceof”等价物

Go
墨色风雨 2022-03-03 16:32:37
我有这些结构:type Event interface {    Accept(EventVisitor)}type Like struct {}func (l *Like) Accept(visitor EventVisitor) {    visitor.visitLike(l)}我如何测试它event是一个Like实例?func TestEventCreation(t *testing.T) {    event, err := New(0)    if err != nil {        t.Error(err)    }    if reflect.TypeOf(event) != Like {        t.Error("Assertion error")    }}我得到:类型 Like 不是表达式事件 Event
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

你可以做一个类型断言,看看它是否失败:


event, err := New(0)

if err != nil {

    t.Error(err)

}

_, ok := event.(Like)

if !ok {

    t.Error("Assertion error")

}


查看完整回答
反对 回复 2022-03-03
?
小唯快跑啊

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

TypeOf()方法返回一个类型的对象,您可以使用该方法Type以字符串形式获取该类型的名称。Name()

我没有对此进行测试,但这样的事情可能会奏效:

if reflect.TypeOf(event).Name() != "Like" {


查看完整回答
反对 回复 2022-03-03
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

迟到的答案,但这很好用


package main


import (

  "fmt"

  "reflect"

)


type SomeStruct1 struct{}

type SomeStruct2 struct{}


func IsInstanceOf(objectPtr, typePtr interface{}) bool {

  return reflect.TypeOf(objectPtr) == reflect.TypeOf(typePtr)

}


func main() {

  //sample variables

  someString := "Some String"

  someFloat := float32(2.4)

  someStruct1 := SomeStruct1{}

  someStruct2 := SomeStruct2{}

  someStruct1Ptr := &SomeStruct1{}


  // primitive string

  fmt.Println("string <-> *string \t\t", IsInstanceOf(someString, (*string)(nil)))   //false

  fmt.Println("*string <-> *string \t\t", IsInstanceOf(&someString, (*string)(nil))) //true


  // primitive float32

  fmt.Println("float32 <-> *float32 \t\t", IsInstanceOf(someFloat, (*float32)(nil)))   //false

  fmt.Println("*float32 <-> *float32 \t\t", IsInstanceOf(&someFloat, (*float32)(nil))) //true


  // structure

  fmt.Println("SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(someStruct1, (*SomeStruct1)(nil)))     //false

  fmt.Println("*SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(&someStruct1, (*SomeStruct1)(nil)))   //true

  fmt.Println("*SomeStruct2 <-> *SomeStruct1 \t", IsInstanceOf(&someStruct2, (*SomeStruct1)(nil)))   //false

  fmt.Println("*SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(someStruct1Ptr, (*SomeStruct1)(nil))) //true

}

游乐场(在线运行): https: //play.golang.org/p/tcQqdzUGMlL


查看完整回答
反对 回复 2022-03-03
  • 3 回答
  • 0 关注
  • 348 浏览
慕课专栏
更多

添加回答

举报

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