1. 程式人生 > >golang 對介面方法使用*還是例項的坑

golang 對介面方法使用*還是例項的坑

對go來說,如果一個介面定義了

type I interface{
  F()
}

則對一個Object,以下兩種皆符合實現了介面

type Object Type{
}
func (o *Object) F(){
}
// 或者
func (o Object)F(){}

但是在使用時,如果涉及到interface裝箱,就需要為物件指明取地址還是例項,比如:

type U struct{
}
func (u *U) String() string{
    return "ptr"
}
func ToString(arg interface{})string{
    switch v:=arg.
(type){ case fmt.Stringer: return v.String() } } func main(){ u := U{} //則需要 fmt.Println(ToString(&u)) }

如果改為:

type U struct{
}
func (u U) String() string{
    return "ptr"
}
func ToString(arg interface{})string{
    switch v:=arg.(type){
        case fmt.Stringer:
return v.String() } } func main(){ u := U{} //則需要 fmt.Println(ToString(u)) }

二者的區別就在receiver一個是*U一個是U,對應的ToString(&u)和ToString(u) 這個坑要記住了