Golang中的“instanceof”等效项

a0x5cqrl  于 2023-01-15  发布在  Go
关注(0)|答案(5)|浏览(164)

我有这些结构体:

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不是表达式事件事件

zzzyeukh

zzzyeukh1#

您可以只执行一个类型Assert,看看它是否失败:

event, err := New(0)
if err != nil {
    t.Error(err)
}
_, ok := event.(Like)
if !ok {
    t.Error("Assertion error")
}
j8yoct9x

j8yoct9x2#

TypeOf()方法返回一个Type类型的对象,您可以使用Name()方法以字符串的形式获取该类型的名称。
我还没有测试过这个,但类似这样的东西可能会起作用:

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

2g32fytz3#

回答晚了,但这个工作正常

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
}

Playground(在线运行):https://play.golang.org/p/tcQqdzUGMlL

yrefmtwq

yrefmtwq4#

最接近的翻译:

// java
if (x instanceof y) {
    // x is a y
}

是:

// go
if _, ok := x.(y); ok {
    // x is a y
}
unftdfkk

unftdfkk5#

可能需要如下定义Func:
功能(喜欢)接受(访问者事件访问者)

相关问题