go言語の学習メモ7(クラスとして使用)
クラスは存在しない
ので構造体をクラスのように使用するしかない
基本
sample1.go
package main import ( "fmt" ) // 定義 type Car struct{ name string } // メソッド func (p *Car) msg(){ fmt.Println(p.name) } // 初期化 func (p *Car) init(){ p.name = "くるま" } // main func main() { fmt.Println("start") var d Car d.init() d.msg() fmt.Println("end") }
↓
$ go run sample1.go start くるま end $
一番シンプルな方法になります。構造体の中で定義した変数や関数などを使用する場合はfuncの前に構造体のポインタを指定するなどちょっとした対応が必要になるくらい
継承もどき
sample2.go(移譲っぽい?)
package main import ( "fmt" ) /** * Car Class定義 */ // 定義 type Car struct{ name string } // メソッド func (p *Car) msg(){ fmt.Println(p.name) } // 初期化 func (p *Car) init(){ p.name = "くるま" } /** * Bus Class定義 * Car Classよりポインタで埋め込み */ type Bus struct { *Car weight int } // 初期化 func (p *Bus) init2(){ p.init() p.name = "ばす" p.weight = 1000 } // メソッド func (p *Bus) msg2(){ fmt.Println(p.weight) } // main func main() { fmt.Println("start") var d Car d.init() //d2 := Bus{&d, 0} d2 := Bus{&d, 0} d2.init2() d2.msg() // 継承メソッド d2.msg2() // 独自メソッド fmt.Println("end") }
↓
$ go run sample2.go start ばす 1000 end $
sample3.go(継承っぽい?)
package main import ( "fmt" ) /** * Car Class定義 */ // 定義 type Car struct{ name string } // メソッド func (p *Car) msg(){ fmt.Println(p.name) } // 初期化 func (p *Car) init(){ p.name = "くるま" } /** * Bus Class定義 * Car Classよりポインタで埋め込み */ type Bus struct { Car weight int } // 初期化 func (p *Bus) init2(){ p.init() p.name = "ばす" p.weight = 1000 } // メソッド func (p *Bus) msg2(){ fmt.Println(p.weight) } // main func main() { fmt.Println("start") var d Car d.init() var d2 Bus d2.init2() d2.msg() // 継承メソッド d2.msg2() // 独自メソッド fmt.Println("end") }
こちらの場合は宣言時にオブジェクトのポインタ渡しは不要