Go 基础Interface

Go Interface

今天学习下Golang语言中Interface基本语法与使用,通过代码示例了解Go编程中的接口及其实现。跟Java语言类似,在Go编程中,开发者可以使用接口来存储一组没有实现的方法。也就是说,接口的方法不会有方法体。

接口定义

type Shape interface {
  area() float32
}

上述代码中定义了Shape接口,并定义了两个方法:area()perimeter(),这两个方法并没有任何逻辑实现。

接口实现

由于接口定义的是没有任何逻辑处理的方法,为了使用接口,开发者必须使用struct类型实现接口,完成接口方法所有的逻辑处理,例如

package main 
import "fmt"

// interface
type Shape interface {
  // 定义抽象方法 返回类型为float32
  area() float32
}

 // 定义接口实现 包含长宽 两个属性
type Rectangle struct {
  length, breadth float32
}

// 实现接口抽象方法 业务处理逻辑为 长 * 宽
func (r Rectangle) area() float32 {
  return r.length * r.breadth
}

// 方法参数: 接口类型
func calculate(s Shape) {
  fmt.Println("Area:", s.area())
}

// main function
func main() {
  // assigns value to struct members
  rect := Rectangle{7, 4}
  // call calculate() with struct variable rect
  calculate(rect)
}

运行代码

go run .

在这里插入图片描述

代码讲解

在上面的示例代码中,创建了一个Shape 接口,并定义一个area() 抽象方法,然后声明一个名称为 Rectangle 的struct类型实现接口

type Rectangle struct {
  length, breadth float32
}

Rectangle 实现接口函数的方式也很简单,只需要在函数前面加上 struct名称即可

func (r Rectangle) area() float32 {
  return r.length * r.breadth
}

定义一个计算函数,参数为 Shape接口类型,输出接口的计算结果

// access method of the interface
func calculate(s Shape) {
  fmt.Println("Area: ", s.area())
}

定义接口实现Rectangle的变量,作为参数传递给calculate函数

rect := Rectangle{7, 4}
calculate(rect)

多struct实现

在Go语言中,单接口支持多个struct实现,这一点跟java类似,单接口多实现。代码如下

package main 
import "fmt"

// interface
type Shape interface {
  area() float32
}

 // Rectangle struct implements the interface
type Rectangle struct {
  length, breadth float32
}

// Rectangle provides implementation for area()
func (r Rectangle) area() float32 {
  return r.length * r.breadth
}

// Triangle struct implements the interface
type Triangle struct {
  base, height float32       
}

// Triangle provides implementation for area()
func (t Triangle) area() float32 {
    return 0.5 * t.base * t.height
}

// access method of the interface
func calculate(s Shape) float32 {
  return s.area()
}

// main function
func main() {
 
  // assigns value to struct members
  r := Rectangle{7, 4}
  t := Triangle{8, 12}
 
  // call calculate() with struct variable rect 
  rectangleArea := calculate(r)
  fmt.Println("Area of Rectangle:", rectangleArea)
  
  triangleArea := calculate(t)
  fmt.Println("Area of Triangle:", triangleArea)

}

运行代码

go run .

在这里插入图片描述

在上述代码中,定义两个structs: Rectangle Triangle去实现Shape接口。每一个struct类型都需要实现area抽象方法。调用calculate方法时根据传递的具体接口实现,Go在语言层面自动调用具体的 struct

方法实现

如果一个接口定义多个抽象函数,struct 实现并没有实现接口的所有方法会怎样?来看下一段代码

package main 
import "fmt"

// interface
type Shape interface {
  area() float32
  perimeter() float32
}

 // Rectangle struct implements the interface
type Rectangle struct {
  length, breadth float32
}

// Rectangle provides implementation for area()
func (r Rectangle) area() float32 {
  return r.length * r.breadth
}

// access method of the interface
func calculate(s Shape) float32 {
  return s.area()
}

// main function
func main() {
 
  // assigns value to struct members
  r := Rectangle{7, 4}

  // call calculate() with struct variable rect 
  rectangleArea := calculate(r)
  fmt.Println("Area of Rectangle:", rectangleArea)
}

在这里插入图片描述

如上截图,如果struct实现没有实现接口所有函数,在运行时会报错。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值