首頁 > 後端開發 > Golang > 為什麼我不能在 Go 中使用指標接收器修改簡單類型的值?

為什麼我不能在 Go 中使用指標接收器修改簡單類型的值?

Barbara Streisand
發布: 2024-11-16 06:53:03
原創
325 人瀏覽過

Why Can't I Modify a Simple Type's Value Using a Pointer Receiver in Go?

如何在 Go 中透過指標接收器修改簡單類型的值?

在 Go 中,方法中的指標接收器可讓您修改結構體的原始值。但是,這不適用於簡單類型。這個問題深入探討了為什麼此類修改不起作用並提出了解決方案。

問題

考慮以下程式碼:

package main

import (
    "fmt"
    "strconv"
)

type FooInt int
func (fi *FooInt) FromString(i string) {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    fi = &tmp
}

func main() {
    var fi *FooInt
    fi.FromString("5")
    fmt.Printf("%v\n", fi) // Prints <nil>
}
登入後複製

在這裡,您期望函數 FromString將 fi 的值設為 5。但它印出 ,表示 nil指標。

理解行為

在 Go 中,函數/方法參數(包括接收者)是原始值的副本。因此,函數內的修改只會影響副本。

即使對於指針,接收者也是原始指針的副本,而不是實際的指針本身。因此,對接收者的值進行的修改不會影響原始指標。

解決方案

要解決此問題,有幾個選項:

  1. 傳回修改後的內容指標:

      傳回修改後的內容指標:
    func (fi *FooInt) FromString(i string) *FooInt {
        num, _ := strconv.Atoi(i)
        tmp := FooInt(num)
        return &tmp
    }
    
    func main() {
        var fi *FooInt
        fi = fi.FromString("5")
        fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5
    }
    登入後複製
    修改函數,傳回修改後的指針,並賦值給原來的指針。
    • 傳遞一個指標修改:
    func (fi *FooInt) FromString(i string, p **FooInt) {
        num, _ := strconv.Atoi(i)
        tmp := FooInt(num)
        *p = &tmp
    }
    
    func main() {
        var fi *FooInt
        fi.FromString("5", &fi)
        fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5
    }
    登入後複製
    傳遞指向函數的所需類型的非零指標,並修改其值。
    • 確保非零接收者:
    func (fi *FooInt) FromString(i string) {
        num, _ := strconv.Atoi(i)
        *fi = FooInt(num)
    }
    
    func main() {
        fi := new(FooInt) // Initialize to non-nil
        fi.FromString("5")
        fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5
    }
    登入後複製
    在呼叫方法之前將接收者初始化為非零值,因此指向的值可以

透過採用其中一種解,您可以使用指標接收器有效地修改簡單類型的值。

以上是為什麼我不能在 Go 中使用指標接收器修改簡單類型的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板