golang函式的值傳遞和引用傳遞

2021-10-22 09:49:21 字數 2213 閱讀 6493

python對於字串和數字作為引數傳遞時,在函式中的值就是直接複製了乙個。就像下面這個例子,a和b的位址是同乙個但是改變a的值,b的值不會發生改變。

a =

1b =

1print

("a"

,a,id

(a),

"b",b,

id(b))a=

2print

("a"

,a,id

(a),

"b",b,

id(b)

)#####輸出結果######

a 194378359581376 b 1

94378359581376

a 294378359581408 b 1

94378359581376

在函式內修改時程式會生成乙個新的記憶體位址儲存新的值,所有操作都是在函式內部操作僅僅是區域性變數,由於是值傳遞,所以該函式的對該值所有操作都僅限於該函式內,並沒有對引數t1進行修改。詳情看下面的例項**。

def

test

(a):

print

('a'

, a,

"記憶體位址",id

(a))

a +=

"qq"

print

('a'

, a,

"記憶體位址",id

(a))

a +=

"ww"

print

('a'

, a,

"記憶體位址",id

(a))

if __name__ ==

'__main__'

: t1 =

"aaaa"

print

("記憶體位址",id

(t1)

) test(t1)

print

('t1'

, t1,

"記憶體位址",id

(t1)

)

#######執行結果#######

記憶體位址 140572064233208

a aaaa 記憶體位址 140572064233208

a aaaaqq 記憶體位址 140572064249032

a aaaaqqww 記憶體位址 140572063338224

t1 aaaa 記憶體位址 140572064233208

process finished with exit code 0

但是當引數為乙個列表時,就又會不同。

def

test1

(b):

print

("b"

, b,

"記憶體位址",id

(b))6)

print

("b"

, b,

"記憶體位址",id

(b))

if __name__ ==

'__main__'

: t2 =[1

,2,3

,4,5

]print

("t2"

, t2,

"記憶體位址",id

(t2)

) test1(t2)

print

("t2"

, t2,

"記憶體位址",id

(t2)

)

#######執行結果##########

t2 [1,

2,3,

4,5] 記憶體位址 139999401054088

b [1,2

,3,4

,5] 記憶體位址 139999401054088

b [1,2

,3,4

,5,6

] 記憶體位址 139999401054088

t2 [1,

2,3,

4,5,

6] 記憶體位址 139999401054088

process finished with exit code 0

由上面的**可以看出經過函式的修改t2的值發生改變,但是記憶體位址沒有發生改變,這就相當與c語言中的指標一樣,只是把引用傳遞過去,函式通過引用可以直接操作該值.

簡單來說,可以通過函式來直接改變引數的傳值為引用傳值,反之就是值傳遞

golang的值傳遞和引用傳遞

s 3 int func v 3 int s fmt.println s 引數固定長度陣列是值傳遞 輸出1 2 4 func v int s fmt.println s 引數非固定長度是切片是引用傳遞 輸出0 2 4 m map int int func v map int int m fmt.pr...

值的傳遞和引用傳遞

1 值型別和引用型別分別是什麼意思 區別是什麼 值型別 一些基礎型別,比如 基本資料型別 引用型別 string 物件 陣列等 區別 值型別操作的記憶體是分開的,引用型別實際操作時同一塊記憶體 2 什麼時裝箱 拆箱 大轉小 拆箱 小轉大 裝箱 裝箱是自動的 比如 int i 1 object o i...

值傳遞和引用傳遞

幾乎每種語言都有值傳遞和引用傳遞.下面是我的一些曲解,只講現象,不涉及到任何的原理,主要是鬧著玩的.a 新交了個女朋友b.有一天他女朋友b看見a在吃冰激凌,b想吃,但是a是個 座有點小潔癖,不想讓b吃,於是給b買了個新的冰激凌說你吃這個吧,別碰我嘴裡這個.這就是值傳遞.a和b的值沒有任何關係,他們一...