最近在学习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语法中标准的继承呢?
v.FindVowels()
,也就是接口变量的方法调用只是一种函数指针的间接调用。