go 问题一则 ....

wwwmmm 发布于 2013/04/02 10:49
阅读 268
收藏 0
Go
package main

import "fmt"

type A int

func (a A) String() string {
    return fmt.Sprintf("%v", a)
}

func main() {
    var a A
    fmt.Println("this will never print", a)
}
 @cai2010   在g+ 上看到的   求解释
                
加载中
0
wwwmmm
wwwmmm
@cai2010 
0
wwwmmm
wwwmmm
..... @ 错了   @chai2010
0
chai2010
chai2010

应该是引起无穷递归调用了。

fmt.Println输出a时,会调用a的String函数。

在a的String函数内又调用了fmt.Sprintf函数,同样会调用a的String函数。

递归无法终止...

0
chai2010
chai2010

主要是String的方法写的有问题,String方法内的 fmt.Sprintf 不能再引用A类型(因为要输出A类型变量又会找到当前的String方法)。

这样写就没问题:

package main

import "fmt"

type A int

func (a A) String() string {
	// return fmt.Sprintf("%v", a)
	return fmt.Sprintf("%d", int(a))
}

func main() {
	var a A
	fmt.Println("this will never print", a)
}

fmt.Sprintf("%d", int(a)) 直接转到int类型,不会走到A类型的String方法。

这个问题类似于:递归的问自己,我是谁?

0
王振威
王振威
递归死循环 ,因为Sprintf会调用String()方法,
0
wwwmmm
wwwmmm

引用来自“chai2010”的答案

主要是String的方法写的有问题,String方法内的 fmt.Sprintf 不能再引用A类型(因为要输出A类型变量又会找到当前的String方法)。

这样写就没问题:

package main

import "fmt"

type A int

func (a A) String() string {
	// return fmt.Sprintf("%v", a)
	return fmt.Sprintf("%d", int(a))
}

func main() {
	var a A
	fmt.Println("this will never print", a)
}

fmt.Sprintf("%d", int(a)) 直接转到int类型,不会走到A类型的String方法。

这个问题类似于:递归的问自己,我是谁?

了解了 谢谢
0
wwwmmm
wwwmmm

引用来自“王振威”的答案

递归死循环 ,因为Sprintf会调用String()方法,
THX
返回顶部
顶部