go 语言面向对象不同于传统的方式,以下通过几个例子来展示 在 go 语言中的面向对象。
go 语言的封装
type Turtle struct {
name string // 其他包不能访问(首字母小写)
Age int // 其他包能访问(首字母大写)
}
func NewTurtle() *Turtle {
return &Turtle{name: "", Age: 0}
}
func (t *Turtle) GetName() string {
return t.name
}
func (t *Turtle) SetName(name string) {
t.name = name
}
// 类似于 java 的 toString() 方法
func (t *Turtle) String() string {
return fmt.Sprintf("turtle name: %s, age: %d", t.name, t.age)
}
go 语言的继承:通过组合的方式
type Animal struct {
Name string
Age int
}
type Turtle struct {
Animal
Weight float64
}
func main() {
t := Turtle{Animal: Animal{Name: "Jerry", Age: 22}, Weight: 100}
fmt.Println(t.Animal)
fmt.Println(t.Animal.Name)
fmt.Println(t.Animal.Age)
fmt.Println(t.Weight)
}
go 语言的多态:通过 interface 实现
type Animal interface {
run()
}
type Turtle struct{}
func (t *Turtle) run() {
fmt.Println("Turtle is running.")
}
type Rabbit struct{}
func (r *Rabbit) run() {
fmt.Println("Rabbit is running.")
}
func main() {
var animal Animal
animal = &Turtle{}
animal.run()
animal = &Rabbit{}
animal.run()
}