返回多人的问候
在你对模块代码进行的最后一次更改中,你将添加对一次请求中获取多人的问候的支持。换句话说,你将处理多值输入,然后将该输入中的值与多值输出配对。为此,你需要将一组名字传递给一个函数,该函数可以为每个人返回一条问候语。
注意: 本文是系列教程的一部分,该系列始于 创建 Go 模块。
但这里有一个问题。将 Hello 函数的参数从单个名字更改为一组名字会改变函数的签名。如果你已经发布了 example.com/greetings 模块,并且用户已经编写了调用 Hello 的代码,那么这个更改会破坏他们的程序。
在这种情况下,更好的选择是编写一个具有不同名称的新函数。新函数将接受多个参数。这样可以保留旧函数以实现向后兼容性。
步骤
- 使用以下代码更新你的
greetings/greetings.go文件:
在这段代码中,你:
- 添加了一个
Hellos函数,其参数是一个名字切片,而不是单个名字。此外,你将其中一个返回类型从string更改为map,以便可以返回映射到问候语的名字。 - 让新的
Hellos函数调用现有的Hello函数。这有助于减少重复,同时保留两个函数。 - 创建一个
messages映射,以关联每个接收到的名字(作为键)与生成的消息(作为值)。在 Go 中,你可以使用以下语法初始化映射:make(map[key-type]value-type)。你让Hellos函数将此映射返回给调用者。有关映射的更多信息,请参阅 Go 博客上的 Go 映射实战。 - 遍历函数接收到的名字,检查每个名字是否非空,然后为每个名字关联一条消息。在这个
for循环中,range返回两个值:当前项在循环中的索引和该项值的副本。你不需要索引,因此使用 Go 空白标识符(下划线)来忽略它。有关更多信息,请参阅 Effective Go 中的 空白标识符。
- 更新你的
hello/hello.go文件,以传递一个名字切片并打印你获得的名字/消息映射的内容:
通过这些更改,你:
- 创建一个
names变量作为持有三个名字的切片类型。 - 将
names变量作为Hellos函数的参数传递。
- 从命令行运行代码 以验证其是否正常工作:
输出应该是将名字与消息关联的映射的字符串表示,类似于以下内容:
总结
本主题介绍了用于表示名称/值对的映射。它还介绍了通过为模块中新的或更改的功能实现新函数来保留向后兼容性的思想。有关向后兼容性的更多信息,请参阅 保持模块兼容。
接下来,你将使用 Go 的内建功能为你的代码创建单元测试。