方法
方法是為特定類型定義的,只能由該類型調(diào)用的函數(shù)。
方法是添加了接收者的函數(shù)坤检,接收者必須是自定義的類型。
func (t Type) method(parameters) returns{
}
package main
import "fmt"
// 自定義結(jié)構(gòu)體
type Dog struct {
name string
}
// 為結(jié)構(gòu)體定義方法Call, Call只能dog調(diào)用
func (dog Dog) Call() {
fmt.Printf("%s: 汪汪\n", dog.name)
}
// 為結(jié)構(gòu)體定義方法SetName
func (dog Dog) SetName(name string) {
dog.name = name
}
// 定義dog結(jié)構(gòu)體的PsetName方法饲梭,接受者為指針對象
func (dog *Dog) PsetName(name string) {
dog.name = name
}
func main() {
//聲明結(jié)構(gòu)體
var dog Dog
//字面量賦值
dog.name = "小黑"
dog.Call()
// 初始化結(jié)構(gòu)體
dog = Dog{"豆豆"}
// 調(diào)用結(jié)構(gòu)體的方法
dog.Call()
// 更改dog的名字
// dog.Name = "小黑"
// dog.Call()
// 調(diào)用結(jié)構(gòu)體方法
dog.SetName("小黑")
dog.Call()
/*
當(dāng)使用結(jié)構(gòu)體指針對象調(diào)用值接收者的方法時(shí)乘盖,Go 編譯器會自動將指針對象”解引用”為值調(diào)用方法;
當(dāng)使用結(jié)構(gòu)體對象調(diào)用指針接收者的方法時(shí),Go 編譯器會自動將值對象”取引用”為指針調(diào)用方法;
注:取引用和解引用發(fā)生在接收者中憔涉,對于函數(shù)/方法的參數(shù)必須保持變量類型一一對應(yīng)
使用值接收者還是指針接收者订框,取決于是否現(xiàn)需要修改原始結(jié)構(gòu)體
若不需要修改則使用值,若需要修改則使用指針
若存在指針接收者兜叨,則所有方法使用指針接收者
*/
// (&dog).PsetName("小黑") 取引用
dog.PsetName("小黑") // 自動取引用 語法糖
dog.Call()
pdog := &Dog{"豆豆"}
(*pdog).Call()
pdog.PsetName("小黑")
// (*pdog).Call() 自動解引用 語法糖
pdog.Call()
}