Golang 方法的结构指针接收者和结构值接收者

来源:互联网 发布:unity3d 5.6视频播放 编辑:程序博客网 时间:2024/06/09 15:05

结构体

(1)结构指针接收者,顾名思义,会在方法内部改变该结构内部变量的值;
(2)结构值接收者,在方法内部对变量的改变不会影响该结构。
示例如下:

type My struct {    num int}func (self My) AddOne() {    self.num++}func (self *My) AddTwo() {    self.num += 2}func Test() {    my1 := My{1} //值接收者    my1.AddOne()    // 1 不改变num的值    fmt.Println(my1.num)    my2 := &My{1}// 指针接收者    my2.AddTwo()    // 3改变num的值    fmt.Println(my2.num)}

另外:
(3)对于指针接收者,如果你调用的是值方法,即使你是指针调用者,也不会改变你的结构内的变量值
(4)对于值接收者,如果你调用的是指针方法,即使你是值调用者,也会改变你的结构内的变量值
示例如下:

func Test() {    my3 := My{1}// 值接收者    my3.AddTwo()    // 3 改变num的值    fmt.Println(my3.num)    my4 := &My{1}// 指针接收者    my4.AddOne()    // 1 不改变num的值    fmt.Println(my4.num)}

接口

type Valueer interface {    printf()}type Value1 struct {    num int}type Value2 struct {    num int}func (self *Value1) printf() {    fmt.Println(self.num)}func (self *Value2) printf() {    fmt.Println(self.num)}func testValue() {    var te1 Valueer    te1 = Value1{1}    te1.printf()    var te2 Valueer    te2 = Value2{1}    te2.printf()}

上述代码编译出错:
这里写图片描述

说明一个结构实现了接口的指针接收方法的话,将该结构的值赋值给接口是不行的,他不能找到该方法。
具体的语言规范里定义的规则如下:

类型 *T 的可调用方法集包含接受者为 *T 或 T 的所有方法集
这条规则说的是如果我们用来调用特定接口方法的接口变量是一个指针类型,那么方法的接受者可以是值类型也可以是指针类型.

类型 T 的可调用方法集包含接受者为 T 的所有方法

由以上两条规则,知道我们不符合这两条规则。
更改如下:

func testValue() {    var te1 Valueer    te1 = &Value1{1}    te1.printf()    var te2 Valueer    te2 = &Value2{1}    te2.printf()}

引用 :https://studygolang.com/articles/1113

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 味全优酪乳风味发酵乳 香辣味 味全 味全每日 味全果汁 味全麻辣烫 味全曝光 味全果汁价格 味全布丁粉 味全活性乳酸菌草莓味 味全高鲜味精 味全酸奶 味全减肥吗 味全鲜奶 味全乳酸菌多少钱一瓶 味全代理商 味全产品 味全代理 味全 酸奶 味全多少钱一瓶 味全饮料 味全经销商 味全酸奶怎么样 孕妇可以喝味全吗 味全乳酸菌批发 味全 乳酸菌 味全怎么样 喝味全乳酸菌会胖吗 味全活性乳酸菌减肥吗 味全乳酸菌饮料 味全产品介绍 味全餐饮 味全乳酸菌代理 味全生计 味全电话 酸奶味全 味全如何 味全面馆 味全妈妈 味全酸奶多少钱 味全燕麦酸奶