Golang在面向对象方面与其他语言的区别

Golang中没有类(class)的概念,但是有结构(struct)的概念。在其他语言(比如C++)中,属性是与方法绑定在一起的,而在go中属性与方法是松耦合的。

一个简单的结构:

type Student struct {
    name string
    id string
    score int
}
方法

方法写在结构的外面,比如我们要为Student对象添加getter和setter,我们应该在Student结构外添加如下代码:

func (self *Student) SetName(name string) {
    self.name = name
}

func (self *Student) SetId(id string) {
    self.id = id
}

func (self *Student) SetScore(score int) {
    self.score = score
}

func (self *Student) Name() string {
    return self.name
}

func (self *Student) Id() string {
    return self.id
}

func (self *Student) Score() int {
    return self.score
}
继承

继承是通过在结构里嵌入其他结构来实现对其他结构的继承的。比如以下代码就是Car继承了Object,拥有了Object中定义的字段:

package main

import (
	"fmt"
)

type Printer interface {
	 Print()
}

type Object struct {
	Owner string
	Price int
}

type Car struct {
	Base Object
	Brand string
}

func (self *Car) Print() {
	fmt.Printf("Owner:%s\n", self.Base.Owner)
	fmt.Printf("Price:%d\n", self.Base.Price)
	fmt.Printf("Brand:%s\n", self.Brand)
}

func main() {
    car := &Car{Object{"coopersong", 1000000}, "BMW"}
    car.Print()
}
封装

字段是否对外暴露(公有还是私有)是通过字段名的大小写决定的。

多态

多态是通过接口实现的,如果不能确定具体类型,可以先用interface{}类型代替。