写点什么

Go- 接口 -3

用户头像
HelloBug
关注
发布于: 2 小时前
Go- 接口-3

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
用户头像

HelloBug

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Go- 接口-3