go fmt 引起的 stack overflow

2019-07-15  本文已影响0人  七秒钟回忆待续

在 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 的错误,递归了。

解决办法:

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

上一篇 下一篇

猜你喜欢

热点阅读