嵌套结构 String() 方法中的递归打印错误
此问题探讨了尝试使用打印嵌套结构时的堆栈溢出问题带有 % v 格式说明符的 String() 方法。
问题:
用户尝试使用以下代码在 String() 方法中返回嵌套的结构元素:
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("%+v\n", c) }</code>
当用户尝试使用 Logger.Infoln(c.String()) 打印结构体时,遇到错误:
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
解释:
%v 和 % v 格式使用 String() 的值(如果类型实现了它)。因此,在 String() 函数中对该类型使用 % v 会导致无限递归。
在这种情况下,String() 方法调用 fmt.Sprintf("% v", c),其中在嵌入的 Daemon 结构上递归调用 String() 方法,等等。这会导致无限循环和堆栈溢出。
解决方案:
要解决此问题,用户不应在 String() 函数中使用 % v。相反,他们应该构建自己的字符串,以他们认为合适的任何方式显示结构的内容。例如:
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", c.Daemon.Loglevel, c.Daemon.Logfile) }</code>
以上是为什么在嵌套结构的“String()”方法中使用“% v”会导致堆栈溢出?的详细内容。更多信息请关注PHP中文网其他相关文章!