在go语言中,接口类型是由一组方法定义的集合。
一个类型是否实现了一个接口,就看这个类型是否实现了接口中定义的所有方法。在go语言中,无需特别的指明。

定义一个接口

  1. type Abser interface {
  2. Abs() float64
  3. }

定义一个结构体

  1. type Vertex struct {
  2. X, Y float64
  3. }

定义两个方法

  • 一个是结构体指针

  • 一个是结构体。

  1. func (v *Vertex) Abs() float64 {
  2. return v.X * v.X + v.Y * v.Y
  3. }
  4. func (v Vertex) Scale() float64 {
  5. return v.X + v.Y
  6. }

声明一个接口变量

  1. var a Abser

完整示例

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Abser interface {
  6. Abs() float64
  7. }
  8. type Vertex struct {
  9. X, Y float64
  10. }
  11. func (v *Vertex) Abs() float64 {
  12. return v.X * v.X + v.Y * v.Y
  13. }
  14. func (v Vertex) Scale() float64 {
  15. return v.X + v.Y
  16. }
  17. func main() {
  18. var a Abser
  19. f := Vertex{3, 4}
  20. a = &f
  21. fmt.Println(f.Abs())
  22. fmt.Println(f.Scale())
  23. fmt.Println(a.Abs())
  24. //fmt.Println(a.Scale())
  25. }

Strings一个普通存在的接口,在 fmt 中定义

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

完整示例

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Stringer interface {
  6. String() string
  7. }
  8. type Cofox struct {
  9. name string
  10. }
  11. func (c *Cofox) String() string {
  12. return "Joel " + c.name
  13. }
  14. func main() {
  15. var S Stringer
  16. c := Cofox{"Smith"}
  17. S = &c
  18. fmt.Println(S.String())
  19. fmt.Println(c.String())
  20. fmt.Println(c.name)
  21. }

golang 接口 - 图1