golang 对接口方法使用*还是实例的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fwhezfwhez/article/details/82995075

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

猜你喜欢

转载自blog.csdn.net/fwhezfwhez/article/details/82995075