Go的接口继承如何正确的应用?

Taylor
  • 62

最近在学习Go语言,其中遇到了一个关于go接口继承问题,希望可以得到大家的解答。
正常继承interface的代码段如下:

package main

import (  
    "fmt"
)

//定义interface 
type VowelsFinder interface {  
    FindVowels() []rune
}

type MyString string

//实现接口
func (ms MyString) FindVowels() []rune {  
    return 'ok'
}

func main() {  
    name := MyString("Sam Anderson") // 类型转换
    var v VowelsFinder // 定义一个接口类型的变量
    v = name 
    fmt.Printf("Vowels are %c", v.FindVowels())

}

其中 main 方法中的 name 变量为 MyString 类型( MyString 的结构体函数实现了 VowelsFinder 接口),然后将 name 转换为 VowelsFinder 类型,说明继承完成。

但是我的疑问点是:即使不进行 v=name的 类型转码,变量 name 本来就是VowelsFinder 类型,已经继承完成。如下改动代码:

func findType(i interface{}) {
    switch v := i.(type) {
        case VowelsFinder:
            fmt.Println("VowelsFinder type.", v);
        default:
            fmt.Printf("unknown type\n")
    }
}

func main() {  
    name := MyString("Sam Anderson")
    findType(name) // VowelsFinder type.
}

通过 findType 函数得到变量 name 已经是接口 VowelsFinder 的类型了,那么是上面main函数的代码是否实现了Go语法中标准的继承呢?

回复
阅读 6.3k
4 个回答
  1. Go语法中没有继承这个概念
  2. 你的代码中的v.FindVowels(),也就是接口变量的方法调用只是一种函数指针的间接调用。
walkmiao
  • 3
新手上路,请多包涵

当你的类型实现了接口中的所有方法时 这个类型就自动的实现了这个接口 不需要显式赋值

我感觉楼主有点没有描述清楚,我自己来概述一下我对golang接口继承的理解:

举个例子:

ReadWriter 接口继承了 Reader 和 Writer 接口,
因此 可以使用 Reader 和 Writer 接口的地方,都可以使用 ReadWriter 接口实现的参数.
而且可以在内部使用断言,将他的原型给断言出来。
我这里并没有实现接口,接口有多种实现方式,只看你自己怎么用了。

package main

// 声明一个接口
type Reader interface {
    Read([]byte) (int, error)
}

// 声明另一个接口
type Writer interface {
    Write([]byte) (int, error)
}

// 再次声明一个接口.
type ReadWriter interface {
    Reader
    Writer
}

func main() {

    var (
        rw ReadWriter
        r  Reader
        w  Writer
    )

    // 可以传该参数
    write(w)
    read(r)
    readWrite(rw)

    read(rw)
    write(rw)

    // 不可传参
    // readWrite(w)
    // readWrite(r)
}

func write(w Writer) {
    if rw, ok := w.(ReadWriter); ok {
        rw.Read(nil) // 类型断言。
    }
}

func read(r Reader) {
    if rw, ok := r.(ReadWriter); ok {
        rw.Write(nil) // 类型断言。
    }
}

func readWrite(rw ReadWriter) {

}
宣传栏