Go语言中的OOP

2016/07/15 Golang

学习Golang差不多五个多月了,从一开始的“不习惯”(作为一名Ruby程序员,Go的语法和Ruby还是有较大不同),到现在逐渐能接受Go语言的整体架构的思想。 这篇文章是对Golang语言中OOP思想的个人总结。将会用Ruby中的OOP内容进行一个对比。

先来造一辆汽车。

# ruby code
class Car
  attr_accessor :wheel, :engine

  def run
  end

  def speed
  end
end
// go code
type Car struct {
    wheel string
    engine string
}

func (car *Car)Run{

}

func (car *Car)Speed{

}

在Ruby中,一切事物皆对象。而在Go中,一切事物皆是类型(某位go大牛说的,也许不一定完全准确)。

public、private 方法的定义

# ruby code
class Car
  attr_accessor :wheel, :engine

  def run
  end

  def speed
  end

  private
  def color
  end
end
// go code
type Car struct {
    wheel string
    engine string
}

func (car *Car)Run{

}

func (car *Car)Speed{

}

func (car *Car)color() string{

    return color
}

Ruby中用了private来区分private方法。而Go用小写字母开头的方法为private方法,大写字母开头的为public方法。

继承
# ruby code
class Roadster < Car

end
type Roadster struct {
    Car  //继承Car类型
}

type Roadster struct {
    *Car  //虚拟继承Car类型
}

type Roadster struct {
    CarInterface  //继承CarInteface接口
}

Go中没有继承的概念。而是通过组合模拟继承。不需要指定类型名称,隐式的调用“继承”的类型的方法。

接口

在Ruby中是没有interface这样的概念的,而Ruby中有Mixin。使用Mixin来达到interface的效果。

module CarInfo
  def price
  end

  def brand
  end
end

class Car
  include CarInfo
end

car = Car.new
car.price
car.brand

Go有interface。Go的interface和Java中的interface有所不同。是非声明接口。不像Java中需要声明调用了哪个接口。

type CarInfo interface{
    Price() float64
    Brand() string
}

type Car struct {
    wheel string
    engine string
}

func (car *Car) Price() float64{

}

func (car *Car) Brand() string{

}

Go的接口是相当灵活和强大的。Go中很多包、库的设计都用到了Go interface的思想。这一方面的内容,确实可以好好研究。

本文完。

Search

    Table of Contents