Golang基本用法(六)

go:接口interface

Posted by Hzy on November 16, 2019

介绍了go中接口的用法

接口就是调用者和使用者都遵守的一种协议,大家按照统一的命名和参数类型来进行逻辑处理。听起来有点怪怪的,简单说就是大家都得遵守一定的规则,不按规则就不行。

1.声明接口使用关键字interface

像这里声明了一个talker的接口,里面有一个talk方法
1
2
3
4
type Talker interface {
	//接口里的方法
	talk(data interface{}) error
}
我们在来声明一个Who类型,Who类型实现了talker接口的方法
1
2
3
4
5
6
7
8
type Who struct {
	name string
}
Who结构体实现了talkr接口的方法
func (t *Who) talk(word interface{}) error {
	fmt.Println(t.name,":",word)
	return nil
}
现在我们就可以调用了
1
2
3
4
5
6
7
8
9
10
11
12
func main() {
    //声明结构体
	w :=&Who{name:"people"}
    dog :=&Who{name:"dog"}
    // 声明接口
	var talker Talker
	//由于who类型实现了接口中的所有方法,所以可以Who类型赋值给接口
    talker = w
	_ = talker.talk("i'm person") //people : i'm person
    talker = dog
	_ = talker.talk("wang wang wang ")//dog : wang wang wang
}
如果结构体没有实现接口中的方法,则会报错。
  • 可能因为粗心,函数明不一致,会报错:cannot use w (type *Who) as type Talker in assignment:*Who does not implement Talker (missing talk method)
  • 函数名一致,函数的参数类型也要一直才行 否则:cannot use w (type *Who) as type Talker in assignment: *Who does not implement Talker (wrong type for talk method) have talk(int) error want talk(interface {}) error
  • 接口中的方法需要都被实现,否则会报错。

2.类型和接口的关系

一开始对类型和接口之间的理解有点乱,但打了会代码就比较能理解了。

  • 一个类型可以有多个接口,就像上面的Who类型,已经实现了Talker接口,我们可以在实现个Jumper接口,
    1
    2
    3
    4
    5
    6
    7
    
    type Jumper interface {
      jump(data interface{})error
    }
    func (j *Who)jump(word interface{})error{
      fmt.Println(j.name,":",word)
      return nil
    }
    
  • 接口与接口之间是相互独立的,互相不知道对方的实现
  • 不同的类型也可以实现相同的接口,看看下面的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//定义一个Earth类型
type Earth struct {
	river string
}
//实现接口中的talk方法
func (e *Earth) talk(word interface{}) error {
	fmt.Println(e.river,":",word)
	return nil
}
//然后就可以调用啦
func main() {
    //Who和Earth 是两个不同的类型,但他们都实现了相同的接口
	w :=&Who{name:"people"}
	e :=&Earth{river:"changjiang"}
	//w.talk("dadas")
	var talker Talker
	talker = w
	_ = talker.talk("i'm person")
	talker = e
	fmt.Println(e.talk("i'm very long")) //changjiang : i'm very long

}

  • 空接口是可以保存所有值的类型,空接口可以转换成int,float64,string啊
  • 通过使用switch和v.(type)来判断接口类型