読者です 読者をやめる 読者になる 読者になる

DRYな備忘録

Don't Repeat Yourself.

Go言語に継承は無いんですか【golang】

困った

継承が無いのは困った。共通メソッドとかどうすりゃええねん的な。 前回のダックタイピングって一体なんなのよ【golang】 - DRYな備忘録に引き続き、めっちゃ参考にしたのはこれ

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

埋め込み(embed)っていうのがあるのだ

golangはstructの定義にstructの定義を「埋め込む(embed)」ことができる。それはプロパティを持たせるのとは違う。(継承に近い、が、ダックタイピングと合い重なって色々できそうな予感ある)

package main

import "fmt"

// いわゆる基底クラス想定
type MyBase struct {
    count int
}
func (b *MyBase)Increment() int {
    b.count++
    return b.count
}
// 適当なプロパティになってもらいましょう
type MyProperty struct {
    Value string
}
// こっちは上記と同じだけどあえて埋め込むやつ
type AnotherPropery struct {
    AnotherValue string
}

// 別の世界線では、子クラス、と呼ばれるもの
type SubStruct struct {
    *MyBase//埋め込む
    SomePropery *MyProperty//名前のあるプロパティとして持たせる
    *AnotherPropery//埋め込む
}
// "継承"されているはずのメソッドを使ってみる
func (s *SubStruct)IncrementByTwo() int {
    s.Increment()
    return s.Increment()
}

func main() {
    sub := &SubStruct{
        &MyBase{0},
        &MyProperty{"ほげ"},
        &AnotherPropery{"ふがふが"},
    }
    fmt.Println(
        sub.Increment(),// たぶん1
        sub.IncrementByTwo(),// たぶん3
        sub.IncrementByTwo(),// たぶん5
        sub.SomePropery.Value,// たぶん"ほげ"
        /* SomeProperyはプロパティであって埋め込みじゃないので
         * Valueではアクセスできない
         */
        //sub.Value,
        /* 一方、AnotherProperyは埋め込みなので
         * AnotherValueは直でアクセスできる
         */
        sub.AnotherValue,
    )
}

結果

[21:51:20] → go run sample.go
1 3 5 ほげ ふがふが
[21:51:24]

まとめ

  • 継承は無いけど、structの定義の埋め込みがある

こういうことかな

f:id:otiai10:20140115215611j:plain

DRYな備忘録