栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于golang中的method和func的理解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于golang中的method和func的理解

关于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
这里讲的超级详细。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270764.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号