」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼`defer'影響命名返回值的影響與GO中的輸入參數不同?

為什麼`defer'影響命名返回值的影響與GO中的輸入參數不同?

發佈於2025-03-04
瀏覽:575

Why Does `defer` Affect Named Return Values Differently Than Input Parameters in Go?
理解defer對GO

在GO中的變量聲明的效果,即使發生恐慌,使用defer關鍵字允許在返回時執行代碼的函數,即使發生parics。但是,當涉及在函數中以不同方式聲明的變量時,結果可能會變化,導致混亂。

消失的增量

的奧秘。 defer func(){i}()() 返回i } func main(){ fmt.println(c(0))//打印0 }

在此示例中,我們將其稱為c函數並將其傳遞為值0。但是,當我們打印結果時,我們得到0而不是預期1。這是因為我被聲明為函數的輸入參數。一旦執行返回語句,調用了延期函數,但是增量對返回值沒有影響。

命名結果的魔法

與上一個示例相反,讓我們考慮以下代碼:

func c1(int) defer func(){i}()() 返回i } func main(){ fmt.println(c1())//打印1 }

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

func main() {
    fmt.Println(c(0)) // Prints 0
}
在此示例中,返回語句在調用延期函數之前將i明確設置為2。結果,延遲函數會增加i的值,返回值變為3。

命名結果參數的冪

這些示例的關鍵要點是輸入參數和命名結果參數之間的區別。輸入參數傳遞到函數中,而命名結果參數是保存函數返回值的變量。執行返回語句後,遞送函數可以修改命名的結果參數,但它們不能影響輸入參數。
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3