这听起来很像当我发现我用其他编程语言(如 C、fpc 或 delphi)为不同类型的不同数组多次编写相同的代码时。我为一种可能永远不会实现的语言发明了参数多态性,使用预处理器技巧并将其称为“包含文件参数多态性”作为概念证明,您实际上可以在不需要 OOP 或任何复杂的程序语言中实现参数多态性泛型系统。但是,使用预处理器是一种滥用形式,它只是为了用 FPC 来证明这个概念。
由于 Golang 不使用预处理器,因此您必须使用接口或指针并将类型作为参数发送。但即使使用指针仍然意味着您必须编写大量代码来转换它并使其全部工作。接口比指针好,因为指针不太安全。
像这样的解决方案:
last := a[len(a)-1]
容易出现错误,因为有人可能会忘记负 1。有些语言有一些更好的东西:
// return last element, the "high" of a
last := a[high(a)]
// return first element, the "low" of a
first := a[low(a)]
上面的代码在 Go AFAIK 中不起作用(还没有研究 go 是否有类似的东西),这正是其他一些语言所具有的(fpc)可能是 Go 考虑的东西。
这种处理事物的低和高方式绝对确保选择最后一个和第一个元素,而使用“减一”容易产生基本的数学错误。有人可能会忘记减一...因为他们对基于 1 的数组与基于零的数组感到困惑。即使该语言没有基于 1 的数组之类的东西,由于人类有时会以基于 1 的方式思考(我们的手指从 1 开始,而不是 0),仍然可能会出错。一些聪明的程序员会争辩说,不,我们的手指从零开始,而不是从一开始。你的拇指为零。好吧,很好..但是..对于世界上的大多数人来说......;-) 我们最终在现实世界与计算机世界中整天从 1 到 0 来回切换我们的大脑,这导致了许多软件中的错误。
但是有些人会争辩说“低”和“高”只是语法糖,在最小语言中不是必需的。必须决定额外的安全是否值得,在许多情况下是值得的。我不确定 LOW() 和 HIGH() 给编译器增加了多少复杂性,以及它如何影响性能。我不是 100% 确定……我认为编译器可以很聪明地优化高低,但我不确定。