Go- 接口 -3
发布于: 2 小时前
Go 学习笔记,学习内容《Go入门指南》
主要介绍以下内容:
动态类型
接口的提取
显式的指明类型实现了某个接口
接口的继承
高阶函数
代码示例可以直接运行
package main
import (
"fmt"
)
func printDivider(str ...string) {
fmt.Println()
fmt.Println("-----------------------------------------------")
if len(str) > 0 {
fmt.Println(str)
}
}
type Any interface{}
type Car struct {
Model string
Manufacturer string
BuildYear int
}
type Cars []*Car
func main() {
/*
动态类型
即在运行过程中确定变量的类型,或者某个变量可以接收多种类型的变量
1、接收一个或多个接口类型作为参数的函数,实参可以是任何实现了该接口的类型
2、可以忽略变量的类型,而关注它实现了什么方法,即关注能做什么而不是他们是什么
3、当变量赋值给接口类型变量时,编译阶段就会检查其是否实现了接口的所有函数,而不是运行时检查
*/
/*
接口的提取
提取出多个类型的共同特征,以接口方式实现
*/
/*
显式的指明类型实现了某个接口
在接口中声明一个函数,函数名称表明实现了该接口,如:
type Fooer interface {
Foo()
ImplementsFooer()
}
这样其他实现该接口的类型,必须实现接口ImplementsFooer(),通过该接口可表明其实现了该接口
*/
/*
接口的继承
当一个类型内嵌另一个类型(实现了一个或多个接口)的指针时,这个类型就可以使用(另一个类型)所有的接口方法。
*/
/*
高阶函数
*/
printDivider("高阶函数")
ford := &Car{"Fiesta", "Ford", 2008}
bmw := &Car{"XL 450", "BMW", 2011}
merc := &Car{"D600", "Mercedes", 2009}
bmw2 := &Car{"X 800", "BMW", 2008}
allCars := Cars([]*Car{ford, bmw, merc, bmw2})
allNewBMWs := allCars.FindAll(func(car *Car) bool {
return (car.Manufacturer == "BMW") && (car.BuildYear > 2010)
})
fmt.Println("AllCars: ", allCars) // 输出:AllCars: [0xc00007c3c0 0xc00007c3f0 0xc00007c420 0xc00007c450]
fmt.Println("New BMWs: ", allNewBMWs) // 输出:New BMWs: [0xc00007c3f0]
manufacturers := []string{"Ford", "Aston Martin", "Land Rover", "BMW", "Jaguar"}
sortedAppender, sortedCars := MakeSortedAppender(manufacturers)
allCars.Process(sortedAppender)
fmt.Println("Map sortedCars: ", sortedCars) // 输出:Map sortedCars: map[Aston Martin:[] BMW:[0xc00007c3f0 0xc00007c450] Default:[0xc00007c420] Ford:[0xc00007c3c0] Jaguar:[] Land Rover:[]]
BMWCount := len(sortedCars["BMW"])
fmt.Println("We have ", BMWCount, "BMWs") // 输出:We have 2 BMWs
}
func (cs Cars) Process(f func(car *Car)) {
for _, c := range cs {
f(c)
}
}
func (cs Cars) FindAll(f func(car *Car) bool) Cars {
cars := make([]*Car, 0)
cs.Process(func(c *Car) { // Process函数中可以使用FindAll的参数f
if f(c) {
cars = append(cars, c)
}
})
return cars
}
func (cs Cars) Map(f func(car *Car) Any) []Any {
result := make([]Any, len(cs))
ix := 0
cs.Process(func(c *Car) {
result[ix] = f(c)
ix++
})
return result
}
func MakeSortedAppender(manufacturers []string) (func(car *Car), map[string]Cars) {
sortedCars := make(map[string]Cars)
for _, m := range manufacturers {
sortedCars[m] = make([]*Car, 0)
}
sortedCars["Default"] = make([]*Car, 0)
appender := func(c *Car) {
if _, ok := sortedCars[c.Manufacturer]; ok {
sortedCars[c.Manufacturer] = append(sortedCars[c.Manufacturer], c)
} else {
sortedCars["Default"] = append(sortedCars["Default"], c)
}
}
return appender, sortedCars
}
复制代码
划线
评论
复制
发布于: 2 小时前阅读数: 3
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/b2bf1acdfbce460c34a3fbf0d】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论