Go学习笔记02

来源:互联网 发布:w7内外网转换软件 编辑:程序博客网 时间:2024/06/01 07:49

Go的多态

// test.go project main.gopackage mainimport (    "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.gopackage mainimport (    "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.gopackage mainimport (    "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++的思想。

原创粉丝点击