首頁 > 後端開發 > Golang > 為什麼當我們回傳一個結構體而不是指向結構體的指標時我們不能賦值?

為什麼當我們回傳一個結構體而不是指向結構體的指標時我們不能賦值?

WBOY
發布: 2024-02-09 17:30:10
轉載
998 人瀏覽過

為什麼當我們回傳一個結構體而不是指向結構體的指標時我們不能賦值?

在C語言中,當我們傳回一個結構體而不是指向結構體的指標時,我們無法直接進行賦值的原因是,返回結構體時會複製整個結構體的內容,而不是傳回指向結構體的指標。由於結構體可能包含大量的數據,複製整個結構體的代價可能很高。因此,為了提高效率,C語言規定了當返回結構體時,我們只能透過將其賦值給一個結構體類型的變數來使用它。這樣可以避免不必要的複製操作,提高程式碼的執行效率。

問題內容

假設我們有以下結構

type profile struct {
    id   int
    name string
}

func test(p profile) profile {
    return p
}

func main() {
    var profile profile
    test(profile).id = 20 // cannot assign to test(profile).id (value of type int)
}
登入後複製

但如果我們將測試函數傳回類型的 profile 改為 *profile,就可以工作。

func test(p Profile) *Profile {
    return &p
}

func main() {
    var profile Profile
    test(profile).id = 20 // Works
}
登入後複製

為什麼會這樣?

解決方法

以這種方式指派給 Profile 的欄位沒有明顯的效果。您正在指派一個臨時結構體值(的欄位),然後立即將其丟棄。注意test的回傳值是main中profile的副本;它被複製到測試的參數中,然後在從測試返回時再次複製。

當傳回指標時,至少在原則上,指向的結構在賦值後仍然可以存取(儘管在這種特定情況下不是這樣,因為指標指向要測試的參數的副本)。

以上是為什麼當我們回傳一個結構體而不是指向結構體的指標時我們不能賦值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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