猿问

Golang 中的“instanceof”等价物

我有这些结构:


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


墨色风雨
浏览 349回答 3
3回答

PIPIONE

你可以做一个类型断言,看看它是否失败:event, err := New(0)if err != nil {    t.Error(err)}_, ok := event.(Like)if !ok {    t.Error("Assertion error")}

小唯快跑啊

该TypeOf()方法返回一个类型的对象,您可以使用该方法Type以字符串形式获取该类型的名称。Name()我没有对此进行测试,但这样的事情可能会奏效:if reflect.TypeOf(event).Name() != "Like" {

斯蒂芬大帝

迟到的答案,但这很好用package mainimport (&nbsp; "fmt"&nbsp; "reflect")type SomeStruct1 struct{}type SomeStruct2 struct{}func IsInstanceOf(objectPtr, typePtr interface{}) bool {&nbsp; return reflect.TypeOf(objectPtr) == reflect.TypeOf(typePtr)}func main() {&nbsp; //sample variables&nbsp; someString := "Some String"&nbsp; someFloat := float32(2.4)&nbsp; someStruct1 := SomeStruct1{}&nbsp; someStruct2 := SomeStruct2{}&nbsp; someStruct1Ptr := &SomeStruct1{}&nbsp; // primitive string&nbsp; fmt.Println("string <-> *string \t\t", IsInstanceOf(someString, (*string)(nil)))&nbsp; &nbsp;//false&nbsp; fmt.Println("*string <-> *string \t\t", IsInstanceOf(&someString, (*string)(nil))) //true&nbsp; // primitive float32&nbsp; fmt.Println("float32 <-> *float32 \t\t", IsInstanceOf(someFloat, (*float32)(nil)))&nbsp; &nbsp;//false&nbsp; fmt.Println("*float32 <-> *float32 \t\t", IsInstanceOf(&someFloat, (*float32)(nil))) //true&nbsp; // structure&nbsp; fmt.Println("SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(someStruct1, (*SomeStruct1)(nil)))&nbsp; &nbsp; &nbsp;//false&nbsp; fmt.Println("*SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(&someStruct1, (*SomeStruct1)(nil)))&nbsp; &nbsp;//true&nbsp; fmt.Println("*SomeStruct2 <-> *SomeStruct1 \t", IsInstanceOf(&someStruct2, (*SomeStruct1)(nil)))&nbsp; &nbsp;//false&nbsp; fmt.Println("*SomeStruct1 <-> *SomeStruct1 \t", IsInstanceOf(someStruct1Ptr, (*SomeStruct1)(nil))) //true}游乐场(在线运行): https: //play.golang.org/p/tcQqdzUGMlL
随时随地看视频慕课网APP

相关分类

Go
我要回答