1、调用方式不一样

    • 函数调用方式: 函数名(实参列表)
    • 方法调用方式: 变量.方法名(实参列表)

    2、对于普通函数来说,参数接收者为值类型时,不能将指针类型数据直接传入,反之亦然。
    3、对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来也可以

    1. // 方法练习
    2. package main
    3. import "fmt"
    4. type Person struct {
    5. Name string
    6. }
    7. // 实现打印人名的函数
    8. // 普通函数,参数是值类型,传递的参数也必须是值类型;参数是指针类型,必须传递地址。
    9. func printName(p Person) {
    10. fmt.Println("printName函数 人名 = ", p.Name) // tom
    11. }
    12. func printName2(p *Person) {
    13. fmt.Println("printName函数 人名 = ", p.Name) // tom
    14. }
    15. // 值接收者Person的方法
    16. func (p Person) printName() {
    17. p.Name = "jack"
    18. fmt.Println("Person 方法 人名 = ", p.Name) // jack
    19. }
    20. // 指针接收者Person的方法
    21. func (p *Person) printName2() {
    22. p.Name = "bill"
    23. fmt.Println("*Person 方法 人名 = ", p.Name) // bill
    24. }
    25. func main() {
    26. // 方法和函数的区别
    27. p := Person{"tom"}
    28. // 调用函数
    29. printName(p)
    30. printName2(&p) // 函数的形参类型必须跟实参类型一致,都为值类型,或者都为指针类型
    31. // 调用方法 (值接收者)
    32. // 值接收者 不论调用者变量是值还是地址,都不会改变原始数据
    33. p.printName()
    34. fmt.Println("值接收者1 p.Name = ", p.Name) // tom
    35. (&p).printName()
    36. fmt.Println("值接收者2 p.Name = ", p.Name) // tom
    37. // 调用方法 (指针接收者)
    38. // 指针接收者, 会改变原始数据
    39. p.printName2()
    40. fmt.Println("指针接收者1 p.Name = ", p.Name) // bill
    41. (&p).printName2()
    42. fmt.Println("指针接收者2 p.Name = ", p.Name) // bill
    43. }