如果類型T1
和T2
基於T
類型和類型T
只開始存在從NewT1()
或NewT2()
,有沒有什麼辦法的功能func (*T) WhoAmI()
可以知道它是否「真的」是一個T1
或T2
?在Go中,一種類型被強制轉換爲另一種類型,可以通過一種方法來確定接收器的類型?
package main import "fmt" import "reflect" type T struct { s string } func (v *T) WhoAmI() string { // pull type name with reflect fmt.Println(reflect.TypeOf(v).Elem().Name()) // always prints "T"! // todo: if I am actually T1 return "T1" // todo: else if I am actually T2 return "T2" } type T1 T func NewT1(s string) T1 { return T1{ s } } type T2 T func NewT2(s string) T2 { return T2{ s } } func main() { var t1 = T1{ "xyz" } var t2 = T2{ "pdq" } s1 := ((*T)(&t1)).WhoAmI() // would like to return "T1" s2 := ((*T)(&t2)).WhoAmI() // would like to return "T2" fmt.Println(s1, s2) }
從技術上說:
一次t1
型T1
被強迫T
所以func (*T) WhoAmI()
可以稱爲類型,並t1
完全失去的事實,它的類型是真的T1
?如果不是,我們如何從接收類型T
的方法的角度回收知識?
一般說:如果一種類型是基於另一
換句話說,如果派生類型的變量被強制到基本類型來運行的方法,可以在方法學的實數型的接聽者是誰?
我剛想過'reflect.TypeOf'。不幸的是,該函數將返回您輸入的類型。你確定要演員嗎?如果你使用的是接口,你根本不需要施放。 – Kissaki
如果類型字段不同並且無法投射,鑄造將會失敗!然後你可以嘗試一個演員,並抓住不可能的情況,從而知道它是哪種類型。在沒有不同字段或方法的情況下進行簡單的嘗試,但這並不奏效,因爲投射顯然有效。 – Kissaki
想那樣。你能說出'int(some_float)'是什麼類型嗎? –