Go语言没有类和继承的概念,可是接口的存在使得它能够实现不少面向对象的特性。接口定义了一些方法,可是这些方法不包含实现的代码。也就是说这些代码没有被实现(抽象的方法)。同时接口里面也不包含变量。golang
看一个简单的接口定义:编程
type inf interface {函数
Method1(param)spa
Method2(param)对象
}继承
在go语言中接口通常包含0-3个方法。类型(如结构体)实现了接口中的方法,就是实现了接口,实现了接口类型的结构体变量能够赋值给接口类型的变量,直接看一个例子帮助理解:接口
package mainget
import (string
"fmt"it
)
type stockPosition struct {
ticker string
sharePrice float32
count float32
}
func (s stockPosition) getValue() float32 {
return s.sharePrice * s.count
}
type valueable interface {
getValue() float32
}
func showValue(asset valueable) {
fmt.Printf("value of the asset is %f\n", asset.getValue())
}
func main() {
var o valueable
o = stockPosition{"GOOG", 577.20, 4}
showValue(o)
}
Output:value of the asset is 2308.800049
主函数中声明了一个valueable的接口o,而后将实现了这个接口的结构体赋值给了o。Golang的接口不须要显示的声明,好处有:
1.在接口实现过程当中只要关心本身要提供哪些方法就行,不用纠结其余。
2.不用担忧其余模块定义过相似的接口,只要关心本身有什么需求,而后按照需求去定义就行。
继续看。咱们稍微加点料,代码添加几行以下:
package main
import (
"fmt"
)
type stockPosition struct {
ticker string
sharePrice float32
count float32
}
func (s stockPosition) getValue() float32 {
return s.sharePrice * s.count
}
type f float32
func (s f) getValue() float32 {
return 0.1
}
type valueable interface {
getValue() float32
}
func showValue(asset valueable) {
fmt.Printf("value of the asset is %f\n", asset.getValue())
}
func main() {
var o valueable
o = stockPosition{"GOOG", 577.20, 4}
showValue(o)
var t f
o = t
showValue(o)
}
Output:
value of the asset is 2308.800049
value of the asset is 0.100000
咱们定义了一个f,而后实现了getValue方法,其赋值给o,再调用valueable类型的接口才能够调用的showValue打印值。也就是说全部实现了valueable接口的类型均可以调用这个函数。
总结下,golang不支持面向对象的编程思想(没有类,没有继承),而要实现多态就彻底须要接口了。接口就是一组方法的集合,它对外隐藏了方法的实现。只要一个类型A实现了接口中的方法,这个接口的变量o就能够接受类型A的变量,其余的变量也实现了的话,也o也能够接受其余变量。(若有错误之处,欢迎批评指出~)