在Go中,如果类型T2基于类型T1,那么T1到T2之间是否有任何"继承"?

cc *_*ung 8 types go

如果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 )
}

我的理解是缺乏的

  1. 我希望T2能继承T1这种方法,但事实并非如此.

  2. 期待T2可能被强制进入T1,因为它来源于T1

  3. 我很惊讶T1可以被强迫进入T2,但事实却如此.

  4. 似乎T1和之间的关系T2是完全对称的 - 我找不到任何破坏对称性的东西,尽管事实上一个实际上来自另一个 - 或者这是一种幻觉?

(注意:我不是在批评或评判 - 我完全尊重做出的决定 - 只是验证我理解对我来说有什么反直觉 - 我确信我不是唯一的!)

pet*_*rSO 8

Go不支持面向对象的类型继承.

Go是一种面向对象的语言吗?

为什么没有类型继承?

方法绑定到单个特定类型.

方法声明结合的标识符的方法.据说该方法绑定到基类型,并且仅在该类型的选择器中可见.

你可以转换类型之间T1T2.

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)