Golang 学习笔记 - 接口实现(interface)

更新于 2022-11-21 22:39 48
专栏: Golang 标签: Go

整理参考教学和文章

在Go语言中,接口 (interface)是一种数据类型,一种抽象的数据类型。

接口实现

  1. package main
  2. import "fmt"
  3. // 定义一个接口类型
  4. // 只要实现了say()的方法(所有的方法),都可以称为sayer类型
  5. type sayer interface {
  6. say()
  7. }
  8. type dog struct{}
  9. func (d *dog) say() {
  10. fmt.Println("汪汪汪~")
  11. }
  12. type cat struct{}
  13. func (c *cat) say() {
  14. fmt.Println("喵喵喵~")
  15. }
  16. // 打的函数
  17. func da(arg sayer) {
  18. arg.say()
  19. }
  20. func main() {
  21. var c1 = new(cat)
  22. da(c1) // 喵喵喵~
  23. var d1 = new(dog)
  24. da(d1) // 汪汪汪~
  25. // 直接 给变量s 定义为sayer ,c1和c2都可以直接赋值给s
  26. var s sayer
  27. c2 := &cat{}
  28. s = c2
  29. s.say()
  30. d2 := &dog{}
  31. s = d2
  32. s.say()
  33. }

打印结果:

  1. 喵喵喵~
  2. 汪汪汪~
  3. 喵喵喵~
  4. 汪汪汪~

实现多接口

  1. package main
  2. import "fmt"
  3. // 实现多接口
  4. type mover interface {
  5. move()
  6. }
  7. type sayer interface {
  8. say()
  9. }
  10. // 实现多接口
  11. type person struct {
  12. name string
  13. }
  14. // 实现sayer接口
  15. func (p *person) say() {
  16. fmt.Printf("%v 在说话\n", p.name)
  17. }
  18. // 实现mover接口
  19. func (p *person) move() {
  20. fmt.Printf("%v 在动\n", p.name)
  21. }
  22. func main() {
  23. var s sayer // 定义一个sayer
  24. var m mover // 定义一个mover
  25. p1 := person{name: "sun"}
  26. p1.name = "Sun_1"
  27. p1.move()
  28. p1.say()
  29. s = &p1 // 可以直接赋值
  30. s.say() // 但是s只有say方法可使用
  31. m = &p1
  32. m.move() // 但是m只有move方法可使用
  33. }

打印结果:

  1. Sun_1 在动
  2. Sun_1 在说话
  3. Sun_1 在说话
  4. Sun_1 在动

接口嵌套

  1. package main
  2. import "fmt"
  3. // 接口嵌套组合
  4. type animal interface {
  5. mover
  6. sayer
  7. }
  8. type mover interface {
  9. move()
  10. }
  11. type sayer interface {
  12. say()
  13. }
  14. // 实现多接口
  15. type person struct {
  16. name string
  17. }
  18. // 实现sayer接口
  19. func (p *person) say() {
  20. fmt.Printf("%v 在说话\n", p.name)
  21. }
  22. // 实现mover接口
  23. func (p *person) move() {
  24. fmt.Printf("%v 在动\n", p.name)
  25. }
  26. func main() {
  27. var s sayer // 定义一个sayer
  28. var m mover // 定义一个mover
  29. p1 := person{name: "sun"}
  30. var a animal
  31. a = &p1
  32. a.move()
  33. a.say()
  34. s = a // 可以赋值
  35. m = a // 可以赋值
  36. // a = s // 不允许
  37. s.say() // 仅有一个say方法
  38. m.move() // 仅有一个move方法
  39. }

打印结果:

  1. sun 在动
  2. sun 在说话
  3. sun 在说话
  4. sun 在动

空接口

可以存任何类型数据

  1. package main
  2. import "fmt"
  3. func main() {
  4. var x interface{}
  5. x = "hello"
  6. fmt.Println(x)
  7. x = 1000
  8. fmt.Println(x)
  9. x = false
  10. fmt.Println(x)
  11. }

打印结果:

  1. hello
  2. 1000
  3. false

BLOG

搜索文章