将结构作为参数传递给函数进行修改的最 memory/processor 有效方法是什么?
What's the most memory/processor efficient way to pass structs as parameters to functions for modification?
使用指针是最memory/processor 最有效的传递结构进行修改的方法,例如 below 还是有更好的方法?
在 Go 中,使用指针传递结构进行修改是惯用的方式。没有其他语言中的引用变量。所以传递指针是现在最有效的方法,因为它是惯用的,很可能在未来的 Go 版本中也是如此。
基本上有 2 种方法可以将参数传递给函数或方法:通过 value 和通过 address(指针)。
按值传递参数会复制传递的值,因此如果您要修改它,它会修改副本而不是原始值。所以如果你想修改原始值,那你就只剩下地址传递选项了。
备注:
请注意,您还可以通过值和 return 修改后的副本传递并将 returned 修改后的值分配给变量,但显然这效率较低 - 特别是如果结构很大(包含很多字段)。
在极少数情况下,可能有更有效的方法来传递修改值,但我宁愿将这些情况命名为 "denote" 而不是传递。假设您有一个全局变量,它是结构的一部分。在这种情况下,您可以只传递要修改的切片中的值的索引。你的函数可以只修改由传递的索引值表示的元素的字段。如果您只想修改 1 个字段,这可能会更快,并且在 32 位体系结构上,索引值的大小可能小于指针,这样您就可以节省地址获取和取消引用操作(需要基准测试)。但是功能的可用性会大大下降,所以我不推荐这个。
这使得通过指针传递成为最佳方式,以防您需要修改它。
使用指针是最memory/processor 最有效的传递结构进行修改的方法,例如 below 还是有更好的方法?
在 Go 中,使用指针传递结构进行修改是惯用的方式。没有其他语言中的引用变量。所以传递指针是现在最有效的方法,因为它是惯用的,很可能在未来的 Go 版本中也是如此。
基本上有 2 种方法可以将参数传递给函数或方法:通过 value 和通过 address(指针)。
按值传递参数会复制传递的值,因此如果您要修改它,它会修改副本而不是原始值。所以如果你想修改原始值,那你就只剩下地址传递选项了。
备注:
请注意,您还可以通过值和 return 修改后的副本传递并将 returned 修改后的值分配给变量,但显然这效率较低 - 特别是如果结构很大(包含很多字段)。
在极少数情况下,可能有更有效的方法来传递修改值,但我宁愿将这些情况命名为 "denote" 而不是传递。假设您有一个全局变量,它是结构的一部分。在这种情况下,您可以只传递要修改的切片中的值的索引。你的函数可以只修改由传递的索引值表示的元素的字段。如果您只想修改 1 个字段,这可能会更快,并且在 32 位体系结构上,索引值的大小可能小于指针,这样您就可以节省地址获取和取消引用操作(需要基准测试)。但是功能的可用性会大大下降,所以我不推荐这个。
这使得通过指针传递成为最佳方式,以防您需要修改它。