方法定义
Golang 方法总是绑定对象实例,并隐式将实例作为第一实参 (receiver)。
• 只能为当前包内命名类型定义方法。
• 参数 receiver 可任意命名。如方法中未曾使用 ,可省略参数名。
• 参数 receiver 类型可以是 T 或 *T。基类型 T 不能是接口或指针。 (下面例子演示)
• 不支持方法重载,receiver 只是参数签名的组成部分。
• 可用实例 value 或 pointer 调用全部方法,编译器自动转换。(下面例子演示)
一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。
(以上这几点很重要,需要细品)
所有给定类型的方法属于该类型的方法集。
1.1.1. 方法定义:
func (recevier type) methodName(参数列表)(返回值列表){}
参数和返回值可以省略
package main
import(
"fmt"
)
type Demo struct{
age int
}
//receiver 类型 为指针*T
func (d *Demo) add1 (n int) (r int){
r = d.age + n
d.age = r //此处对d.age的值进行更新
fmt.Println("add1:", d.age)
return
}
//receiver 类型 为指针T
func (d Demo) add2 (n int) (r int){
r = d.age + n
d.age = r //此处对d.age的值进行更新
fmt.Println("add2:", d.age)
return
}
func main() {
var demo1 Demo //实例化一个 Demo 赋值给demo1
var demo2 Demo //实例化一个 Demo 赋值给demo2
fmt.Println("采用实例的value(值)调用方法")
demo1.age = 10 //初始化demo1.age的值
demo1.add1(5) //add1: 15
fmt.Println(demo1.age) //15 因为add1() receiver 类型 为*T 所以demo1.age的值会被更新
demo1.age = 10 //重新赋值
demo1.add2(5) //add2: 15
fmt.Println(demo1.age) //10 因为add1() receiver 类型 为T 所以demo1.age的值不会被更新
demo2.age = 10 //初始化demo2.age的值
p := &demo2 //获取demo2的指针赋值给 p
fmt.Println("采用实例的pointer指针调用方法")
p.add1(5) //15
fmt.Println(p.age) //15
fmt.Println(demo2.age) //15
demo2.age = 10 //重新赋值
p.add2(5) //15
fmt.Println(p.age) //10
fmt.Println(demo2.age) //10
}