golang 對介面方法使用*還是例項的坑
阿新 • • 發佈:2018-11-10
對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()
default:
return ""
}
}
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()
default:
return ""
}
}
func main(){
u := U{}
//則需要
fmt.Println(ToString(u))
}
二者的區別就在receiver一個是*U一個是U,對應的ToString(&u)和ToString(u)
這個坑要記住了