2 回答

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
該值傳遞給Println作為interface{},并檢查它是否滿足fmt.Stringer通過一個(gè)接口“類型斷言”通常以的形式“型開關(guān)”。
func IsStringer(i interface{}) {
switch s := i.(type) {
case fmt.Stringer:
fmt.Println("Person a has a String() method")
fmt.Println(s.String())
default:
fmt.Println("not a stringer")
}
// OR for a single type
if s, ok := i.(fmt.Stringer); ok {
fmt.Println("Person a has a String() method")
fmt.Println(s.String())
}
}
但是,從fmt包裝中打印時(shí),其他方法可能優(yōu)先。首先檢查fmt.Formatter, fmt.GoStringer, error, 最后檢查fmt.Stringer。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊
該fmt
包與它定義的接口工作,在這種情況下Stringer
。它不知道您定義的接口,因此String2()
即使您將滿足該Stringer2
接口的類型傳遞給它,它也不知道調(diào)用。
接口是一種在類型之間具有共同行為的方式。因此,如果您創(chuàng)建一個(gè)函數(shù)Foo(s Stringer2)
,F(xiàn)oo 可以簡單地調(diào)用s.String2()
確信傳入它的任何內(nèi)容都將具有該函數(shù)String2()
。
更深入一點(diǎn),fmt.Println
獲取interface{}
類型,然后使用反射來檢查給定的參數(shù)是否滿足Stringer
接口,然后調(diào)用String()
.
有道理?
- 2 回答
- 0 關(guān)注
- 230 瀏覽
添加回答
舉報(bào)