码迷,mamicode.com
首页 > 其他好文 > 详细

Go方法和函数的区别

时间:2020-01-24 09:29:32      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:code   str   test   类型   不能   highlight   image   class   本质   

1. 区别

技术图片

package main

import (
	"fmt"
)

type Person struct {
	Name string
}

//函数
//对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然
func test01(p Person) { //只能传值
	fmt.Println(p.Name)
}

func test02(p *Person) { //只能传指针
	fmt.Println(p.Name)
}

//对于方法(如struct的方法),
//接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以
func (p Person) test03() {
	p.Name = "jack"
	fmt.Println("test03() =", p.Name) //jack
}

func (p *Person) test04() {
	p.Name = "mary"
	fmt.Println("test03() =", p.Name) //mary
}

func main() {

	p := Person{"tom"}
	test01(p)
	test02(&p)

	p.test03()
	fmt.Println("main() p.name=", p.Name) //tom
	//陷阱
	(&p).test03() // 从形式上是传入地址,但是本质仍然是值拷贝
	fmt.Println("main() p.name=", p.Name) //tom,并没有别改变

	(&p).test04()
	fmt.Println("main() p.name=", p.Name) //mary
	p.test04() // 等价 (&p).test04 , 从形式上是传入值类型,但是本质仍然是地址拷贝


}

总结:

技术图片

 

Go方法和函数的区别

标签:code   str   test   类型   不能   highlight   image   class   本质   

原文地址:https://www.cnblogs.com/yzg-14/p/12231822.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!