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

本文探讨了Golang中结构体方法的指针和值接收者差异。指针接收者能直接修改结构体内部变量,而值接收者则不会。即使通过指针调用值方法或反之,行为也会有所不同。此外,文章提到当结构体实现接口的指针接收方法时,将结构体值赋给接口会导致编译错误,遵循Golang的特定方法集规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体

(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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值