go中的值方法和指针方法

1前言

golang中在给结构体对象添加方法时,接收者参数类型可以有两种,一种是值类型,另一种是指针类型

func(t Type) Method(){}
func(t *Type) Method(){}

2 不同类型的对象调用不同类型的方法

2.1 值对象可以调用值方法和指针方法

type Person struct{
	Name string 
	Age int 
}
// 值方法
func(p Person) Zhi(){
	fmt.Printf("值方法打印名字: %s\n", p.Name)
}
// 指针方法修改年龄
func(p *Person) ZhiZhen(age int){
	p.Age = age
}

func main(){
    // 创建值对象Tom
	var Tom = Person{"tom", 10}
    Tom.Zhi() // 调用值方法
	Tom.ZhiZhen(20) // 调用指针方法
	fmt.Println(Tom.Age)  // 20
}

值对象肯定可以调用值方法,而对于指针方法的调用,其实是golang的语法糖,调用Tom.ZhiZhen()时,会自动转换成(&Tom).ZhiZhen()

3 指针对象可以调用值方法和指针方法

type Person struct{
	Name string 
	Age int 
}
// 值方法
func(p Person) Zhi(){
	fmt.Printf("值方法打印名字: %s\n", p.Name)
}
// 指针方法修改年龄
func(p *Person) ZhiZhen(age int){
	p.Age = age
}

func main(){
    // 创建指针对象Tom
	var Tom = &Person{"tom", 10}
    Tom.Zhi() // 调用值方法
	Tom.ZhiZhen(20) // 调用指针方法
	fmt.Println(Tom.Age)  // 20
}

指针对象调用值方法也是golang中的语法糖,在调用值方法Tom.Zhi()时,也会自动转换成(*Tom).Zhi()

4 !注意:结构体对象实现接口方法

如果我们调用一个接口里面的函数,结构体对象实现接口时的方法可能是指针方法也可以是值方法,注意:

  • 值类型只能调用值方法

  • 指针类型可以调用值方法和指针方法

    package main 
    
    import (
    	"fmt"
    )
    // 接口类型
    type People interface{
    	Say()
    	SetAge(age int)
    	GetAge()int 
    }
    // 结构体对象
    type Person struct{
    	Name string 
    	Age int 
    }
    // 值方法
    func(p Person) Say(){
    	fmt.Printf("值方法打印名字 %s\n", p.Name)
    }
    // 指针方法
    func(p *Person) SetAge(age int){
    	p.Age = age
    }
    // 值方法
    func(p Person)GetAge()int{
    	return p.Age
    }
    
    func main(){
    	// People是个接口,被Person指针对象赋值,以下方法都可以正确执行
    	var eve People  // 声明一个接口类型的对象
    	eve = &Person{"eve", 10} // Person实现了接口
    	eve.Say() 
    	eve.SetAge(20)
    	fmt.Println(eve.GetAge())
    
    	// 值类型并没有实现SetAge的方法,所以赋值的时候会报错
    	// 
    	var Tom People 
    	Tom = Person{"Tom", 12}
    	Tom.Say()
    	Tom.SetAge(10) // 报错 
        // cannot use Person literal (type Person) as type Human in assignment: Person does not implement Human (SetAge method has pointer receiver)
    	fmt.Println(Tom.GetAge())
    }
    
    

    那么什么时候使用指针方法,什么时候使用值方法呢,可以考虑:

    • 太多的指针可能会增加垃圾回收器的负担。

    • 如果一个值类型的尺寸太大,那么值传参的时候的复制成本将不可忽略。 指针类型都是小尺寸类型。

    • 在并发场合下,同时调用为值方法和指针方法比较易于产生数据竞争。

    • sync标准库包中的类型的值不应该被复制,所以如果一个结构体类型内嵌了这些类型,则不应该为这个结构体类型声明值方法。

    • 如果实在拿不定主意在一个方法声明中应该使用值类型属主还是指针类型属主,那么请使用指针方法

      原文链接:https://blog.csdn.net/weixin_44676081/article/details/111309791

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值