如何在golang中使用指針-創(chuàng)新互聯(lián)

有時(shí)候看別人的go代碼,發(fā)現(xiàn)他們有的在代碼里面用了指針,有的不使用。

創(chuàng)新互聯(lián)公司為客戶提供專業(yè)的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開(kāi)發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站程序開(kāi)發(fā)、WEB系統(tǒng)開(kāi)發(fā)、微信二次開(kāi)發(fā)、手機(jī)網(wǎng)站制作設(shè)計(jì)等網(wǎng)站方面業(yè)務(wù)。

假設(shè)有個(gè)結(jié)構(gòu)體類型叫做Person,發(fā)現(xiàn)有些方法會(huì)用func methodA (*person Person)作為參數(shù),或者使用 func *(person Person) methodA()作為結(jié)構(gòu)體自己的方法,也就是person這個(gè)結(jié)構(gòu)體可以直接調(diào)用methodA,但是用的是指針。

或者在map結(jié)構(gòu)里面看到var personMap map[string]*Person 的用法

如果是從java轉(zhuǎn)過(guò)來(lái)golang的話,可能不太好理解。因?yàn)閖ava的世界是沒(méi)有指針的,直接傳遞過(guò)去就可以用了,但是到golang上需要注意很多地方。

那么什么時(shí)候該用呢?為什么有些地方需要用呢?

不使用指針的話,某些情況是沒(méi)法賦值給結(jié)構(gòu)體的,接下來(lái)看一段代碼,這段代碼不使用任何指針,先定義一堆用于測(cè)試的對(duì)象

type Person struct {  //person結(jié)構(gòu)體,包含年齡,名稱,車
    age  int
    name string
    car  Car
}

type Car struct {  //person名下的車
    name string  //車的名字
}

var personMap map[string]Person   //一個(gè)存放person的map

func setName(person Person, name string) { //給參數(shù)person設(shè)置名字
    person.name = name
}

func (person Person) setName(name string) {  //設(shè)置名字
    person.name = name
}
func printName(person Person){  //打印person的名字
    fmt.Println(person.name)
}
func (person Person)printName(){  //結(jié)構(gòu)體person自己支持打印名字
    fmt.Println(person.name)
}

然后編寫(xiě)main方法,我會(huì)在代碼里面注釋打印的結(jié)果,可以發(fā)現(xiàn)很多情況下賦值失敗了。

func main() {
    person := Person{}
    fmt.Println(person)  //{0  {}}
    person.age = 12
    person.name = "小明"
    person.car = Car{"寶馬"}
    fmt.Println(person)  //{12 小明 {寶馬}},正常賦值給person變量,因?yàn)檫@是在方法里面的變量
    setName(person, "小紅")
    fmt.Println(person) //{12 小明 {寶馬}},小紅賦值失敗,傳遞給setName方法的person沒(méi)有賦值成功
    person.setName("小紅")
    fmt.Println(person) //{12 小明 {寶馬}},person自己setName,還是失敗
    personMap = make(map[string]Person)
    personMap["test"] = person
    person = personMap["test"]
    person.name = "小紅"
    fmt.Println(person) //{12 小紅 {寶馬}},從map中取出person,給小紅賦值成功
    for _, value := range personMap { //遍歷map
        fmt.Println(value)//{12 小明 {寶馬}},打印的還是小明,而不是小紅,說(shuō)明上面personMap["test"]對(duì)象賦值失敗
    }
}

接下來(lái)改造成使用指針

type Person struct {
    age  int
    name string
    car  Car
}
type Car struct {
    name string
}
var personMap map[string]*Person
func setName(person *Person, name string) {
    person.name = name
}
func (person *Person) setName(name string) {
    person.name = name
}
func printName(person Person){
    fmt.Println(person.name)
}
func (person Person)printName(){
    fmt.Println(person.name)
}

修改main方法,使用&取址符

func main() {
    person := Person{}
    fmt.Println(person) //{0  {}}
    person.age = 12
    person.name = "小明"
    person.car = Car{"寶馬"}
    fmt.Println(person) //打印{12 小明 {寶馬}}
    setName(&person, "小紅")
    fmt.Println(person) //{12 小紅 {寶馬}}, 成功賦值!
    person.setName("小黑") 
    fmt.Println(person) //{12 小黑 {寶馬}}, 成功賦值!
    personMap = make(map[string]*Person)
    personMap["test"] = &person
    person = *personMap["test"]
    person.name = "小蘭"
    fmt.Println(person) //{12 小蘭 {寶馬}},成功賦值!
    for _, value := range personMap {
        fmt.Println(value) //&{12 小蘭 {寶馬}},讀取的也是正確的小蘭
    }
}

所以得出結(jié)論,當(dāng)我們需要修改結(jié)構(gòu)體的變量?jī)?nèi)容的時(shí)候,方法傳入的結(jié)構(gòu)體變量參數(shù)需要使用指針,也就是結(jié)構(gòu)體的地址需要修改map中的架構(gòu)體的變量的時(shí)候,也需要使用結(jié)構(gòu)體地址作為map的value

如果僅僅是讀取結(jié)構(gòu)體變量,可以不使用指針,直接傳遞引用即可

*type 這里的type這個(gè)變量存放的東西是地址,這點(diǎn)需要明確,需要使用&type獲取到地址。

以上就是golang不用指針可以嗎的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司其它相關(guān)文章!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前文章:如何在golang中使用指針-創(chuàng)新互聯(lián)
當(dāng)前地址:http://www.muchs.cn/article24/djjjce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)網(wǎng)站排名自適應(yīng)網(wǎng)站、全網(wǎng)營(yíng)銷推廣、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化