interface

前端之家收集整理的这篇文章主要介绍了interface前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

interface是什么

interface被称为接口,是一种类型,其本质是一组抽象方法的集合。凡是实现这些抽象方法的对象,都可以被称为“实现了这个接口”。其存在意义是为了规定对象的一组行为。

interface举例

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type Singer interface {
  8. sing()
  9. }
  10.  
  11. type Man struct {
  12. lyric string
  13. }
  14.  
  15. type Bird struct {
  16. lyric string
  17. }
  18.  
  19. func (m Man) sing() {
  20. fmt.Println(m.lyric)
  21. }
  22.  
  23. func (b Bird) sing() {
  24. fmt.Println(b.lyric)
  25. }
  26.  
  27. func main() {
  28. var in Singer
  29. in = Man{"I'm a brave man"}
  30. in.sing()
  31. in = Bird{"I'm a small bird"}
  32. in.sing()
  33. }

上述事例中我们定义了一个名为Singer的接口,它包含一个抽象方法sing()(当然也可以包含很多抽象方法)。接着我们又分别为Man对象和Bird对象实现了sing()方法,即这两个对象都实现了Singer接口。于是,这两种对象就都可以使用Singer接口对应的变量来存储了!使用这个接口变量就如同调用其对应的对象一样容易。

空interface

interface{} 是一个空interface,实现它不需要实现任何抽象函数,也就是说所有的类型都实现了空interface。于是,一个空interface变量可以存入任何值。实际的用处是,当不确定传入函数的参数类型时,可以使用interface{}代替。并且,我们有特定的语法可以判断具体存入interface{}变量的类型。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "reflect"
  6. )
  7.  
  8. type Ele interface{}
  9.  
  10. type List []Ele
  11.  
  12. func main() {
  13. list := make(List,4)
  14. list[0] = 1
  15. list[1] = 'c'
  16. list[2] = "string"
  17. list[3] = [2]int{5,6}
  18. for index,val := range list {
  19. switch typeval := val.(type) {
  20. case int:
  21. fmt.Printf("list[%d] is an int(%d)\n",index,typeval)
  22. case string:
  23. fmt.Printf("list[%d] is a string(%s)\n",typeval)
  24. case rune:
  25. fmt.Printf("list[%d] is a rune(%c)\n",typeval)
  26. default:
  27. fmt.Printf("list[%d] is a different type(%s)\n",reflect.TypeOf(typeval))
  28. }
  29. }
  30. }

注意:这种switch和val.(type)配合的语法是特有的,在switch以外的任何地方都不能使用类似于val.(type)这种形式。

一个特别的interface

我们很熟悉的fmt.Println函数中可以传入int、string、rune、array等多种类型作为参数,而控制台实际输出的字符串反映了每种类型的值。这就是因为它们都实现了源码中
Stringer接口,如下。

  1. type Stringer interface {
  2. String() string
  3. }

有趣的一点是,当我们定义一个新的数据类型时,如果也实现了Stringer这个接口,那么它同样也可以被fmt包格式化输出,并且是按照你所定义的格式。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type Man struct {
  8. name string
  9. age int
  10. }
  11.  
  12. func (m Man) String() (result string) {
  13. result = fmt.Sprintf("I'm a man. My name is %s and I'm %d years old.\n",m.name,m.age)
  14. return
  15. }
  16.  
  17. func main() {
  18. man := Man{"Bob",18}
  19. fmt.Println(man)
  20. }
  21.  
  22. output:
  23. I'm a man. My name is Bob and I'm 18 years old.

猜你在找的Go相关文章