Go-方法接收器

Go中分为2种接收器:指针类型、非指针类型

指针类型接收器

复制代码
package main

import "fmt"

type Property struct {
    value int
}

func (p *Property) SetValue(v int) {
    p.value = v
}

func (p *Property) GetValue() int {
    return p.value
}
func main() {
    pro := new(Property)
    pro.SetValue(100)
    fmt.Println(pro.value)      //100
    fmt.Println(pro.GetValue()) // 100
}
复制代码
  1. p *Property 表示此方法是指针类型接收器,针对的是 Property 类型的指针。方法中对 p 的成员变量的修改会直接影响到指针所指向的结构体变量的值。

  2. 对于指针类型接收器,方法对接收器所指向的结构体变量的修改是持久的,即使在方法结束后,也会一直有效。

  3. 这是因为指针类型接收器所传递的是指针的引用,指针指向的结构体变量的值会一直存在于内存中,直到被 GC 回收。

  4. 指针类型适合大对象的传递

非指针类型接收器

复制代码
package main

import "fmt"

type Point struct {
    X int
    Y int
}

func (p Point) Add(other Point) Point {
    return Point{
        p.X + other.X,
        p.Y + other.Y,
    }
}
func main() {
    p1 := Point{1, 1}
    p2 := Point{2, 2}
    result := p1.Add(p2)
    fmt.Println(result) //{3 3}
    fmt.Println(p1.X)   //1
    fmt.Println(p2.X)   //2

}
复制代码
  1. 返回的新Point对象 不会影响到p1、p2
  2. 不是指针类型传递 所以只是复制了p1、p2对象的值 做了修改得出新Point
  3. 因为是复制的形式 所以适合小对象的操作

总结

  1. 小对象由于值复制时的速度快,所以适合非指针类型接收器
  2. 大对象复制性能差,适合指针类型接收器

 

posted @   GJH-  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示