关于golang中的method和func的理解

本文介绍了Go语言中的方法与函数的区别,强调了方法是通过接收者绑定到结构体上的特性,提供了面向对象的编程方式。通过示例代码展示了方法调用的不同方式,包括值接收者和指针接收者,以及它们在修改结构体值和避免大对象复制上的影响。文章最后指出,选择指针作为方法接收者通常更优,并解释了这样做的原因。
摘要由CSDN通过智能技术生成

关于golang中的method和func的理解

对于刚刚接触golang的同学,可能会把func和java的方法混为一谈,其实并不是这样,golang中也有着相关的方法:method,来提供面向对象的写法。
还是参考上一篇的代码:

package main

import "fmt"


type MyPoint struct {
	X int
	Y int
}

func printFuncValue(p MyPoint){
	p.X = 1
	p.Y = 1
	fmt.Printf(" -> %v", p)
}

func printFuncPointer(pp *MyPoint){
	pp.X = 1 // 实际上应该写做 (*pp).X,Golang 给了语法糖,减少了麻烦,但是也导致了 * 的不一致
	pp.Y = 1
	fmt.Printf(" -> %v", pp)
}

func (p MyPoint) printMethodValue(){
	p.X += 1
	p.Y += 1
	fmt.Printf(" -> %v", p)
}

// 建议使用指针作为方法(method:printMethodPointer)的接收者(receiver:*MyPoint),一是可以修改接收者的值,二是可以避免大对象的复制
func (pp *MyPoint) printMethodPointer(){
	pp.X += 1
	pp.Y += 1
	fmt.Printf(" -> %v", pp)
}

func main(){
	p := MyPoint{0, 0}
	pp := &MyPoint{0, 0}

	fmt.Printf("\n value to func(value): %v", p)
	printFuncValue(p)
	fmt.Printf(" --> %v", p)
	// Output: value to func(value): {0 0} -> {1 1} --> {0 0}

	//printFuncValue(pp) // cannot use pp (type *MyPoint) as type MyPoint in argument to printFuncValue

	//printFuncPointer(p) // cannot use p (type MyPoint) as type *MyPoint in argument to printFuncPointer

	fmt.Printf("\n pointer to func(pointer): %v", pp)
	printFuncPointer(pp)
	fmt.Printf(" --> %v", pp)
	// Output: pointer to func(pointer): &{0 0} -> &{1 1} --> &{1 1}

	fmt.Printf("\n value to method(value): %v", p)
	p.printMethodValue()
	fmt.Printf(" --> %v", p)
	// Output: value to method(value): {0 0} -> {1 1} --> {0 0}

	fmt.Printf("\n value to method(pointer): %v", p)
	p.printMethodPointer()
	fmt.Printf(" --> %v", p)
	// Output: value to method(pointer): {0 0} -> &{1 1} --> {1 1}

	fmt.Printf("\n pointer to method(value): %v", pp)
	pp.printMethodValue()
	fmt.Printf(" --> %v", pp)
	// Output: pointer to method(value): &{1 1} -> {2 2} --> &{1 1}

	fmt.Printf("\n pointer to method(pointer): %v", pp)
	pp.printMethodPointer()
	fmt.Printf(" --> %v", pp)
	// Output: pointer to method(pointer): &{1 1} -> &{2 2} --> &{2 2}
}

golang的method形式为:

func (r ReceiverType) funcName(parameters) (results)

比正常的func只是多了一个接收体 ReceiverType,
结合上述代码所示,在调用method的时候,不是传统的func的调用方法,而是一个 struct实例.method()的形式。这样做的好处是什么呢?是能够把method绑定到该struct上,就像作为该struct的一个字段一样,就算有多个名字相同,而接收体不同的method,不同的struct调用相同名字的method,go也会自动帮你调用不同的method。
如果还不懂请参考:https://www.jb51.net/article/56811.htm
这里讲的超级详细。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值