這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
熱乎的代碼來了
package mainimport "fmt"/*繼承一個結構體嵌到另一個結構體,稱作組合匿名和組合的區別如果一個struct嵌套了另一個匿名結構體,那麼這個結構可以直接存取匿名結構體的方法,從而實現繼承如果一個struct嵌套了另一個【有名】的結構體,那麼這個模式叫做組合如果一個struct嵌套了多個匿名結構體,那麼這個結構可以直接存取多個匿名結構體的方法,從而實現多重繼承*/type Car struct { weight int name string}func (p *Car) Run() { fmt.Println("running")}type Bike struct { Car lunzi int}type Train struct { Car}func (p *Train) String() string { str := fmt.Sprintf("name=[%s] weight=[%d]", p.name, p.weight) return str}func main() { var a Bike a.weight = 100 a.name = "bike" a.lunzi = 2 fmt.Println(a) a.Run() var b Train b.weight = 100 b.name = "train" b.Run() fmt.Printf("%s", &b)}
練習2
package mainimport ( "fmt" "time")type Car struct { Name string Age int}func (c *Car) Set(name string, age int) { c.Name = name c.Age = age}type Car2 struct { Name string}//Go有匿名欄位特性type Train struct { Car Car2 createTime time.Time //count int 正常寫法,Go的特性可以寫成 int}//給Train加方法,t指定接受變數的名字,變數可以叫this,t,pfunc (t *Train) Set(age int) { t.int = age}func main() { var train Train train.int = 300 //這裡用的匿名欄位寫法,給Age賦值 //(&train).Set(1000) train.Car.Set("huas", 100 ) train.Car.Name = "test" //這裡Name必須得指定結構體 fmt.Println(train)}