分享
go fmt 引起的 stack overflow
七秒钟回忆待续 · · 2664 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
在 GO 里实现 String 方法会格式化输出。例如:
package main
import (
"fmt"
)
type People struct {
Name string
Age int
Sex string
}
func (p *People) String() string {
return fmt.Sprintf("people info: %+v", p)
}
func main() {
p := &People{Name: "Lucy", Age: 18, Sex: "M"}
fmt.Println(p)
}
预期的结果是:people info: &{Name:Lucy Age:18 Sex:M}
实际的结果是:
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow
runtime stack:
在 go 的源码里:src/fmt/print.go::Stringer, Stringer 接口有 String 方法,People struct 也有 String 方法,间接实现了 Stringer 接口,因此出现了 stack overflow 的错误,递归了。
解决办法:
- 把
String方法改为ToString - 在
People.String方法里传递属性,即把fmt.Sprintf("people info: %+v", p)改为fmt.Sprintf("people info: Name:%s, Age:%d, Sex:%s", p.Name, p.Age, p.Sex)
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信2664 次点击
上一篇:Go Reflect
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
在 GO 里实现 String 方法会格式化输出。例如:
package main
import (
"fmt"
)
type People struct {
Name string
Age int
Sex string
}
func (p *People) String() string {
return fmt.Sprintf("people info: %+v", p)
}
func main() {
p := &People{Name: "Lucy", Age: 18, Sex: "M"}
fmt.Println(p)
}
预期的结果是:people info: &{Name:Lucy Age:18 Sex:M}
实际的结果是:
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow
runtime stack:
在 go 的源码里:src/fmt/print.go::Stringer, Stringer 接口有 String 方法,People struct 也有 String 方法,间接实现了 Stringer 接口,因此出现了 stack overflow 的错误,递归了。
解决办法:
- 把
String方法改为ToString - 在
People.String方法里传递属性,即把fmt.Sprintf("people info: %+v", p)改为fmt.Sprintf("people info: Name:%s, Age:%d, Sex:%s", p.Name, p.Age, p.Sex)