溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

go語言在什么情況下使用指針

發(fā)布時(shí)間:2020-06-10 18:37:18 來源:億速云 閱讀:589 作者:鴿子 欄目:編程語言

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

假設(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)過來golang的話,可能不太好理解。因?yàn)閖ava的世界是沒有指針的,直接傳遞過去就可以用了,但是到golang上需要注意很多地方。

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

不使用指針的話,某些情況是沒法賦值給結(jié)構(gòu)體的

接下來看一段代碼,這段代碼不使用任何指針,先定義一堆用于測(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)
}

所以得出結(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 什么時(shí)候使用指針的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注億速云其它相關(guān)文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI