【发布时间】:2018-06-12 16:25:53
【问题描述】:
我创建了这个简单的应用程序来演示我遇到的问题。
package main
import (
"fmt"
"unsafe"
"sync"
)
type loc_t struct {
count [9999]int64
Counter int64
}
func (l loc_t) rampUp (wg *sync.WaitGroup) {
defer wg.Done()
l.Counter += 1
}
func main() {
wg := new(sync.WaitGroup)
loc := loc_t{}
fmt.Println(unsafe.Sizeof(loc))
wg.Add(1)
go loc.rampUp(wg)
wg.Wait()
fmt.Println(loc.Counter)
}
如果我运行上面的代码,我会得到一个fatal error: newproc: function arguments too large for new goroutine
runtime stack:
runtime: unexpected return pc for runtime.systemstack called from 0x0
现在的原因是当go 用于生成后台任务时堆栈大小为 2k。有趣的是我只传递了一个被调用函数的指针。这个问题在生产中发生在我身上,显然不同的结构,一切都工作了一年,然后突然开始抛出这个错误。
【问题讨论】:
-
是的,方法接收器也像任何其他参数一样被传递。用指针接收器就好了。
标签: go struct stack runtime goroutine