Go Interface
今天学习下Golang语言中Interface基本语法与使用,通过代码示例了解Go编程中的接口及其实现。跟Java语言类似,在Go编程中,开发者可以使用接口来存储一组没有实现的方法。也就是说,接口的方法不会有方法体。
接口定义
type Shape interface {
area() float32
}
上述代码中定义了Shape接口,并定义了两个方法:area(),perimeter(),这两个方法并没有任何逻辑实现。
接口实现
由于接口定义的是没有任何逻辑处理的方法,为了使用接口,开发者必须使用struct类型实现接口,完成接口方法所有的逻辑处理,例如
package main
import "fmt"
// interface
type Shape interface {
// 定义抽象方法 返回类型为float32
area() float32
}
// 定义接口实现 包含长宽 两个属性
type Rectangle struct {
length, breadth float32
}
// 实现接口抽象方法 业务处理逻辑为 长 * 宽
func (r Rectangle) area() float32 {
return r.length * r.breadth
}
// 方法参数: 接口类型
func calculate(s Shape) {
fmt.Println("Area:", s.area())
}
// main function
func main() {
// assigns value to struct members
rect := Rectangle{7, 4}
// call calculate() with struct variable rect
calculate(rect)
}
运行代码
go run .
代码讲解
在上面的示例代码中,创建了一个Shape 接口,并定义一个area() 抽象方法,然后声明一个名称为 Rectangle 的struct类型实现接口
type Rectangle struct {
length, breadth float32
}
Rectangle 实现接口函数的方式也很简单,只需要在函数前面加上 struct名称即可
func (r Rectangle) area() float32 {
return r.length * r.breadth
}
定义一个计算函数,参数为 Shape接口类型,输出接口的计算结果
// access method of the interface
func calculate(s Shape) {
fmt.Println("Area: ", s.area())
}
定义接口实现Rectangle的变量,作为参数传递给calculate函数
rect := Rectangle{7, 4}
calculate(rect)
多struct实现
在Go语言中,单接口支持多个struct实现,这一点跟java类似,单接口多实现。代码如下
package main
import "fmt"
// interface
type Shape interface {
area() float32
}
// Rectangle struct implements the interface
type Rectangle struct {
length, breadth float32
}
// Rectangle provides implementation for area()
func (r Rectangle) area() float32 {
return r.length * r.breadth
}
// Triangle struct implements the interface
type Triangle struct {
base, height float32
}
// Triangle provides implementation for area()
func (t Triangle) area() float32 {
return 0.5 * t.base * t.height
}
// access method of the interface
func calculate(s Shape) float32 {
return s.area()
}
// main function
func main() {
// assigns value to struct members
r := Rectangle{7, 4}
t := Triangle{8, 12}
// call calculate() with struct variable rect
rectangleArea := calculate(r)
fmt.Println("Area of Rectangle:", rectangleArea)
triangleArea := calculate(t)
fmt.Println("Area of Triangle:", triangleArea)
}
运行代码
go run .
在上述代码中,定义两个structs: Rectangle Triangle去实现Shape接口。每一个struct类型都需要实现area抽象方法。调用calculate方法时根据传递的具体接口实现,Go在语言层面自动调用具体的 struct
方法实现
如果一个接口定义多个抽象函数,struct 实现并没有实现接口的所有方法会怎样?来看下一段代码
package main
import "fmt"
// interface
type Shape interface {
area() float32
perimeter() float32
}
// Rectangle struct implements the interface
type Rectangle struct {
length, breadth float32
}
// Rectangle provides implementation for area()
func (r Rectangle) area() float32 {
return r.length * r.breadth
}
// access method of the interface
func calculate(s Shape) float32 {
return s.area()
}
// main function
func main() {
// assigns value to struct members
r := Rectangle{7, 4}
// call calculate() with struct variable rect
rectangleArea := calculate(r)
fmt.Println("Area of Rectangle:", rectangleArea)
}
如上截图,如果struct实现没有实现接口所有函数,在运行时会报错。