Go接口——基本概念
Go接口——基本概念
秋风醉了 发表于2年前
Go接口——基本概念
  • 发表于 2年前
  • 阅读 35
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: Go接口——基本概念

Go接口——基本概念

Interfaces are named collections of method signatures.

当你有看到一个接口类型时,你不知道它是什么,唯一知道的就是可以通过它的方法来做什么。

C++,Java 使用“侵入式”接口,主要表现在实现类需要明确声明自己实现了某个接口。这种强制性的接口继承方式是面向对象编程思想发展过程中一个遭受相当多质疑的特性。

**Go语言采用的是“非侵入式接口”,Go语言的接口有其独到之处:只要类型 T 的公开方法完全满足接口 I 的要求,就可以把类型 T 的对象用在需要接口 I 的地方,所谓类型 T 的公开方法完全满足接口 I 的要求,也即是类型 T 实现了接口 I 所规定的一组成员。**这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。

下面我们通过一组例子来演示如何定义一个接口,如何实现接口。

package main

import (
	"fmt"
	"math"
)

// 首字母小写,该函数不是导出的,就是说在包外不能调用
// 函数参数为 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}

	fmt.Printf("%T\n", r) //main.Rect
	fmt.Printf("%T\n", c) //main.Circle

	// r,c 所对应的类型实现了接口的所有方法,所以也是接口类型的变量
	measure(r) //可以调用
	measure(c)
}

// 使用type ... interface 定义接口
// 一般地,Go中接口的命名约定:接口名以er结尾。注意,这里并非强行要求,你完全可以不以 er 结尾。标准库中有些接口也不是以 er 结尾的。
type Geometry interface {
	Area() float64
	Perim() float64
}

type Rect struct {
	Width, Height float64 // 结构体 Rect 的成员变量,开头首字母大写,都是导出的
}

type Circle struct {
	Radius float64
}

// To implement an interface in Go, we just need to implement all the methods in the interface. Here we implement Geometry on Rect.
// 在go中,实现一个接口,只需要实现接口中定义的所有方法,而不需要指明所实现的接口。

func (r Rect) Area() float64 {
	return r.Width * r.Height
}
func (r Rect) Perim() float64 {
	return 2*r.Width + 2*r.Height
}

// end===== Geometry接口的 Rect 实现

func (c Circle) Area() float64 {
	return math.Pi * c.Radius * c.Radius
}
func (c Circle) Perim() float64 {
	return 2 * math.Pi * c.Radius
}

// end===== Geometry接口的 Circle 实现

这就是接口的基本概念和使用方法。我们再来看一下例子。

package main

import (
	"fmt"
)

// 定义 Phone 接口
// 只有一个方法声明
type Phone interface {
	sales() int
}

type NokiaPhone struct {
	price int
}

// 实现接口的方法,也就表示 NokiaPhone 是 Phone 接口的一个实现
func (nokiaPhone NokiaPhone) sales() int {
	return nokiaPhone.price
}

type IPhone struct {
	price int
}

// 实现接口的方法,也就表示 IPhone 是 Phone 接口的一个实现
func (iPhone IPhone) sales() int {
	return iPhone.price
}

type Person struct {
	phones []Phone //接口作为结构体数据成员
	name   string
	age    int
}

func (person Person) total_cost() int {
	var sum = 0
	for _, phone := range person.phones {
		sum += phone.sales()
	}
	return sum
}

func main() {
	var bought_phones = [5]Phone{
		NokiaPhone{price: 350},
		IPhone{price: 5000},
		IPhone{price: 3400},
		NokiaPhone{price: 450},
		IPhone{price: 5000},
	}

	var person = Person{name: "Jemy", age: 25, phones: bought_phones[:]}

	fmt.Println(person.name)
	fmt.Println(person.age)
	fmt.Println(person.total_cost())
}

参考:

https://gobyexample.com/interfaces

http://golanghome.com/post/11

========END========

共有 人打赏支持
粉丝 214
博文 608
码字总数 433844
×
秋风醉了
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: