Go是面向对象的,但没有如下概念:
我们首先看看Go使用type来表达类型,type关键词定义了一个新的类型,声明作为一个struct,在struct中每个字段可以有一个名称(如下面的Name 和Main),或另外一个struct:
type weatherData struct {
Name string `json:"name"`
}
所有类型都是平等地创建,定义类型的方法是如下定义,不像Java中在Class中定义:
type Door struct {
opened bool
}
func (d *Door) Open() {
d.opened = true
}
func (d *Door) Close() {
d.opened = false
}
这是Door结构类型中有open()和close()两个方法。类似Java的setter/getter。
对于初始类型也可以这样创建:
type Door bool
func (d *Door) Open() {
*d = true
}
func (d *Door) Close() {
*d = false
}
这里是将初始类型bool赋值为true或fals的两个方法。
接口是Go语言的重要特点,其重要性超过协程,它和Java接口有些类似,如下:
In Java:
interface Switch {
void open();
void close();
}
In Go:
type OpenCloser interface {
Open()
Close()
}
与Java的接口不同的是,Go的接口是不需要显式声明继承的,它是隐式通过编译器根据方法签名匹配的,比如,在Java中实现接口Switch需要编写代码:
public class SwitchImpl implements Switch{ //实现具体内容}
而在Go中接口是隐式通过编译器实现的,前面type Door bool我们已经定义了Door这个类型有两个方法Open和Close,而这里有一个接口type OpenCloser interface申明了两个方法也是Open和Close,编译器也就认为Door implements OpenCloser了。
Go的接口与实现关系是一种隐式满足implicit satisfaction,如果一个类型type定义实现了一个接口的所有方法,那么就认为这个type满足了接口, 隐式满足Implicit satisfaction ==无显式 "implements"代码。它是一种duck typing的Structural subtyping,好处是:
从Go的接口我们看出Go是注重组合超过继承。