有没有办法在Go程序中复制和恢复调用堆栈?

有没有办法在Go程序中复制和恢复调用堆栈?,go,callstack,continuations,go-toolchain,Go,Callstack,Continuations,Go Toolchain,我试图在Go程序中实现无限范围的延续(对于那些好奇的人,我正在编写一个scheme解释器)。一种方法是将调用堆栈复制到堆中,以便以后可以恢复。Go的垃圾收集器仍然需要知道堆栈副本中的所有指针。在围棋项目中有没有办法做到这一点?请注意,如果需要,我愿意用C或汇编语言编写代码,与Go工具链兼容。不直接编写。由于您正在编写的是一个解释器,因此可能有某种方法实际上可以创建一个延续,方法是在通道读取时阻止正在运行的goroutine(通道是您的延续对象),然后通过发送到该通道来恢复它。不过,我对计划方面的

我试图在Go程序中实现无限范围的延续(对于那些好奇的人,我正在编写一个scheme解释器)。一种方法是将调用堆栈复制到堆中,以便以后可以恢复。Go的垃圾收集器仍然需要知道堆栈副本中的所有指针。在围棋项目中有没有办法做到这一点?请注意,如果需要,我愿意用C或汇编语言编写代码,与Go工具链兼容。

不直接编写。由于您正在编写的是一个解释器,因此可能有某种方法实际上可以创建一个延续,方法是在通道读取时阻止正在运行的goroutine(通道是您的延续对象),然后通过发送到该通道来恢复它。不过,我对计划方面的了解还不够,无法自信地勾勒出更多的细节。@Two:谢谢你的提示!我在想也许有一种方法可以用goroutines实现,但我不知道怎么做。你的建议可能行得通。@Two:再想一想,它可能行不通,因为不可能多次重复相同的延续。有没有办法复制goroutines?啊,很吸引人。不,我不知道你可以复制一个续集,恢复两个副本,让它们都从同一点开始。你可以复制一个通道,如果goroutine再次读取时阻塞,你可以再次发送给它,但它将从新状态恢复,而不是旧状态。我所能看到的是,要获得这些精确的语义,就要一直到最低级别,让你自己的小字节码解释器处理[]接口{}的堆栈显然,这是一种更难的项目类型。