我正在使用go 1.4运行程序,我正在尝试将一个大型结构传递给go函数。
go ProcessImpression(network, &logImpression, campaign, actualSpent, partnerAccount, deviceId, otherParams)
我收到此错误:
runtime.newproc: function arguments too large for new goroutine
我已经移动通过引用传递有帮助,但我想知道是否有某种方法在go函数中传递大型结构。
谢谢,
答案 0 :(得分:1)
不,我都不知道。
我认为你不应该过于激进地进行调整以避免复制,但是当{@ 3}}参数超出新goroutine的可用堆栈空间(应该是千字节)时会发出此错误。复制开销在那时是真实的,特别是如果这不是复制这些东西的唯一时间。由于大型结构成员(比如1kb数组而不是切片)或间接结构成员,也许某些结构显式地大于预期结构。如果没有,只需使用指针就行了,如果你担心创建垃圾,请回收使用from the source指向的结构。
答案 1 :(得分:1)
我能够通过更改参数来解决此问题
func doStuff(prev, next User)
到
func doStuff(prev, next *User)
here中@twotwotwo的答案非常有帮助。
答案 2 :(得分:0)
在处理大结构的值列表([]BigType
)时遇到此问题:
for _, stct := range listBigStcts {
go func(stct BigType) {
...process stct ...
}(stct) // <-- error occurs here
}
解决方法是将[]BigType
替换为[]*BigType