目录
func (recever Type) funcName(参数..) {}
概述
在go中, 方法就是有接收者的函数, 只有接收者可以调用该函数, 在定义函数的时候把接收者放在函数名之前并指定类型即可.
语法
func (recever Type) funcName(参数..) {}
使用方法
接收者调用方法时分为两种情况: 值类型, 指针类型
调用值类型接收者方法时, 方法内接收到调用者的拷贝值, 修改拷贝值并不会影响到调用者
调用指针类型接收者方法时, 调用者既能是值也可以是指针, 如果是值方法内部则接收到值的内存地址.
package main
import "fmt"
type Person struct {
name string
age int
}
func (man Person) ValueTest(age int) {
man.age = age
fmt.Printf("调用值类型方法: man的地址是%p, man的值是%v\n", &man, man)
}
func (man *Person) PointerTest() {
fmt.Printf("调用指针类型方法: man的地址是%p, man的值是%v\n", man, *man)
}
func main() {
kitty := Person {"kitty",18}
kitty.ValueTest(20) // ValueTest(d)
kitty.PointerTest() // PointerTest(&d)
fmt.Printf("kitty的地址: %p, kitty的值%v\n", &kitty, kitty)
}
可以看到调用值类型方法时函数内访问的是调用者的副本, 调用指针类型方法时函数内访问的是调用者的地址
方法与函数
不同点 :
1. 方法通过接收者调用, 函数只能普通调用
2. 接收者可以调用值类型和指针类型方法, 函数调用如有参数必须符合其规定类型
相同点 :
1. 值类型方法内部访问调用者和函数访问参数都是原值的副本
package main
import "fmt"
func ValueTest(num int) {
num = 99
fmt.Printf("调用函数: num的地址是%p, num的值是%v\n", &num, num)
}
func main() {
total := 20
ValueTest(total)
fmt.Printf("total地址是%p, total的值是%v\n", &total, total)
}
指针接收者的使用场景
1. 需要修改接收者指向的值
2. 值接收者指向的值占用内存极大的时候 (因为值接收者方法内部访问的是值的副本, 副本在内存中也占优空间)
总结
1. 方法是有接收者的函数, 通过符合类型的接收者调用
2. 调用值类型接收者方法, 内部访问接收者的拷贝
3. 调用指针类型接收者方法, 内部访问接收者的地址