此示例旨在演示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