本文摘自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"
type geometry interface {
area() float64
perim() float64
}
type rect struct {
width, height float64
}
type circle struct {
radius float64
}
func (r rect) area() float64 {
return r.width * r.height
}
func (r rect) perim() float64 {
return 2*r.width + 2*r.height
}
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
return 2 * math.Pi * c.radius
}
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}
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)
}
|
以上就是golang中什么是接口的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
golang入门一:变量
leetcode503 下一个更大元素 ii golang
聊聊gost的pager
怎么安装godoc
ssh连接服务器后执行多条命令
go go.mod详解
golang之不可重入函数实现
go和golang之间有区别吗?
golang 控制重定向
聊聊dubbo-go-proxy的authorityfilter
更多相关阅读请进入《golang》频道 >>
老貘
一个与时俱进的Go编程知识库。
转载请注明出处:木庄网络博客 » golang中什么是接口