区别
-
调用方式不一样
- 函数调用方式: 函数名(实参列表)
- 方法调用方式: 变量.方法名(实参列表)
-
对于普通函数来说,参数接收者为值类型时,不能将指针类型数据直接传入,反之亦然。
-
对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来也可以
代码展示
下面展示的代码,分别从方法和函数的调用、传参来演示方法和函数的区别👇
package main
import "fmt"
type Person struct {
Name string
}
// 实现打印人名的函数
// 普通函数,参数是值类型,传递的参数也必须是值类型;参数是指针类型,必须传递地址。
func printName(p Person) {
fmt.Println("printName函数 人名 = ", p.Name) // tom
}
func printName2(p *Person) {
fmt.Println("printName函数 人名 = ", p.Name) // tom
}
// 值接收者Person的方法
func (p Person) printName() {
p.Name = "jack"
fmt.Println("Person 方法 人名 = ", p.Name) // jack
}
// 指针接收者Person的方法
func (p *Person) printName2() {
p.Name = "bill"
fmt.Println("*Person 方法 人名 = ", p.Name) // bill
}
func main() {
// 方法和函数的区别
p := Person{"tom"}
// 调用函数
printName(p)
printName2(&p) // 函数的形参类型必须跟实参类型一致,都为值类型,或者都为指针类型
// 调用方法 (值接收者)
// 值接收者 不论调用者变量是值还是地址,都不会改变原始数据
p.printName()
fmt.Println("值接收者1 p.Name = ", p.Name) // tom
(&p).printName()
fmt.Println("值接收者2 p.Name = ", p.Name) // tom
// 调用方法 (指针接收者)
// 指针接收者, 会改变原始数据
p.printName2()
fmt.Println("指针接收者1 p.Name = ", p.Name) // bill
(&p).printName2()
fmt.Println("指针接收者2 p.Name = ", p.Name) // bill
}
🎈🎈🎈
🌹 关注我,你会发现一个不太安分的宝藏前端,让我们一起共同成长😊
🎉 喜欢的小伙伴可以点赞收藏关注
✨ 欢迎大家转发评论交流, 蟹蟹😊
本文正在参加技术专题18期-聊聊Go语言框架