golang接口
1.含义
golang接口是一组方法的定义,也就是一组函数,只是定义了一组函数但没有具体实现它,接口是go语言实现多态的途径,我们先来简单介绍以下多态的概念,在面向对象的语言中像c++就有多态的概念,多态指用相同的变量在不同时刻来表现不同的行为,这时多态的本质,go语言的接口类型是一种抽象的类型,他不会暴露除它所代表的的对象内部值的结构和这个对象支持的基础操作的集合,他们只会展示除他们自己的方法,也就是瘦当你看到一个接口类型的值是,你不是道它是什么,唯一知道的就是可以通过它的方法来做什么。
2.接口使用
package main
import "fmt"
type addSub interface {
add() int
}
type st struct {
a int
b int
}
func (s st) add() int {
return s.a + s.b
}
func (s *st) sub() int {
return (*s).a - (*s).b
}
func main() {
s := st{a: 1, b: 2}
var ad addSub = s //st类型赋值给接口addSub, st类型必须实现了addSub接口的所有方法
fmt.Println(ad.add()) //调用接口addSub,打印3
}
当把类型a赋值给b接口,那么a必须实现了接口b的所有方法,
go语言方法调用规则:
(1)、类型*T可以调用类型*T和类型T的所有方法
(2)、类型T只能调用类型T的方法集
上代码:
package main
import "fmt"
type st struct{
name string
score int
}
func (this st) SayHi(){
fmt.Println("Hi!")
}
func (this *st) Sing(){
fmt.Println("I am a strudent")
}
type strudent interface {
SayHi()
Sing()
}
func main(){
s := st{name: "tom", score: 14}
var interf strudent = &s
// var interf strudent = s //失败, s不能调用*s的方法
interf.Sing()
interf.SayHi()
}
在上面的代码中, var s st , s.Sing()这样调用是可以的,go的编译器会做优化处理,但如果要想改变s中的值,必须是传地址,因为go的赋值都是拷贝赋值,
3 接口嵌套接口
package main
import "fmt"
type st struct{
name string
score int
}
func (this st) SayHi(){
fmt.Println("Hi!")
}
func (this st) Sing(){
fmt.Println("I am a strudent")
}
func (this st) task() int{
return this.score
}
type Strudent interface{
Men
task() int
}
type Men interface {
SayHi()
Sing()
}
func main(){
var interf Strudent = st{name: "tom", score: 20}
fmt.Println(interf.task())
interf.Sing()
}
strudent接口嵌套men接口,那么strudent就可以调用Men的方法,
4 空接口
空接口interface{}这个类型使用非常广泛,就行c语言中void类型,空接口没有实现任何方法,所以它可以接受任意类型,一般配合go语言的反射来获取它赋值的具体类型。
空接口的使用:
var intf interface {}
var a int
intf = a
if _, ok := a.(int); ok {
// do
}