&引用;instanceof";Golang中的等价物

&引用;instanceof";Golang中的等价物,go,Go,我有这样的结构: type Event interface { Accept(EventVisitor) } type Like struct { } func (l *Like) Accept(visitor EventVisitor) { visitor.visitLike(l) } 我如何测试事件是一个类似的实例 func TestEventCreation(t *testing.T) { event, err := New(0) if err !=

我有这样的结构:

type Event interface {
    Accept(EventVisitor)
}

type Like struct {
}

func (l *Like) Accept(visitor EventVisitor) {
    visitor.visitLike(l)
}
我如何测试
事件
是一个类似
的实例

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, 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 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
}
主程序包
进口(
“fmt”
“反映”
)
键入SomeStruct1 struct{}
键入SomeStruct2 struct{}
函数IsInstanceOf(objectPtr,typePtr接口{})bool{
返回reflect.TypeOf(objectPtr)=reflect.TypeOf(typePtr)
}
func main(){
//样本变量
someString:=“一些字符串”
someFloat:=float32(2.4)
someStruct1:=someStruct1{}
someStruct2:=someStruct2{}
someStruct1Ptr:=&SomeStruct1{}
//基本字符串
Println(“string*string\t\t”,IsInstanceOf(someString,(*string)(nil))//false
fmt.Println(“*string*string\t\t”,IsInstanceOf(&someString,(*string)(nil))//true
//原始浮点32
fmt.Println(“float32*float32\t\t”,IsInstanceOf(someFloat,(*float32)(nil))//false
fmt.Println(“*float32*float32\t\t”,IsInstanceOf(&someFloat,(*float32)(nil))//true
//结构
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
}

操场(在线运行):

谢谢您的回答。有没有办法从Like类型中获取名称(“Like”?我的意思是,没有硬编码…我认为它更容易使用,就像@dave的答案一样。有什么方法可以抽象这个吗?是否可以像传递函数参数一样传递“类型”?我想用几种类型测试它,给定几种int输入。@bigdestroyer这样做有什么原因吗?不是说类型检查没有它的位置,但它看起来不像你真正想在这里做的。看起来你要做的是在结构上有一个unexported属性,该属性指示其类型,该类型在接口中有一个关联的Getter;从值1开始,创建
后面的
实例,依此类推。每一个都是实现
事件
接口的不同类型。我不希望任何字段指示其类型,只需测试“factory”函数。你怎么认为?你解决了我原来的问题,所以我接受顺便说一句。如果你想将接口与float32这样的基本类型进行比较,你可以使用
If reflect.TypeOf(objectPtr.Kind()==reflect.float32{}
。例如: