Go學習筆記02
阿新 • • 發佈:2019-02-14
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++的思想。