亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 中的“instanceof”等價物

Golang 中的“instanceof”等價物

Go
墨色風雨 2022-03-03 16:32:37
我有這些結構: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
查看完整描述

3 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

你可以做一個類型斷言,看看它是否失?。?/p>


event, err := New(0)

if err != nil {

    t.Error(err)

}

_, ok := event.(Like)

if !ok {

    t.Error("Assertion error")

}


查看完整回答
反對 回復 2022-03-03
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

TypeOf()方法返回一個類型的對象,您可以使用該方法Type以字符串形式獲取該類型的名稱。Name()

我沒有對此進行測試,但這樣的事情可能會奏效:

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


查看完整回答
反對 回復 2022-03-03
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

遲到的答案,但這很好用


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


查看完整回答
反對 回復 2022-03-03
  • 3 回答
  • 0 關注
  • 399 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號