golang return defer的返回值問題

2021-10-09 07:15:59 字數 1578 閱讀 3442

package main

import

"fmt"

//驗證golang return defer 的返回值

func

main()

func

test1()

int(

)defer

func()

()fmt.

println

("test1"

, i,

&i)return i

}func

test2()

(i int)(

)defer

func()

()fmt.

println

("test2"

, i,

&i)return

}

結果:

let's go !!!

test1 0 0xc000088008

i is : 1 0xc000088008

i is : 2 0xc000088008

main1 0 0xc000088000

*************************====

test2 0 0xc000018060

i is : 1 0xc000018060

i is : 2 0xc000018060

main2 2 0xc000018058

通過結果可以得出結論:

1.在test中的i指標和返回給main函式的i指標是不一樣的,其實return是把i進行了一次賦值拷貝返回給main函式。

2.test1函式的返回值沒有被提前宣告,return返回值來自於函式內部定義變數(var i int)的賦值,而defer中修改的也是內部定義變數,defer無法直接訪問到返回值,因此函式退出時返回值並沒有被修改。

3.test2函式的返回值(i int)被提前宣告,所以defer可以訪問該返回值,因此在return賦值返回值 i 之後,defer呼叫返回值 i 並進行了修改,返回給main函式的值也就變的跟i一樣。

package main

import

("fmt"

"time"

)//驗證golang return defer 的返回值

func

main()

func

test

(t int64

)

結果:

let's go !!!

main timestamp is : 1597734408

arg timestamp is : 1597734403

test timestamp is : 1597734408

可以看到test函式中arg的時間戳的值比休眠之後的時間戳還小,說明defer test函式方法的引數time.now().unix()是先被呼叫了而不是等到執行defer的時候才呼叫。

RestTemplate返回值中文亂碼問題

目錄問題 排查問題 修改問題 測試 在使用resttemplate 方法 postforentity string url,object request,classresponsetype,object.urivariables 返回的中文亂碼,如下 檢視resttemplate的建構函式,發現st...

JDBC API中的execute返回值問題

jdbc是連線資料庫的基礎,有段時間不用jdbc了,也沒有細緻研究過,今天遇到乙個問題,jdbc中execute的返回值是什麼,這個問題比較複雜.在此之前先普及一下其他兩個方法的知識 1 int executeupdate string sql 可以執行insert,update或delete,返回...

promise 鏈式程式設計then返回值的問題

最近複習promise 物件的時候,發現promise鏈式程式設計時then返回值不太懂的問題,查閱資料後,總結如下 then 的返回值 1.函式return 任意數值 或者 不返回資料 返回ndefined 時,then 方法返回的是乙個狀態為fulfilled狀態的promise物件 2.函式r...