此示例旨在演示Go中接口的实现并导入自定义包。您将能够在自定义包中定义和声明应用程序的接口,并在应用程序中实现该接口。

以下是我们应用程序的目录结构。

├── analysis
│   ├── go.mod
│   ├── main.go
│   ├── vehicle
│   │   └── vehicle.go
│   └── human
│       └── human.go

进入分析目录并运行以下命令以创建名为 analysis 的go模块。

go mod init analysis

上面的命令将创建一个名为go.mod的文件。

 

要使用自定义包,我们必须先导入它。导入路径是附加在包的子目录和包名称上的模块名称。在我们的示例中,模块名称为analysis,包human位于分析文件夹正下方的human文件夹中。同样,包vehicle位于分析文件夹正下方的vehicle文件夹中。

因此,"analysis/vehicle"将导入vehicle包,"analysis/human"将导入human包

package main

import (
	h "analysis/human"
	v "analysis/vehicle"

	"fmt"
)

func main() {
	var bmw v.Vehicle
	bmw = v.Car("World Top Brand")

	var labour h.Human
	labour = h.Man("Software Developer")

	for i, j := range bmw.Structure() {
		fmt.Printf("%-15s <=====> %15s\n", j, labour.Structure()[i])
	}
}

 

我们将vehicle包别名为 v,将human包别名为 h。在main()函数中,我们分配了类型为vehicle的宝马。由于Car实现了Vehicle接口,bmw.Structure()将调用Car 类型的 Structure 方法。

 

vehicle文件夹中创建一个文件vehicle.go。车辆文件夹中的文件应以行package vehicle开头,因为它属于vehicle包。

# analysis\vehicle\vehicle.go
package vehicle

type Vehicle interface {
	Structure() []string
	Speed() string
}

type Car string

func (c Car) Structure() []string {
	var parts = []string{"ECU", "Engine", "Air Filters", "Wipers", "Gas Task"}
	return parts
}

func (c Car) Speed() string {
	return "200 Km/Hrs"
}

我们将方法Structure() 和Speed() 添加到接收器类型Car中。现在可以说汽车实现了接口车辆。

 

在human文件夹中创建一个文件human.go。human文件夹中的文件应该以行package human开头,因为它属于human包。

package human

type Human interface {
	Structure() []string
	Performance() string
}

type Man string

func (m Man) Structure() []string {
	var parts = []string{"Brain", "Heart", "Nose", "Eyelashes", "Stomach"}
	return parts
}

func (m Man) Performance() string {
	return "8 Hrs/Day"
}

我们将方法Structure() 和Performance() 添加到接收器类型Man。现在可以说Man实现了Human的接口。

 

analysis>go run main.go

如果运行该程序,将获得以下输出。

ECU             <=====>           Brain
Engine          <=====>           Heart
Air Filters     <=====>            Nose
Wipers          <=====>       Eyelashes
Gas Task        <=====>         Stomach