发布于 2026-01-06 3 阅读
0

Go 语言接口简介 什么是接口?

Go语言接口简介

什么是接口?

作为一个 Go 新手和代码新手,我以前从未接触过 C++ 或任何强类型语言,因此很难找到一些关于 Go 中接口的适合初学者的资源。

所以我决定写一篇,尽我所能帮助初学者。


什么是接口?

Go 语言中的接口提供了一种指定对象行为的方法:如果某个对象可以执行此操作,那么它就可以在此处使用。——《Effective Go》

简单来说,接口是一种包含多种方法的类型。

好了,我们今天就不多说了,直接把事情说清楚。

编写一些代码

目标:实现两种方法sum()substr()然后打印出两个数的和与减法。

1)我们先从准备工作开始。

package main

import "fmt"

func main() {
}
Enter fullscreen mode Exit fullscreen mode

2)然后是类型,这里我们有item1和,分别item2是两个数字类型float64

package main

import "fmt"
Enter fullscreen mode Exit fullscreen mode
type item1 struct {
    num1, num2 float64
}

type item2 struct {
    num1, num2 float64
}

func main() {
}
Enter fullscreen mode Exit fullscreen mode

3)现在我们需要一些指令(方法)才能让代码正常运行:

package main

import "fmt"

type item1 struct {
    num1, num2 float64
}

type item2 struct {
    num1, num2 float64
}
Enter fullscreen mode Exit fullscreen mode
// Method
func (a item1) sum() float64 {
    return a.num1 + a.num2
}

// Method
func (a item1) substr() float64 {
    return a.num1 - a.num2
}

// Method
func (b item2) sum() float64 {
    return b.num1 + b.num2
}

// Method
func (b item2) substr() float64 {
    return b.num1 - b.num2
}
Enter fullscreen mode Exit fullscreen mode
func main() {
}
Enter fullscreen mode Exit fullscreen mode

在继续之前,让我们先更好地了解一下这个方法。

// Method
func (b item2) substr() float64 {
    return b.num1 - b.num2
}
Enter fullscreen mode Exit fullscreen mode

b是对 的引用,这是我们在 内部访问和 的item2方式。然后我们有名称、返回类型和返回方法。num1num2item2substr()float64

4)实现result1result2打印结果:

package main

import "fmt"

type item1 struct {
    num1, num2 float64
}

type item2 struct {
    num1, num2 float64
}

// Method
func (a item1) sum() float64 {
    return a.num1 + a.num2
}

// Method
func (a item1) substr() float64 {
    return a.num1 - a.num2
}

// Method
func (b item2) sum() float64 {
    return b.num1 + b.num2
}

// Method
func (b item2) substr() float64 {
    return b.num1 - b.num2
}
Enter fullscreen mode Exit fullscreen mode
// Result 1 & Result 2
func result1(i item1) {
    fmt.Println("Sum: ", i.sum())
    fmt.Println("Substr: ", i.substr())
}

func result2(i item2) {
    fmt.Println("Sum: ", i.sum())
    fmt.Println("Substr: ", i.substr())
}

func main() {
    a := item1{num1: 10, num2: 5}
    b := item2{num1: 20, num2: 10}

    result1(a) 
    result2(b)
}

// Sum:  15
// Substr:  5
// Sum:  30
// Substr:  10
Enter fullscreen mode Exit fullscreen mode

这里我们向两个函数传递了两个变量:a并得到了结果。bresult1result2

但问题在于:

为什么我们需要编写两个功能基本相同的函数(result1和)?result2


所以,这就是你们一直期待的:接口

5) 实现接口。我之前提到过,接口是一种包含方法(函数)集合的类型。它同时包含 `new`sum()substr()`new` 方法,它们分别是以下方法的名称:

package main

import "fmt"
Enter fullscreen mode Exit fullscreen mode
type math interface {
    sum() float64
    substr() float64
}
Enter fullscreen mode Exit fullscreen mode
type item1 struct {
    num1, num2 float64
}

type item2 struct {
    num1, num2 float64
}

// Method
func (a item1) sum() float64 {
    return a.num1 + a.num2
}

// Method
func (a item1) substr() float64 {
    return a.num1 - a.num2
}

// Method
func (b item2) sum() float64 {
    return b.num1 + b.num2
}

// Method
func (b item2) substr() float64 {
    return b.num1 - b.num2
}

func main() {

}
Enter fullscreen mode Exit fullscreen mode

6)打印结果:

package main

import "fmt"

type math interface {
    sum() float64
    substr() float64
}

type item1 struct {
    num1, num2 float64
}

type item2 struct {
    num1, num2 float64
}

// Method
func (a item1) sum() float64 {
    return a.num1 + a.num2
}

// Method
func (a item1) substr() float64 {
    return a.num1 - a.num2
}

// Method
func (b item2) sum() float64 {
    return b.num1 + b.num2
}

// Method
func (b item2) substr() float64 {
    return b.num1 - b.num2
}
Enter fullscreen mode Exit fullscreen mode
func result(m math) {
    fmt.Println("Sum: ", m.sum())
    fmt.Println("Substr: ", m.substr())
}

func main() {
    a := item1{num1: 10, num2: 5}
    b := item2{num1: 20, num2: 10}

    result(a)
    result(b)
}

// Sum:  15
// Substr:  5
// Sum:  30
// Substr:  10
Enter fullscreen mode Exit fullscreen mode

所以现在我们只需要包含接口mathresult然后就可以通过在部分中调用一次来访问它们了sum()这里 我们对两个变量都调用了一次,得到了相同的结果!substr()main()
result

继续 ->空白界面

感谢阅读我发表的第一篇文章!

文章来源:https://dev.to/shearytan/brief-introduction-to-interfaces-in-go-34dg