作者:看那个码农
公众号:看那个码农
上期内容介绍了Go语言学习之十道经典数值运算题|Go主题月
- 1.求出一个数组的和与平均值
- 2.求出一个数组的最大值,并输出元素对应的下标
- 3.用Go语言打印1~100之间,9的整数倍数的个数及总和
- 4.打印1~30之间的奇数
- 5.打印1~30之间的偶数
- 6.求1+2!+3!+…+20!的和
- 7.求第n个数的斐波那契数
- 8.求两个数的最大公约数和最小公倍数
- 9.求1000以内的水仙花数
- 10.向上取整,向下取整,四舍五入
本篇内容将继续带领大家走进Go语言的世界。
1.本文简介
Go语言学习之创建接口
2.什么是接口
接口是双方约定的一种合作协议
。接口的实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节。
Go
语言的接口是一组方法的集合,可以理解为抽象的类型。任何类型,只要实现了该接口中方法集,那么就属于这个接口。
接口不会暴露所包含的数据布局和内部结构(格式
、类型
、结构
)。接口仅仅提供了一些方法,开发者能知道的只是接口能做什么。
3.接口声明的格式
每个接口由数个方法组成,如下格式进行定义:
Type 接口类型名 interface{
方法1(参数列表)返回值列表1
方法2(参数列表)返回值列表2
…
}
我们用代码创建接口的案例如下,该接口只有一个方法:
package main
import (
"fmt"
)
// 定义一个接口
type People interface {
ReturnName() string
}
// 定义一个结构体
type Student struct {
Name string
}
// 定义结构体的一个方法。
// 我们发现接口People的方法集(就一个),此时可直接认为结构体Student实现了接口People
func (s Student) ReturnName() string {
return s.Name
}
func main() {
node := Student{Name:"看那个码农"}
var a People
// 因为Students实现了接口所以直接赋值没问题
a = node
name := a.ReturnName()
fmt.Println(name)
}
输出为:
4.实现接口的条件
一个对象只要全部实现了接口中的方法,那么就实现了这个接口。
换句话说,接口就是一个需要实现的方法列表。
我们具体来看看实现流程:
首先,我们来定义一个Sayer接口
:
// Sayer 接口
type Sayer interface {
say()
}
紧接着,定义dog
和cat
两个结构体:
type dog struct {}
type cat struct {}
因为Sayer接口
里只有一个say
方法,所以我们只需要给dog
和cat
分别实现say
方法就可以实现Sayer接口
了。
// dog实现Sayer接口
func (d dog) say() {
fmt.Println("小狗叫汪汪汪")
}
// cat实现Sayer接口
func (c cat) say() {
fmt.Println("小猫叫喵喵喵")
}
只要实现了接口中的所有方法,就实现了这个接口。
接口类型变量能够存储所有实现了该接口的实例。
例如上面的示例中,Sayer类型
的变量能够存储dog
和cat
类型的变量。
func main() {
var x Sayer // 声明一个Sayer类型的变量x
a := cat{} // 实例化一个cat
b := dog{} // 实例化一个dog
x = a // 可以把cat实例直接赋值给x
x.say() // 喵喵喵
x = b // 可以把dog实例直接赋值给x
x.say() // 汪汪汪
}
完整代码如下:
package main
import (
"fmt"
)
type Sayer interface {
say()
}
type dog struct {}
type cat struct {}
// dog实现了Sayer接口
func (d dog) say() {
fmt.Println("小狗叫汪汪汪")
}
// cat实现了Sayer接口
func (c cat) say() {
fmt.Println("小猫叫喵喵喵")
}
func main() {
var x Sayer // 声明一个Sayer类型的变量x
a := cat{} // 实例化一个cat
b := dog{} // 实例化一个dog
x = a // 可以把cat实例直接赋值给x
x.say() // 喵喵喵
x = b // 可以把dog实例直接赋值给x
x.say() // 汪汪汪
}
输出为:
在一个接口中,创建两个方法又是如何创建呢?
我们看看下面的案例:
package main
import (
"fmt"
)
// 定义一个接口,包含两个方法
type People interface {
ReturnName() string
ReturnNumber() string
}
// 定义一个结构体
type Student struct {
Name string
Number string
}
func (s Student) ReturnName() string {
return s.Name
}
func (s Student) ReturnNumber() string {
return s.Number
}
func main() {
node := Student{Name:"看那个码农",Number: "158168"}
var a People
a = node
name := a.ReturnName()
number:=a.ReturnNumber()
fmt.Println(name)
fmt.Println(number)
}
输出为:
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。