go fmt 引起的 stack overflow

七秒钟回忆待续 · · 2190 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在 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::StringerStringer 接口有 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)

参考文章: golang fmt递归引起stack overflow异常


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:七秒钟回忆待续

查看原文:go fmt 引起的 stack overflow

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2190 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传