如果type T2基于type 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是完全对称的 - 我找不到任何破坏对称性的东西,尽管事实上一个实际上来自另一个 - 或者这是一种幻觉?
(注意:我不是在批评或评判 - 我完全尊重做出的决定 - 只是验证我理解对我来说有什么反直觉 - 我确信我不是唯一的!)
Go不支持面向对象的类型继承.
方法绑定到单个特定类型.
甲方法声明结合的标识符的方法.据说该方法绑定到基类型,并且仅在该类型的选择器中可见.
你可以转换类型之间T1和T2.
值
x可以转换为T[when]x类型,并T具有相同的基础类型.
例如,
package main
import (
"fmt"
)
type T1 struct{ i int }
func (t T1) String() string { return "T1" }
type T2 T1
func (t T2) String() string { return "T2" }
func main() {
t1 := T1{1}
t2 := T2{2}
fmt.Println(t1, t2)
c1 := T1(t2)
c2 := T2(t1)
fmt.Println(c1, c2)
t1 = T1(c2)
t2 = T2(c1)
fmt.Println(t1, t2)
}
Output:
T1 T2
T1 T2
T1 T2
Run Code Online (Sandbox Code Playgroud)