golang struct継承テスト

1091 ワード

golang structの継承関係を記録する
package main
import (
	"fmt"
)

func main() {
	testDerive()
}

type A struct {
	aa int
	BB string
}

type B struct {
	A
	aa int
	CC string
}

func (a *A) aFunc() {
	fmt.Println("A.aFunc")
}

func (a *A) BFunc() {
	fmt.Println("A.BFunc")
}

func (b *B) aFunc() {
	fmt.Println("B.aFunc")
}

func (b *B) CFunc() {
	fmt.Println("B.CFunc")
}

func testDerive() {
	var tb B
	// 
	fmt.Println(tb.aa)
	fmt.Println(tb.A.aa)
	fmt.Println(tb.BB)
	fmt.Println(tb.A.BB)
	fmt.Println(tb.CC)
	tb.aa = 9
	tb.A.aa = 8
	tb.BB = "A.BB"
	tb.CC = "B.CC"
	fmt.Println(tb.aa)
	fmt.Println(tb.A.aa)
	fmt.Println(tb.BB)
	fmt.Println(tb.A.BB)
	fmt.Println(tb.CC)

	// 
	tb.aFunc()
	tb.A.aFunc()
	tb.BFunc()
	tb.A.BFunc()
	tb.CFunc()
}

出力:
0
0



9
8
A.BB
A.BB
B.CC
B.aFunc
A.aFunc
A.BFunc
A.BFunc
B.CFunc

以上のテストから、次のことがわかります.
1.golangの継承は、大文字と小文字の先頭にある変数と関数を含む親構造体のすべての属性とメソッドを継承します.
2.子構造体と親構造体に同じ名前の変数または関数があり、上書きが発生しない場合は、「親構造名.変数または関数名」で親構造体の同じ名前の変数または関数を呼び出すことができます.