2014-09-24 65 views
1

在下面的代碼中,我期望fmt.Printf("%v\n", a)可以調用myTypeB類型成員的String(),但是這不會發生?爲什麼?Go,%v格式爲嵌套結構調用String()

package main 

import "fmt" 
type myTypeA struct { 
    b myTypeB 
} 
type myTypeB struct { 
    c string 
    d int 

} 

func (b myTypeB) String() string { 
    return "myTypeB custom" 
} 

func main() { 

    a:= myTypeA{myTypeB{"hello", 1}}; 
    b:= myTypeB{"hello", 1} 
    fmt.Printf("%v\n", a) 
    fmt.Printf("%v\n", b) 
} 

Playground link

回答

2

fmt不找fmt.Stringer遞歸。

如果參數是fmt.Stringer,它將調用String()方法並打印結果。如果它沒有String()方法,則fmt將使用反射來遍歷字段以獲取該值。