Golang中goroutine的垃圾回收异常问题
Golang中goroutine的垃圾回收异常问题 大家好,我在尝试在goroutine中使用参数时遇到了一些问题。由于我已经尝试了许多不同的替代方案但都没有成功,我将在这里描述这个问题。我有一个函数,它创建了一个自定义类型Transaction的对象(包含一些字符串和字符串指针字段),我想在定义的时间间隔后对这个事务进行一些操作。为此,我编写了以下代码:
func step1 () {
transaction := Transaction{
Name: "transactionName",
Type: "transactionType1",
....
}
go func (t Transaction){
trans := t
fmt.Println(trans)
time.Sleep(sleepDuration)
fmt.Println(trans)
doSomething(trans)
}(transaction)
}
问题是,这个事务对象似乎不是按值传递的,因为在两次打印之间,事务的一些字符串字段变成了随机值。我猜测在函数“step1”返回后,事务对象被垃圾回收了(但我确实想启动这个后台任务并返回)。然而,这对我来说说不通,因为值应该是按值传递的,而且我在那里也显式地复制了对象。 你们有人知道为什么会发生这种行为以及有什么替代方案吗? (我尝试过的一些替代方案包括:不使用匿名函数、使用time.AfterFunc方法、创建一个匿名函数来为参数构建另一个函数。似乎都没有效果。)
提前感谢
更多关于Golang中goroutine的垃圾回收异常问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
字符串字段在改变,还是字符串指针字段在改变?如果是前者,能否提供一个我可以运行并逐步调试的示例?如果是后者,那么听起来像是 doSomething 正在修改这些字段。即使你通过值传递一个结构体,如果该值包含指针,那么你仍然可以通过这些指针修改值。
在你的示例中,我看不出这怎么可能发生,但如果你(也许是意外地)在 goroutine 闭包中引用了 transaction 而不是 t 或 trans,你将通过引用访问该变量,所以这就像通过指针传递它一样:https://play.golang.org/p/e_RQ8EM2o66
func main() {
fmt.Println("hello world")
}
更多关于Golang中goroutine的垃圾回收异常问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


