浏览 1163
扫码
Interface接口
这一章我们要讲解一下Go的另外一个重要类型——接口类型。
Go 语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。但是 Go 语言里有非常灵活的接口概念,通过它可以实现很多面向对象的特性。
接口定义
普通定义形式:
type Interface Shape{ //最普通的形式Area() float64}
空接口定义:
空接口,即 interface{},可以代表任何类型,有点类似于 java 中的 Object 类可以作为任何形参和返回类型。
func test( i int ) interface{} {if i == 0 {return "hello"}return i;}
这里例子中,由于有可能返回string,也有可能返回int,因此将返回值设置成为interface,这个在Go的package包中会大量见到。
类型不需要显式声明它实现了某个接口:接口被隐式地实现,多个类型可以实现同一个接口。只要类型实现了接口中的方法,它就实现了此接口。
//接口定义type Shape interface {Area() float64 //求面积}//圆形定义type Circle struct {radius float64}//圆形面积计算func (this Circle) Area() float64 {return math.Pi * this.radius * this.radius}//矩形定义type Rectangle struct {length float64width float64}//矩形面积计算func (this Rectangle) Area() float64 {return this.length * this.width}func main() {var circle Circlecircle.radius = 3fmt.Println(circle.Area())rec := Rectangle{5.0, 8}fmt.Println(rec.Area())}
接口嵌套接口
接口可以包含其他接口.
type ShapeArea interface {Area() float64 //求面积}type ShapePerimeter interface{Perimeter() float64 // 求周长}type Shape interface{ShapeAreaShapePerimeter}
详细情况看pro03_8_2.go
//面积接口type ShapeArea interface {Area() float64 //求面积}//周长接口type ShapePerimeter interface {Perimeter() float64 // 求周长}//形状接口:包含面积接口、周长接口type Shape interface {ShapeAreaShapePerimeter}//圆形定义type Circle struct {radius float64}//实现圆形面积接口func (this Circle) Area() float64 {return math.Pi * this.radius * this.radius}//实现圆形周长接口func (this Circle) Perimeter() float64 {return 2 * math.Pi * this.radius}func main() {var circle Circlecircle.radius = 3fmt.Println("Cirle area:", circle.Area())fmt.Println("Cirle perimeter:", circle.Perimeter())}
检测对象是否实现了接口的方法
var circle Circlecircle.radius = 3var s Shape = circleif circleValue, ok := s.(ShapePerimeter); ok {fmt.Printf("circle implements Perimeter(): %f\n", circleValue.Perimeter())}
通过上面的例子,我们可以看出Shape接口实现了ShapePerimeter接口