接口的方法接收者的类型选择

2018-08-10  本文已影响0人  夜空一起砍猩猩

定义一个接口 if

type if interface{    

    Method1() string

}

定义一个结构体 st

type st struct{   

    msg string

}

定义一个测试方法test, 可以接收 实现了if接口的实例 做为形参

func test (i if){   

    i.Method1()

}


测试1: 结构体通过 值接收者 实现 Method1

func (s st) Method1() string{   

    return s.msg

}

func main(){   

    s1 := st{"test"}   

    s2 := &st{"test"}   

    test(s1)   

    test(s2)

}

测试可以通过,没有异常

测试2: 结构体通过 指针接收者 实现 Method1:

func (s *st) Method1() string{    

    return s.msg

}

func main(){   

    s1 := st{"test"}   

    s2 := &st{"test"}   

    test(s2) //正常执行

    test(s1)  //抛出错误 (st doesn't implement interface (Method1 has pointer receiver)   

}

关于 编译起抛出的错误"st doesn't implement interface (Method1 has pointer receiver)"

要了解用指针接收者来实现接口时为什么结构体类型 的值无法实现该接口,需要先了解方法集,方法集定义了一组关联到给定类型的值或者指针的方法.定义方法时使用的接收者类型决定了这个方法是关联到还是关联到指针,还可以是两个都关联.

简单的可以认为,go编译器定义了一个规则,如果使用指针接收者来实现一个接口,那么只有指向那个类型的指针才能够实现对应的接口。如果使用值接收者来实现一个接口,那么这个类型的值和指针都能够实现对应的接口。

想一想也可以这么理解,方法实参都是值传递,使用指针接收者是为了修改原来结构体的内容,你传给了方法一个值,方法执行期间对你这个原始值做了一份值copy, 而你又是想要改变原始值的内容,如何能定位到原来的值的地址呢?索性直接编译报错,防止这种行为的出现。

上一篇下一篇

猜你喜欢

热点阅读