成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊 Golang 方法接收者

開(kāi)發(fā) 前端
從應(yīng)用上講,方法接受者分為值接收者/指針接收者,初級(jí)golang學(xué)者可能看過(guò)這兩個(gè)接收者實(shí)際表現(xiàn), 但是一直很混淆,很難記憶。
  • [定義]:golang的方法(Method)是一個(gè)帶有receiver的函數(shù)Function,Receiver是一個(gè)特定的struct類(lèi)型,當(dāng)你將函數(shù)Function附加到該receiver, 這個(gè)方法Method就能獲取該receiver的屬性和其他方法。
  • [面向?qū)ο骫:golang方法Method允許你在類(lèi)型上定義函數(shù),是一個(gè)面向?qū)ο蟮男袨榇a, 這也有一些益處:同一個(gè)package可以有相同的方法名, 但是函數(shù)Function卻不行。
func(receiver receiver_type)some_func_name(arguments)return_values

從應(yīng)用上講,方法接受者分為值接收者/指針接收者,初級(jí)golang學(xué)者可能看過(guò)這兩個(gè)接收者實(shí)際表現(xiàn), 但是一直很混淆,很難記憶。

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

值類(lèi)型方法接收者

值接受者:receiver是struct等值類(lèi)型。

下面定義了值類(lèi)型接受者 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(){ // 值類(lèi)型方法接受者:接受者是原類(lèi)型值的副本
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() // 即使定義的是值類(lèi)型接受者, 指針類(lèi)型依舊可以使用,但我們傳遞進(jìn)去的還是值類(lèi)型的副本
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的字段值。

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

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

指針類(lèi)型接受者

方法接收者也可以定義在指針上,任何嘗試對(duì)指針接收者的修改,會(huì)體現(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)部的是原類(lèi)型值(指針), 函數(shù)內(nèi)的操作會(huì)體現(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() // 雖然定義的是指針接受者,但是值類(lèi)型依舊可以使用,但是會(huì)隱式傳入指針值
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{}也成功修改字段值。

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

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

什么時(shí)候使用指針接收者

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

golang方法的另外幾種姿勢(shì)

接上例子:

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

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

依舊是 值類(lèi)型/指針類(lèi)型方法接收者的效果:

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

這種姿勢(shì)相對(duì)于面向?qū)ο蟮慕邮照卟怀R?jiàn)。

2. 形成golang 方法鏈條

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

3. Non_struct類(lèi)型golang方法

type myFloat float64
func (m myFloat) ceil() float64 {
return math.Ceil(float64(m))
}
責(zé)任編輯:武曉燕 來(lái)源: 有態(tài)度的馬甲
相關(guān)推薦

2022-11-26 00:00:06

裝飾者模式Component

2023-05-15 08:38:58

模板方法模式

2023-07-25 15:06:39

2018-06-07 13:17:12

契約測(cè)試單元測(cè)試API測(cè)試

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2021-05-12 18:02:23

方法創(chuàng)建線程

2023-03-10 07:47:41

克隆jQuery

2020-08-12 08:34:16

開(kāi)發(fā)安全We

2021-01-01 09:01:05

前端組件化設(shè)計(jì)

2020-06-28 09:30:37

Linux內(nèi)存操作系統(tǒng)

2022-10-08 11:33:56

邊緣計(jì)算云計(jì)算

2018-01-10 14:13:04

測(cè)試矩陣API測(cè)試

2019-12-17 10:06:18

CDMA高通4G

2022-03-08 16:10:38

Redis事務(wù)機(jī)制

2022-03-29 09:56:21

游戲版本運(yùn)營(yíng)

2020-09-08 06:54:29

Java Gradle語(yǔ)言

2019-02-13 14:15:59

Linux版本Fedora

2021-08-04 09:32:05

Typescript 技巧Partial
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品大全 | 日韩免费在线观看视频 | 精品久久国产 | 国产一区二区三区四区hd | 成人久久 | 国产91亚洲精品一区二区三区 | 国产精品69av | 欧美一区二区三区高清视频 | 一区二区成人 | 天天操天天摸天天爽 | 日本一区二区三区在线观看 | 日韩av成人| 国产欧美精品区一区二区三区 | 黄色一级免费看 | 草草草影院 | 中文字幕在线精品 | 亚洲高清在线 | 日本久久网 | 一级毛片在线播放 | 亚洲精品乱码久久久久久蜜桃 | av大片在线观看 | 四虎伊人 | 成人免费观看男女羞羞视频 | www久久久| 亚洲最大的黄色网址 | 日韩一区二区三区精品 | 一级大片 | 欧美日韩在线一区二区 | 成人激情视频免费观看 | 女人夜夜春 | 久久久久久亚洲精品 | 中文字幕在线不卡播放 | 亚洲精品视频一区二区三区 | 成人精品国产一区二区4080 | 日韩在线中文字幕 | www.天天操.com | 一区二区三区在线免费观看 | 久久久久久艹 | 精品国产青草久久久久96 | 国产乱码高清区二区三区在线 | 精品国产99|