go fmt 引起的 stack overflow

在 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异常

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Notes Section 2, Program Structure nested block in if-els...
    keysaim阅读 1,192评论 0 1
  • fmt格式化字符串 格式:%[旗标][宽度][.精度][arg索引]动词旗标有以下几种:+: 对于数值类型总是输出...
    皮皮v阅读 1,132评论 0 3
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,537评论 0 13
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,483评论 0 10
  • 1. 下面代码能运行吗?为什么 运行结果: panic: assignment to entry in nil m...
    盘木阅读 5,455评论 0 1