首頁  >  文章  >  後端開發  >  Go 的「defer」語句如何影響宣告為輸入參數與命名結果參數的變數?

Go 的「defer」語句如何影響宣告為輸入參數與命名結果參數的變數?

Susan Sarandon
Susan Sarandon原創
2024-11-25 20:11:12195瀏覽

How Do Go's `defer` Statements Affect Variables Declared as Input Parameters vs. Named Result Parameters?

Golang 中以不同方式宣告的變數的Defer 行為

與使用輸入參數的函數相比,使用defer 語句時,具有命名結果參數的函數的行為不同。在這個範例中,我們檢查這些差異:

package main

import (
    "fmt"
)

func c(i int) int {
    defer func() { i++ }()
    return i
}

func c1() (i int) {
    defer func() { i++ }()
    return i
}

func c2() (i int) {
    defer func() { i++ }()
    return 2
}

func main() {
    fmt.Println(c(0)) // Prints 0
    fmt.Println(c1()) // Prints 1
    fmt.Println(c2()) // Prints 3
}

c(i int):

在本例中,i 是傳入參數。返回值在延遲函數運行之前計算,因此在返回後遞增 i 沒有任何效果。

c1():

這裡,i 是結果參數。 return i 語句將 i 的值賦給回傳值。但是,延遲函數可以修改返回變數。在這種情況下,延遲函數遞增 i,導致返回值為 1。

c2():

與 c1() 類似,return 2 語句將 2 賦給 i。然而,在這種情況下,延遲函數在 return 語句之後執行,導致傳回值為 3。

總之,在 Go 中使用命名結果參數時,重要的是要記住延遲函數可以修改即使在 return 語句之後,它們的值也是如此。 Go 規範中明確提到了此行為,並可在必要時用於更改返回值。

以上是Go 的「defer」語句如何影響宣告為輸入參數與命名結果參數的變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn