我只是通过Tour of Go学习golang语言,我到达了Stringer部分。 (https://tour.golang.org/methods/17)
我试着理解它是如何工作的,所以我尝试了它。它不起作用。
代码:
package main
import (
"fmt"
)
type I int
func (i I) String() string {
return fmt.Sprintf("%v", i)
}
func main() {
i := I(10)
fmt.Println(i)
}
当我运行该示例时,我收到了一个错误,我不太明白什么是探测器。
我的理论是使用String()方法: 当我运行打印机代码时,程序会查找stringer方法,如果它存在则运行它。 它的工作原理是这样的吗?
任何人都可以向我解释这是如何运作的吗?
错误(在Tour of Go中):
runtime: goroutine stack exceeds 250000000-byte limit
fatal error: stack overflow
runtime stack:
runtime.throw(0xff4a2, 0xe)
/usr/local/go/src/runtime/panic.go:605 +0x100
runtime.newstack(0x0, 0x0)
/usr/local/go/src/runtime/stack.go:1050 +0x960
runtime.morestack()
/usr/local/go/src/runtime/asm_amd64p32.s:378 +0xa0
goroutine 1 [running]:
runtime.mallocgc(0x4, 0xef280, 0x18500300, 0x0, 0x0, 0x0)
/usr/local/go/src/runtime/malloc.go:581 +0xb60 fp=0x18500360 sp=0x18500358 pc=0x31440
runtime.convT2E32(0xef280, 0x185003a4, 0x83cc0, 0x10)
/usr/local/go/src/runtime/iface.go:247 +0x80 fp=0x18500380 sp=0x18500360 pc=0x2e000
main.I.String(0xa, 0x185003d0, 0x185003d4, 0x0)
/tmp/sandbox580986616/main.go:10 +0x40 fp=0x185003b8 sp=0x18500380 pc=0xd4f60
main.(*I).String(0x1391de68, 0x11d050, 0x13972a80, 0xef280)
<autogenerated>:1 +0x40 fp=0x185003d0 sp=0x185003b8 pc=0xd51c0
fmt.(*pp).handleMethods(0x13972a80, 0x76, 0x1, 0x0)
/usr/local/go/src/fmt/print.go:596 +0x3a0 fp=0x18500420 sp=0x185003d0 pc=0xcdf60
fmt.(*pp).printArg(0x13972a80, 0xef280, 0x1391de68, 0x76)
/usr/local/go/src/fmt/print.go:679 +0x1a0 fp=0x18500468 sp=0x18500420 pc=0xce540
fmt.(*pp).doPrintf(0x13972a80, 0xfe0ce, 0x2, 0x18500560, 0x1, 0x1)
/usr/local/go/src/fmt/print.go:996 +0x180 fp=0x18500508 sp=0x18500468 pc=0xd32c0
fmt.Sprintf(0xfe0ce, 0x2, 0x18500560, 0x1, 0x1, 0x0, 0x0, 0x0)
/usr/local/go/src/fmt/print.go:196 +0x60 fp=0x18500538 sp=0x18500508 pc=0xca160
main.I.String(0xa, 0x18500588, 0x1850058c, 0x0).......
答案 0 :(得分:3)
你的问题很简单。您将I
类型的值传递给fmt.Println
,并调用I
String
方法,该方法调用fmt.Sprintf
,其值为I
,调用I
s String
方法......
只需将I
String
方法的正文更改为:return fmt.Sprintf("%v", int(i))
,您就应该好了。
答案 1 :(得分:-1)
fmt.Sprintf("%v", i)
在Sprintf方法中,它将调用i的string(),而我的字符串将其称为fmt.Sprintf(),因此堆栈溢出。