interface実装の省略
概要
インターフェースに構造体渡して紐付けたいけど、構造体をジェネレートしてインターフェースにぶっこむのが面倒なんじゃ〜って時の方法。
Before
type template interface { Sleep() } type BeginnerEngineer struct { name string age int } func (b *BeginnerEngineer) Sleep() { fmt.Prinln("zzzzz......") } func GenerateBeginner(name string, age int) *BeginnerEngineer { return &BegineerEngineer{ name :name, age: age, } func main() { var templateInterface := GenerateBeginnerEngineer("シド・ガーロンド", 30) templateInterface.Sleep() // => zzzzz...... }
After
type template interface { Sleep() } type BeginnerEngineer struct { name string age int } func (b *BeginnerEngineer) Sleep() { fmt.Prinln("zzzzz......") } // ここで、戻り値を Struct => interface に変更している func GenerateBeginner(name string, age int) template { return &BegineerEngineer{ name :name, age: age, } func main() { var beginnerEngineer := GenerateBeginnerEngineer("シド・ガーロンド", 30) beginnerEngineer.Sleep() // => zzzzz...... }
変わったこと
interface呼び出し→構造体のインスタンス化→interfaceに構造体インスタンスを突っ込む
という流れから
構造体のインスタンス化(戻り値がインターフェース)
に省略された。
やってることは同じだけど、GenerateBeginner()メソッド1人でインターフェースの実装もやってくれるから気持ちすっきりする気がする。