什么是interface
interface是一组method(方法)的组合,我们通过interface来定义对象的一组行为。
interface类型
interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。
(如果给鸭子模型定义划水的方法,当我再新建立一个鸟的对象,让它实现划水的方法,这时我可以认为鸟也是鸭子)
一个例子:
type Human struct {
name string
age int
phone string
}
type Student struct {
Human //匿名字段Human
school string
loan float32
}
type Employee struct {
Human //匿名字段Human
company string
money float32
}
//Human对象实现Sayhi方法
func (h *Human) SayHi() {
fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}
// Human对象实现Sing方法
func (h *Human) Sing(lyrics string) {
fmt.Println("La la, la la la, la la la la la...", lyrics)
}
//Human对象实现Guzzle方法
func (h *Human) Guzzle(beerStein string) {
fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
}
// Employee重载Human的Sayhi方法
func (e *Employee) SayHi() {
fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
e.company, e.phone) //此句可以分成多行
}
//Student实现BorrowMoney方法
func (s *Student) BorrowMoney(amount float32) {
s.loan += amount // (again and again and...)
}
//Employee实现SpendSalary方法
func (e *Employee) SpendSalary(amount float32) {
e.money -= amount // More vodka please!!! Get me through the day!
}
// 定义interface
type Men interface {
SayHi()
Sing(lyrics string)
Guzzle(beerStein string)
}
type YoungChap interface {
SayHi()
Sing(song string)
BorrowMoney(amount float32)
}
type ElderlyGent interface {
SayHi()
Sing(song string)
SpendSalary(amount float32)
}
通过上面的代码我们可以知道
interface可以被任意对象调用和实现。
一个对象可以实现任意多个interface。
形象的比喻:每个物种都是一个类,我们给这个类定义一系列的行为,例如给鸟类定义可以飞行的行为,给狗定义可以“汪汪”的声音,给人类定义可以说话可以跑步的行为,那么当你和我都实现了说话和跑步的行为,你我都属于人类,你和我都实现了飞行的行为,你我都属于鸟类,以此类推。这么做的意义在于,实现代码的高度使用。
思考:errors 这个 package 里面的 errors.New 到底是做什么的?
errors
包实现了创建错误值的函数。
func New(text string) error
使用字符串创建一个错误,可以类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(...))。
有疑问加站长微信联系(非本文作者)