在go語言中冯袍,沒有類的概念但是可以給類型(結(jié)構(gòu)體康愤,自定義類型)定義方法。所謂方法就是定義了接受者的函數(shù)贮折。接受者定義在func關(guān)鍵字和函數(shù)名之間:
type Person struct {
name string
age int
}
func (p Person) say() {
fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}
有了對方法及接受者的簡單認(rèn)識(shí)之后调榄,接下來主要談一下接受者的類型問題踊赠。
接受者類型可以是struct,也可以是指向struc的指針。
情況一:接受者是struct
package main
import "fmt"
type Person struct {
name string
age int
}
func (p Person) say() {
fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}
func (p Person) older(){
p.age = p.age +1
}
func main() {
var p1 Person = Person{"zhansan",16}
p1.older()
p1.say()
//output: I'm zhangsan每庆,16 years old
var p2 *Person = &Person{"lisi",17}
p2.older()
p2.say()
//output: I'm lisi筐带,17 years old
}
對于p1的調(diào)用,讀者應(yīng)該不會(huì)有什么疑問缤灵。
對于p2的調(diào)用可能存在這樣的疑問伦籍,p2明明是個(gè)指針,為什么再調(diào)用了older方法之后腮出,打印結(jié)果還是17 years old?
方法的接受者是Person而調(diào)用者是*Person 帖鸦,其實(shí)在p2調(diào)用時(shí)存在一個(gè)轉(zhuǎn)換p2.older() -> *p2.older(); p2.say() -> *p2.say()
*p2是什么想必讀者也是明白的(就一個(gè)p2指向Person實(shí)例)。那么疑問也就自然的解開了,方法執(zhí)行時(shí)的接受者實(shí)際上還是一個(gè)值而非引用胚嘲。
情況二:接受者是指針
package main
import "fmt"
type Person struct {
name string
age int
}
func (p *Person) say() {
fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}
func (p *Person) older(){
p.age = p.age +1
}
func main() {
var p1 Person = Person{"zhansan",16}
p1.older()
p1.say()
//output: I'm zhangsan作儿,17 years old
var p2 *Person = &Person{"lisi",17}
p2.older()
p2.say()
//output: I'm lisi,18 years old
}
p1的調(diào)用中也存在一個(gè)轉(zhuǎn)換馋劈,
p1.older -> *p1.older
p1.say() -> *p1.say()