在 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)