如果type T2
基于type T1
,除了共享相同的数据字段,T1
和T2
之间是否有任何关系?在Go中,如果T2类型基于T1类型,是否有任何类型的从T1到T2的“继承”?
package main import "fmt" type T1 struct { s string } func (v *T1) F1() string { return v.s } type T2 T1 func (v *T2) F2() string { return v.s } func main() { var t1 = T1{ "xyz" } var t2 = T2{ "pdq" } s0 := t2.F1() // error - expected ok s1 := ((*T1)(&t2)).F1() // ok - expected s2 := ((*T2)(&t1)).F2() // ok - not expected fmt.Println(s0, s1, s2) }
这里我的理解是缺乏
一直希望
T2
将继承T1
的方法,但这种情况并非如此。期待
T2
可以强迫T1
,因为它是从T1
衍生感到惊讶的是
T1
可以强迫T2
,但事实如此。看来
T1
和T2
之间的关系是完全对称的 - 尽管实际上是从另一个实际导出的,但我无法找到任何破坏对称性的东西 - 或者这是幻觉?
(注:我不批评或判断 - 我完全尊重做出的决定 - 只是验证我明白了什么是那里,对我来说是反直觉的 - 我相信我不是唯一一个!)
所以当你说'输入T2 T1'时,发生了什么事情是'T1'的结构被复制为'T2'的结构,并且它们具有相同的结构,它们可以重新对换,否则'T2'与'T1'没有任何关系 –
是的。有很多转换规则。对于这个特定的规则,“T1”和“T2”具有相同的底层类型这一事实意味着它们也具有相同的内存大小,布局和内容。 – peterSO