美文网首页
接口的方法接收者的类型选择

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

作者: 夜空一起砍猩猩 | 来源:发表于2018-08-10 13:52 被阅读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, 而你又是想要改变原始值的内容,如何能定位到原来的值的地址呢?索性直接编译报错,防止这种行为的出现。

相关文章

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

    定义一个接口 if typeifinterface{ Method1() string} 定义一个结构体 st t...

  • 23 Golang中的接口(三)

    结构体值接收者和指针接收者实现接口的区别 值接收者如果结构体中的方法是值接收者,那么实例化后的结构体值类型和指针类...

  • 6-数据类型内存结构-interface

    1. 值接收者和指针接收者 实现了接收者是值类型的方法, 自动生成 了接收者是指针类型的方法; 实现了接收者是指针...

  • 12.手撕Go语言-方法

    方法是为特定类型定义的,只能由该类型调用的函数 定义 方法是添加了接收者的函数,接收者必须是自定义的类型 举例: ...

  • golang函数接收器及安全问题 2022-10-20

    不管接收者类型是值类型还是指针类型,都可以通过值类型或指针类型调用 实际上,当类型和方法的接收者类型不同时,其实是...

  • Go教程第十二篇: 方法

    方法 本文我们讲述方法。 简介 在func关键字和方法名之间存在接收者类型的那些函数,我们称之为方法。接收者可以是...

  • GO语言基础(四)

    方法 Go 没有类。不过你可以为结构体类型定义方法。方法就是一类带特殊的 接收者 参数的函数。方法接收者在它自己的...

  • 方法

    1、方法 Go 没有类。不过你可以为结构体类型定义方法。方法就是一类带特殊的接收者参数的函数。方法接收者在它自己的...

  • Go 语言极速入门5 - 面向接口

    一、接口 1.1、定义接口 1.2、实现接口 使用值接收者实现接口 对于值接收者,sendNotification...

  • Golang:方法

    什么是方法 一个方法只是一个函数,它有一个特殊的接收者(receiver)类型,该接收者放在 func 关键字和函...

网友评论

      本文标题:接口的方法接收者的类型选择

      本文链接:https://www.haomeiwen.com/subject/xomyvftx.html