学习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的思想。这一方面的内容,确实可以好好研究。
本文完。