对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)
这个坑要记住了