一架梯子,一头程序猿,仰望星空!
Golang高级特性面试题 > 内容正文

Go语言的接口(interface)和其他编程语言有什么不同,如何实现多态?


问题简答

Go语言的接口(interface)是一种特殊的类型,它只定义了一组方法的签名,但没有实现,与其他开发语言的不同之处在于,Go语言的接口不需要显式地实现,而是隐式地实现。

问题详解:

其他开发语言例如java,实现类需要显式的指明需要实现哪些接口,Go不需要,你的struct对象只要包含了接口定义的方法就可以认为你实现了这个接口。

例子

package main

import (
    "fmt"
)

// 定义一个接口
type Shape interface {
    // 定义一个Area方法, 返回面积
    Area() float64
}

// 定义矩形类
type Rectangle struct {
    width  float64
    height float64
}

// 实现Area,返回矩形面积,这里没有显式的注明实现了Shape接口,但是实现了Shape接口的Area方法,这就是Go接口的隐式实现。
func (r Rectangle) Area() float64 {
    return r.width * r.height
}

// 定义圆形类
type Circle struct {
    radius float64
}

// 实现Area,返回圆形面积
func (c Circle) Area() float64 {
    return 3.14 * c.radius * c.radius
}

func main() {
   // 初始化矩形和圆形对象
    r := Rectangle{10, 20}
    c := Circle{10}

   // 定义shape接口类型
    var s Shape
    // 因为Rectangle和Circle都实现了Shape接口,因此接口变量s可以接受Rectangle和Circle对象的赋值,对于接口变量s而言,Area方法可能有多种实现,但是只要调用s.Area()方法就可以得到面积,这就是多态的特性之一。
    s = r
    fmt.Println("Area of Rectangle: ", s.Area())
    s = c
    fmt.Println("Area of Circle: ", s.Area())
}