Go语言学习之创建接口|Go主题月

703 阅读4分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了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)
}

输出为:

image.png

4.实现接口的条件

一个对象只要全部实现了接口中的方法,那么就实现了这个接口

换句话说,接口就是一个需要实现的方法列表。

我们具体来看看实现流程:

首先,我们来定义一个Sayer接口

// Sayer 接口
type Sayer interface {
    say()
}

紧接着,定义dogcat两个结构体:

type dog struct {}
type cat struct {}

因为Sayer接口里只有一个say方法,所以我们只需要给dogcat分别实现say方法就可以实现Sayer接口了。

// dog实现Sayer接口
func (d dog) say() {
   fmt.Println("小狗叫汪汪汪")
}
// cat实现Sayer接口
func (c cat) say() {
   fmt.Println("小猫叫喵喵喵")
}

只要实现了接口中的所有方法,就实现了这个接口。

接口类型变量能够存储所有实现了该接口的实例。

例如上面的示例中,Sayer类型的变量能够存储dogcat类型的变量。

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()     // 汪汪汪
}

输出为:

image.png

在一个接口中,创建两个方法又是如何创建呢?

我们看看下面的案例:

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)
}

输出为:

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。