方法
方法(Method)
就是一类带特殊的接收者(Receiver)
参数的函数。其与函数的区别在于,函数不属于任何类型,方法属于特定的类型。
定义格式:
func (接收者变量 接收者类型) 方法名(参数) 返回值 {
函数体
}
示例:
type myInt int
// 给myInt类型添加方法,判断值是否大于5
func (i myInt) biggerThanFive() bool {
if i > 5 {
return true
}
return false
}
func main() {
var a myInt
a = 10
// myInt类型的方法只有myInt类型的变量才能使用
fmt.Println(a.biggerThanFive()) // true
}
注意:非本地类型不能定义方法
基本类型(int、string)等不是本地类型,不能直接定义方法,但我们可以自定义类型,如上例中的myInt
,这样就可以为myInt
类型添加方法,而且myInt
具有int
类型的特性。
接收者参数
接收者参数可以是值类型,也可以是指针类型。区别在于指针类型,可以在方法中修改变量本身,而值类型只能修改变量副本,不会对变量本身产生影响。
以结构体为例:
type house struct {
size, price int
}
// 接收者变量名一般用类型名首字母的小写
// 接收者参数是值类型
func (h house) f1(newSize int) {
h.size = newSize
}
// 接收者参数是指针类型
func (h *house) f2(newSize int) {
h.size = newSize
}
func main() {
h1 := house{
100,
150,
}
h1.f1(120)
fmt.Printf("%#v\n", h1) // main.house{size:100, price:150}
h1.f2(150) // 这里可以是h1,也可以是(&h1)
fmt.Printf("%#v", h1) // main.house{size:150, price:150}
}
可以看到,调用f1
方法后,变量h1
没有被修改;调用f2
方法后,变量h1
被修改。
什么时候使用指针类型接收者
- 需要修改接收者变量
- 拷贝接收者变量的开销较大
- 保证一致性,一个方法用了,其他的也用指针类型接收者