1、调用方式不一样
- 函数调用方式: 函数名(实参列表)
- 方法调用方式: 变量.方法名(实参列表)
2、对于普通函数来说,参数接收者为值类型时,不能将指针类型数据直接传入,反之亦然。
3、对于方法(如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
}