91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在golang中使用指針

發布時間:2020-06-16 14:21:40 來源:億速云 閱讀:162 作者:鴿子 欄目:編程語言

有時候看別人的go代碼,發現他們有的在代碼里面用了指針,有的不使用。

假設有個結構體類型叫做Person,發現有些方法會用func methodA (*person Person)作為參數,或者使用 func *(person Person) methodA()作為結構體自己的方法,也就是person這個結構體可以直接調用methodA,但是用的是指針。

或者在map結構里面看到var personMap map[string]*Person 的用法

如果是從java轉過來golang的話,可能不太好理解。因為java的世界是沒有指針的,直接傳遞過去就可以用了,但是到golang上需要注意很多地方。

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

不使用指針的話,某些情況是沒法賦值給結構體的,接下來看一段代碼,這段代碼不使用任何指針,先定義一堆用于測試的對象

type Person struct {  //person結構體,包含年齡,名稱,車
    age  int
    name string
    car  Car
}

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

var personMap map[string]Person   //一個存放person的map

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

func (person Person) setName(name string) {  //設置名字
    person.name = name
}
func printName(person Person){  //打印person的名字
    fmt.Println(person.name)
}
func (person Person)printName(){  //結構體person自己支持打印名字
    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 小明 {寶馬}},正常賦值給person變量,因為這是在方法里面的變量
    setName(person, "小紅")
    fmt.Println(person) //{12 小明 {寶馬}},小紅賦值失敗,傳遞給setName方法的person沒有賦值成功
    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 小明 {寶馬}},打印的還是小明,而不是小紅,說明上面personMap["test"]對象賦值失敗
    }
}

接下來改造成使用指針

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 小蘭 {寶馬}},讀取的也是正確的小蘭
    }
}

所以得出結論,當我們需要修改結構體的變量內容的時候,方法傳入的結構體變量參數需要使用指針,也就是結構體的地址需要修改map中的架構體的變量的時候,也需要使用結構體地址作為map的value

如果僅僅是讀取結構體變量,可以不使用指針,直接傳遞引用即可

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

以上就是golang不用指針可以嗎的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和平区| 阿鲁科尔沁旗| 吴江市| 镇坪县| 大化| 县级市| 阿城市| 奎屯市| 威宁| 东明县| 灵丘县| 丰顺县| 繁峙县| 天门市| 洪洞县| 响水县| 桂东县| 石渠县| 民和| 修文县| 富阳市| 渑池县| 峨眉山市| 拉孜县| 临洮县| 云林县| 新晃| 礼泉县| 永顺县| 儋州市| 新乡县| 增城市| 凤城市| 玉溪市| 长汀县| 调兵山市| 巨鹿县| 十堰市| 东乡族自治县| 扎鲁特旗| 绿春县|