猿问

以切片为参数的纯函数

如果我需要在参数中传递一个(小)切片,那么用go编写纯函数的最佳方法是什么?切片不会像数组一样通过值传递。因此,不可能保证在函数执行期间不会对其进行修改。一种解决方法是每次我调用函数时都复制切片。它可以在实践中起作用,但是我希望有一个更安全的解决方案,因为没有办法确保在函数调用之前就可以进行复制。


斯蒂芬大帝
浏览 165回答 3
3回答

森栏

我想这不是一个真正的答案,但仍然值得讨论。我认为整个想法都是一厢情愿的:努力以某种语言使用纯函数毫无意义,而该语言绝不会使用您的函数是纯函数这一事实。如果您可以将一个函数“标记”为纯函数,那么Go从理论上可以以某种方式使用该提示以发挥其优势(例如,按调用顺序重新排列某些函数的执行顺序)。由于没有对此类事物的明确支持,因此功能的纯度仅存在于您的脑海中。例如,假设您能够以某种方式强制函数不修改传递给它的切片。即使那样,也不会阻止您在该函数中执行另一种副作用(例如,执行I / O或修改全局变量)。如果您正在编写一个库,并希望其调用者提供一个带有一定片段的回调,则该回调不得更改,只需在文档中清楚说明这一事实即可。

慕丝7291255

如果您正在编写一个包,则可以导出一个方法,该方法采用一个切片,然后将其复制并传递给实函数:func MyExportedFunc(someSlice []int) {    sliceCopy := make([]int, len(someSlice))    copy(sliceCopy, someSlice)    myUnexportedFunc(sliceCopy)}当然,这不是解决问题的方法,因为MyExportedFunc它不是纯粹的解决方法。最好的方法可能是封装切片,如@Tom建议的那样。
随时随地看视频慕课网APP

相关分类

Go
我要回答