golang中什么是接口


本文摘自php中文网,作者藏色散人,侵删。

golang 什么是接口?

如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键。在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心。

相关推荐:golang教程

golang中的接口

1. 接口

概念:接口定义了一组方法,但是不包含这些方法的具体实现;它们是抽象的,接口不能包含变量。

接口的定义格式

1

2

3

4

type Namer interface {

method1() return_type

method2() return_type

}

2. 一个接口的栗子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package main

import "fmt"

 

type Message interface {

    Send()

}

type user struct {

    name string

    score int

}

func (u *user) Send() {

    fmt.Println("hi", u.name, "this is your ", u.score)

}

func sendMessage(msg Message) {

    msg.Send()

}

func main() {

    u := &user{name: "roty", score: 44}

    sendMessage(&u)

}

Golang 中的 interface 让编码更灵活、易扩展,使得 Go 拥有了面向对象多态的特性。

在此我们记住三点就够了:

● 方法声明的集合

● 任何类型的对象实现了在接口中声明的全部方法,则表明该类型实现了对应接口。

● 可以作为一种数据类型,实现了该接口的任何对象都可以给对应的接口类型变量赋值。

结合例子去理解上述三点:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

package main

import "fmt"

import "math"

// 几何图形的接口(interface)

type geometry interface {

    area() float64

    perim() float64

}

// rect 和 circle 实现 geometry 接口

type rect struct {

    width, height float64

}

type circle struct {

    radius float64

}

// 实现了接口中声明的所有方法即实现了该接口,这里 rects 实现了 geometry 接口

func (r rect) area() float64 {

    return r.width * r.height

}

func (r rect) perim() float64 {

    return 2*r.width + 2*r.height

}

// circles 实现 geometry 接口

func (c circle) area() float64 {

    return math.Pi * c.radius * c.radius

}

func (c circle) perim() float64 {

    return 2 * math.Pi * c.radius

}

// 定义的接口可以作为一种数据类型,当一个变量的类型为一个接口类型时,这个变量可以调用接口中定义的方法。

// 这里定义一个函数,接收一个类型为 geometry 的参数变量

func measure(g geometry) {

    fmt.Println(g)

    fmt.Println(g.area())

    fmt.Println(g.perim())

}

func main() {

    r := rect{width: 3, height: 4}

    c := circle{radius: 5}

    // The circle and rect struct types both implement the geometry interface so we can use instances of these structs as arguments to measure.

    // rect 和 circle 结构类型都实现了 geometry 接口,所以我们能够把它们的对象作为参数传给 measure 函数

    // 在 measure 函数内部,参数对象调用了所属类型实现的接口方法。

    measure(r)

    measure(c)

}

一种类型只要实现接口声明的方法就算实现了接口,同样一种类型能同时支持实现多个接口了,一个接口也能被多种类型实现。如果一种类型实现了某个接口,那么这种类型的对象能够赋值给这个接口类型的变量。

1

2

3

4

5

6

7

8

9

10

11

package main

import "fmt"

type I interface {

  method1()

}

type T struct{}

func (T) method1()  {}

func main()  {

  var i I = T{}

  fmt.Println(i)

}

最后的一部分解释一下 interface{} 类型,这种类型的接口没有声明任何一个方法,俗称空接口。因为任何类型的对象都默认实现了空接口(上文提到任意类型只要实现了接口的方法就算实现了对应的接口,由于空接口没有方法,故所有类型默认都实现了空接口)在需要任意类型变量的场景下非常有用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package main

import (

    "fmt"

)

func PrintAll(vals []interface{}) {

    for _, val := range vals {

        fmt.Println(val)

    }

}

func main() {

    names := []string{"stanley", "david", "oscar"}

    vals := make([]interface{}, len(names))

    for i, v := range names {

        vals[i] = v

    }

    PrintAll(vals)

}

// stanley

// david

// oscar

以上就是golang中什么是接口的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang入门一:变量

leetcode503 下一个更大元素 ii golang

聊聊gost的pager

怎么安装godoc

ssh连接服务器后执行多条命令

go go.mod详解

golang之不可重入函数实现

go和golang之间有区别吗?

golang 控制重定向

聊聊dubbo-go-proxy的authorityfilter

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...