"的instanceof"相当于Golang

时间:2016-08-26 17:24:04

标签: go

我有这个结构:

type Event interface {
    Accept(EventVisitor)
}

type Like struct {
}

func (l *Like) Accept(visitor EventVisitor) {
    visitor.visitLike(l)
}

如何测试eventLike个实例?

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

3 个答案:

答案 0 :(得分:29)

您可以直接投射并查看它是否失败:

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

答案 1 :(得分:4)

TypeOf()方法返回Type类型的对象,您可以使用Name()方法将该类型的名称作为字符串。

我还没有测试过这个,但是这样的事情可能有用:

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

答案 2 :(得分:4)

迟到的答案,但这很好用

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