日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
聊一聊Golang方法接收者
  • [定義]:golang的方法(Method)是一個帶有receiver的函數(shù)Function,Receiver是一個特定的struct類型,當(dāng)你將函數(shù)Function附加到該receiver, 這個方法Method就能獲取該receiver的屬性和其他方法。
  • [面向?qū)ο骫:golang方法Method允許你在類型上定義函數(shù),是一個面向?qū)ο蟮男袨榇a, 這也有一些益處:同一個package可以有相同的方法名, 但是函數(shù)Function卻不行。
func(receiver receiver_type)some_func_name(arguments)return_values

本次我們使用地址空間的角度來剖析實(shí)質(zhì),強(qiáng)化記憶。

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)建站的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無止境。

值類型方法接收者

值接受者:receiver是struct等值類型。

下面定義了值類型接受者 Person, 嘗試使用 Person{}, &Person{}去調(diào)用接受者函數(shù)。

package main
import "fmt"
type Person struct {
name string
age int
}
func (p Person) say() {
fmt.Printf("I (%p) ma %s, %d years old \n",&p, p.name,p.age)
}
func (p Person) older(){ // 值類型方法接受者:接受者是原類型值的副本
p.age = p.age +1
fmt.Printf("I (%p) am %s, %d years old\n", &p, p.name,p.age)
}
func main() {
p1 := Person{name: "zhangsan", age: 20}
p1.older()
p1.say()
fmt.Printf("I (%p) am %s, %d years old\n",&p1, p1.name,p1.age)
p2 := &Person{ name: "sili", age: 20}
p2.older() // 即使定義的是值類型接受者, 指針類型依舊可以使用,但我們傳遞進(jìn)去的還是值類型的副本
p2.say()
fmt.Printf("I (%p) am %s, %d years old\n",p2, p2.name,p2.age)
}

嘗試改變p1=Person{},p2=&Person{}的字段值:

I (0xc000098078) am zhangsan, 21 years old
I (0xc000098090) ma zhangsan, 20 years old
I (0xc000098060) am zhangsan, 20 years old
I (0xc0000980c0) am sili, 21 years old
I (0xc0000980d8) ma sili, 20 years old
I (0xc0000980a8) am sili, 20 years old

p1=Person{} 未能修改原p1的字段值;p2=&Person{}也未能修改原p2的字段值。

  • 通過Person{}值去調(diào)用函數(shù), 傳入函數(shù)的是原值的副本, 這里通過第一行和第三行的 %p印證 (%p:輸出地址值, 這兩個非同一地址)。
  • 即使定義的是值類型接收者,指針類型依舊可以調(diào)用函數(shù), 但是傳遞進(jìn)去的還是值類型的副本。

帶來的效果是:對值類型接收者內(nèi)的字段操作,并不影響原調(diào)用者。

指針類型接受者

方法接收者也可以定義在指針上,任何嘗試對指針接收者的修改,會體現(xiàn)到調(diào)用者。

package main
import "fmt"
type Person struct{
name string
age int
}
func (p Person) say(){
fmt.Printf("I (%p) am %s, %d years old\n", &p, p.name,p.age)
}
func (p *Person) older(){ // 指針接受者,傳遞函數(shù)內(nèi)部的是原類型值(指針), 函數(shù)內(nèi)的操作會體現(xiàn)到原指針指向的空間
p.age = p.age +1
fmt.Printf("I (%p) am %s, %d years old\n", p, p.name,p.age)
}
func main() {
p1 := Person{"zhangsan",20}
p1.older() // 雖然定義的是指針接受者,但是值類型依舊可以使用,但是會隱式傳入指針值
p1.say()
fmt.Printf("I (%p) am %s, %d years old\n", &p1, p1.name,p1.age)
p2:= &Person{"sili",20}
p2.older()
p2.say()
fmt.Printf("I (%p) am %s, %d years old\n", p2, p2.name,p2.age)
}

嘗試改變p1= Person{}, p2=&Person{}字段值

I (0xc000098060) am zhangsan, 21 years old
I (0xc000098078) am zhangsan, 21 years old
I (0xc000098060) am zhangsan, 21 years old
I (0xc000098090) am sili, 21 years old
I (0xc0000980a8) am sili, 21 years old
I (0xc000098090) am sili, 21 years old

p1=Person{} 成功修改字段值,p2=&Person{}也成功修改字段值。

  • 通過p1也可以調(diào)用指針函數(shù)接收者, 但是實(shí)際會隱式傳遞指針值。
  • 指針接收者,入?yún)⑹窃羔樦?,函?shù)內(nèi)的操作會體現(xiàn)到原調(diào)用者。

帶來的效果:任何對指針接收者的修改會體現(xiàn)到 原調(diào)用者。

什么時候使用指針接收者

  • 需要對接受者的變更能體現(xiàn)到原調(diào)用者
  • 當(dāng)struct占用很大內(nèi)存,最好使用指針接受者,否則每次調(diào)用接受者函數(shù) 都會形成struct的大副本

golang方法的另外幾種姿勢

接上例子:

1. 將接收者函數(shù)當(dāng)擴(kuò)展函數(shù)

Person.say(p1)
(*Person).older(p2)

依舊是 值類型/指針類型方法接收者的效果:

I (0xc0000040d8) am zhangsan, 21 years old
I (0xc0000040a8) am sili, 22 years old

這種姿勢相對于面向?qū)ο蟮慕邮照卟怀R姟?/p>

2. 形成golang 方法鏈條

func (p Person) printName() Person{
fmt.Printf("Name:%s", p.Name)
return p
}

3. Non_struct類型golang方法

type myFloat float64
func (m myFloat) ceil() float64 {
return math.Ceil(float64(m))
}

當(dāng)前名稱:聊一聊Golang方法接收者
URL標(biāo)題:http://www.5511xx.com/article/dhieopp.html