Codewalk: First-Class Functions in Go

Pop Out Code
左侧右侧的代码 码宽70% filepaths shownhidden
Introduction
Go支持一流的函数,高阶函数,用户定义的函数类型,函数文字,闭包和多个返回值.

这个丰富的功能集支持强类型语言的功能编程风格.

在此代码漫步中,我们将看一个简单的程序,该程序模拟一个称为Pig的骰子游戏并评估基本策略.
doc/codewalk/pig.go
游戏总览
猪是具有六面骰子的两人游戏. 每回合,您都可以滚动或停留.
  • 如果您投出1,则在回合中输掉所有分,然后将比赛传给对手. 任何其他掷骰将其值添加到您的回合得分中.
  • 如果您留下,则将您的回合得分加到您的总得分中,然后比赛转给对手.
第一个获得100总积分的人将获胜.

score类型除了存储当前回合期间累积的得分外,还存储当前和相对玩家的得分.
doc/codewalk/pig.go:17,21
用户定义的功能类型
在Go中,可以像其他任何值一样传递函数. 函数的类型签名描述了其参数和返回值的类型.

action类型是获取score并返回结果score以及当前回合是否结束的函数.

如果回合结束,则应该交换结果scoreplayeropponent字段,因为现在是另一位玩家的回合.
doc/codewalk/pig.go:23,24
多个返回值
Go函数可以返回多个值.

该函数rollstay每个返回一对值. 它们还与action类型签名匹配. 这些action功能定义了Pig的规则.
doc/codewalk/pig.go:26,41
高阶函数
一个函数可以将其他函数用作参数和返回值.

strategy是一种功能,将score作为输入并返回要执行的action .
(请记住, action本身就是一个功能.)
doc/codewalk/pig.go:43,44
函数文字和闭包
如本例所示,可以在Go中声明匿名函数. 函数文字是闭包:它们继承声明它们的函数的作用域.

Pig的一项基本策略是继续滚动直到您在一个回合中至少累积k点,然后再停留. 参数k包含在该函数文字中,该文字与strategy类型签名匹配.
doc/codewalk/pig.go:48,53
模拟游戏
通过调用一个action来更新score直到一个玩家达到100分,我们模拟了Pig的游戏. 通过调用与当前玩家关联的strategy功能来选择每个action .
doc/codewalk/pig.go:56,70
模拟比赛
roundRobin函数可模拟比赛并获得胜利. 每个策略每个系列都玩其他策略gamesPerSeries .
doc/codewalk/pig.go:72,89
可变参数声明
诸如ratioString的可变函数采用可变数量的参数. 这些参数可以作为函数内部的一部分使用.
doc/codewalk/pig.go:91,94
仿真结果
main功能定义了100种基本策略,模拟了循环锦标赛,然后打印每种策略的赢/亏记录.

在这些策略中,保持25最佳,但Pig最佳策略要复杂得多.
doc/codewalk/pig.go:110,121

by  ICOPY.SITE