前言

JavaJava
Go
JavaerGo

OOP

Object Oriented ProgrammingOOP
Go
Yes and No.Go

面向对象有着三个重要特征:

  1. 封装
  2. 继承
  3. 多态

封装

GoClassstruct
type Car struct {
    Name string
    Price float32
}
Javastruct
Car
func (car *Car) Info()  {
    fmt.Printf("%v price: [%v]", car.Name, car.Price)
}

func main() {
    car := Car{
        Name: "BMW",
        Price: 100.0,
    }
    car.Info()

}
(car *Car)CarcarJavathisPythonselfgo
Javathis

匿名结构体

Go
func upload(path string) {
    body, err := ioutil.ReadAll(res.Body)
    smsRes := struct {
        Success bool   `json:"success"`
        Code    string `json:"code"`
        Message string `json:"message"`
        Data    struct {
            URL string `json:"url"`
        } `json:"data"`
        RequestID string `json:"RequestId"`
    }{}
    err = json.Unmarshal(body, &smsRes)
    fmt.Printf(smsRes.Message)
}
Go

这点在我们调用外部接口解析响应数据时非常有用,创建一个临时的结构体也不用额为维护;同时还能用面向对象的方式获取数据。

map

继承

GoJavaC++
Javaer

相信大部分新手看到这图时就已经懵逼,更别说研究各个类之间的关系了。

不过这样好处也明显:如果我们抽象合理,整个系统结构会很好维护和扩展;但前提是我们能抽象合理。

Go
type ElectricCar struct {
    Car
    Battery int32
}

func main() {
    xp := ElectricCar{
        Car{Name: "xp", Price: 200},
        70,
    }
    fmt.Println(xp.Name)

}
struct

接口(多态)

面向接口编程的好处这里就不在赘述了,我们来看看 Go 是如何实现的:

type ElectricCar struct {
    Car
    Battery int32
}
type PetrolCar struct {
    Car
    Gasoline int32
}

//定义一个接口
type RunService interface {
    Run()
}

// 实现1
func (car *PetrolCar) Run() {
    fmt.Printf("%s PetrolCar run \n", car.Name)
}

// 实现2
func (car *ElectricCar)Run() {
    fmt.Printf("%s ElectricCar run \n", car.Name)
}

func Do(run RunService) {
    run.Run()
}

func main() {
    xp := ElectricCar{
        Car{Name: "xp", Price: 200},
        70,
    }
    petrolCar := PetrolCar{
        Car{Name: "BMW", Price: 300},
        50,
    }
    Do(&xp)
    Do(&petrolCar)

}
RunServiceElectricCarPetrolCar
Goimplement
Python鸭子类型

详细介绍可以参考这篇:Python 中的面向接口编程

struct
type DiService interface {
    Di()
}

//定义一个接口
type RunService interface {
    DiService
    Run()
}
GostructDiService
总结
Yes and No.GoJavaobject(对象)GoOOP

是否为面向对象我觉得并不重要,主要目的是我们能写出易扩展好维护的代码。

例如官方标准库中就有许多利用接口编程的例子:

GoGoGo