2016-08-26 18 views
3

で同等の私は、この構造体を持っていますか?"instanceofの" Golang

func TestEventCreation(t *testing.T) { 
    event, err := New(0) 
    if err != nil { 
     t.Error(err) 
    } 
    if reflect.TypeOf(event) != Like { 
     t.Error("Assertion error") 
    } 
} 

は私が取得:

タイプと同様に、式イベントのイベントではありません

答えて

16
それが失敗した場合、あなたはそれをキャストして見ることができる

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

はですこれを抽象化する方法はありますか?関数型のように "型"を渡すことは可能ですか?私はいくつかのint型の入力を与えて、いくつかの型でそれをテストしたいと思います。 –

+0

@bigdestroyerには、このようにしたい理由がありますか?タイプチェックにその場所がないと言っているわけではありませんが、あなたが実際にここでやりたいことのようには思えません。あなたがしたいことは、インターフェイスに関連するゲッターを持つ型を示す、構造体上に非記入済みの属性を持つことだと思われます。 –

+0

さて、値0から 'Like'のインスタンスが作成されたことをテストしたいと思います。値1から、「後続」のインスタンスが作成され、以下同様である。それぞれは 'Event'インタフェースを実装する別の型です。私はそのタイプを示すフィールドを必要とせず、単に "ファクトリ"機能をテストします。どう思いますか?あなたは私の元の質問を解決したので、私はBTWを受け入れます。 –

3

TypeOf()メソッドはタイプTypeのオブジェクトを返し、tそのタイプの名前はName()メソッドの文字列として指定します。

私はこれをテストしていませんが、このような何かが働く可能性があります

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

あなたの答えをありがとう。 Likeのような名前( "Like")を取得する方法はありますか?つまり、ハードコーディングを行わなくても... –

+1

@ daveの答えのように、[type assertions](https://golang.org/ref/spec#Type_assertions)を使う方が簡単だと思います。 –

1

後期答えを、これは細かい

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

+0

interfaceをfloat32のような基本型と比較したいなら、 'if reflect.TypeOf(objectPtr).Kind()== reflect.Float32 {}'を使うことができます。例:https://stackoverflow.com/a/49206944/4206925 – MewX