方法
方法是为特定类型定义的,只能由该类型调用的函数。
方法是添加了接收者的函数,接收者必须是自定义的类型。
func (t Type) method(parameters) returns{
}
package main
import "fmt"
// 自定义结构体
type Dog struct {
name string
}
// 为结构体定义方法Call, Call只能dog调用
func (dog Dog) Call() {
fmt.Printf("%s: 汪汪\n", dog.name)
}
// 为结构体定义方法SetName
func (dog Dog) SetName(name string) {
dog.name = name
}
// 定义dog结构体的PsetName方法,接受者为指针对象
func (dog *Dog) PsetName(name string) {
dog.name = name
}
func main() {
//声明结构体
var dog Dog
//字面量赋值
dog.name = "小黑"
dog.Call()
// 初始化结构体
dog = Dog{"豆豆"}
// 调用结构体的方法
dog.Call()
// 更改dog的名字
// dog.Name = "小黑"
// dog.Call()
// 调用结构体方法
dog.SetName("小黑")
dog.Call()
/*
当使用结构体指针对象调用值接收者的方法时,Go 编译器会自动将指针对象”解引用”为值调用方法;
当使用结构体对象调用指针接收者的方法时,Go 编译器会自动将值对象”取引用”为指针调用方法;
注:取引用和解引用发生在接收者中,对于函数/方法的参数必须保持变量类型一一对应
使用值接收者还是指针接收者,取决于是否现需要修改原始结构体
若不需要修改则使用值,若需要修改则使用指针
若存在指针接收者,则所有方法使用指针接收者
*/
// (&dog).PsetName("小黑") 取引用
dog.PsetName("小黑") // 自动取引用 语法糖
dog.Call()
pdog := &Dog{"豆豆"}
(*pdog).Call()
pdog.PsetName("小黑")
// (*pdog).Call() 自动解引用 语法糖
pdog.Call()
}