在Go中,接口类型是一种抽象类型,是方法的集合,其他类型实现了这些方法就是实现了这个接口
声明和实现接口
type interface_name interface {
method_name1[return_type]
method_name2[return_type]
method_name3[return_type]
method_name4[return_type]
...
method_namen[return_type]
}
package main
import (
"fmt"
)
// 接口定义
type VowelsFinder interface {
//方法
FindVowels() []rune
}
// 创建一个类型MyString,它只是string的包装类
type MyString string
// MyString 应用 VowelsFinder
func (ms MyString) FindVowels() []rune {
var vowels []rune
for _, rune := range ms {
if rune == 'a' || rune == 'e' || rune == 'i' || rune == 'o' || rune == 'u' {
vowels = append(vowels, rune)
}
}
return vowels
}
func main() {
name := MyString("Sam Anderson")
var v VowelsFinder
v = name // possible since MyString implements VowelsFinder
fmt.Printf("Vowels are %c", v.FindVowels())
}
空接口
一个没有方法的接口称为空接口
它表示为interface{}
由于空接口没有任何方法,所以所有类型都实现空接口
package main
import (
"fmt"
)
func describe(i interface{}) {//函数作为一个空接口作为参数,因此它可以传递任何类型
fmt.Printf("Type = %T, value = %v\n", i, i)
}
func main() {
s := "Hello World"
describe(s)
i := 55
describe(i)
strt := struct {
name string
}{
name: "Naveen R",
}
describe(strt)
}
类型断言
类型断言用于提取接口的基础值
i.(T) 是用于获取具体类型为T的接口i的底层值的语法
package main
import (
"fmt"
)
func assert(i interface{}) {
s := i.(int) //get the underlying int value from i
fmt.Println(s)
}
func main() {
var s interface{} = 56
assert(s)
}
v,ok := i.(T)
如果i的具体类型是T,那么v的值就是i,ok为true
如果i的具体类型不是T,那么ok将是false,v将是类型T的零值,程序不会报错
注意:上面所有示例接口都是使用值接收器实现的。也可以使用指针接收器来实现接口。但是会有一些微妙的区别