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