1. 程式人生 > >Go學習筆記02

Go學習筆記02

Go的多型

// test.go project main.go
package main

import (
    "fmt"
)

func init() {
}

type user struct {
    name string
    age  int
}

func (u *user) notify() {
    fmt.Printf("User %v, age %v\n", u.name, u.age)
}

type admin struct {
    name string
    age  int
    qq   string
}

func (u *admin) notify() {
    fmt.Printf("Admin %v, age %v, qq %v\n"
, u.name, u.age, u.qq) } type Notifyer interface { notify() } func sendNotify(n Notifyer) { n.notify() } func main() { u1 := user{ name: "zhangsan", age: 17, } a1 := admin{ name: "lisi", age: 99, qq: "12306", } sendNotify(&u1) sendNotify(&a1) }

Go的繼承

// test.go project main.go
package main

import (
    "fmt"
)

func init() {
}

type user struct {
    name string
    age  int
}

func (u *user) notify() {
    fmt.Printf("User %v, age %v\n", u.name, u.age)
}

type admin struct {
    user
    level string
}

func main() {
    u1 := admin{
        user: user{
            name: "zhangsan"
, age: 17, }, level: "aaaa", } fmt.Println(u1.age) // 將User的age提升到了admin u1.notify() // 這裡將user的方法提升到admin u1.user.notify() }

但是,admin是可以覆蓋user的行為的:

// test.go project main.go
package main

import (
    "fmt"
)

func init() {
}

type user struct {
    name string
    age  int
}

func (u *user) notify() {
    fmt.Printf("User %v, age %v\n", u.name, u.age)
}

type admin struct {
    user
    age   int
    level string
}

func (u *admin) notify() {
    fmt.Printf("Admin %v, age %v, level %v\n", u.name, u.age, u.level)
}

func main() {
    u1 := admin{
        user: user{
            name: "zhangsan",
            age:  17,
        },
        age:   99,
        level: "aaaa",
    }
    fmt.Println(u1.age, u1.user.age) // 這兩個是不一樣的,前者屬於admin的99,後者為user的17
    u1.notify() // 呼叫 admin的notify
    u1.user.notify() // 呼叫user的notify
}

總結:go沒有完全脫離C++的影子,它的基本的原理遵循C++的思想。