GO go中的反射與傳值

2022-09-19 06:00:12 字數 1037 閱讀 6632

go中的反射reflect提供了兩種型別,其中type可以用來獲取資料的型別,而value可以用來接收資料的值。

go中的所有函式呼叫都是值傳遞,所以當我們使用如下方法獲取x的值時,(reflect.valueof()會將傳入的引數轉換為reflect.valuel型別,再賦值給目標引數)

var x float64 = 3.4

v := reflect.valueof(x)

fmt.println(v.canset()) // false

會發現我們無法通過對v的操作來改變x的值,因為v只是x的乙個值的副本而已,我們可以使用canset()函式來判斷是否能通過 v 來設定這裡的 x 變數。

如果我們將x的位址傳給v呢,能否通過副本來改變本體呢?

var x float64 = 3.4

v := reflect.valueof(&x)

fmt.println(v.canset()) // false

這裡的 v 指向的是 x 的指標。所以 canset 方法判斷的是 x 的指標是否可以設定。指標是肯定不能設定的,所以這裡還是返回 false。

那麼我們應該如何通過v來設定x呢,go提供了乙個內建方法elem()

var x float64 = 3.4

v := reflect.valueof(&x)

fmt.println(v.elem().canset()) // true

但是這個 elem() 使用的時候有個前提,這裡的 value 必須是指標物件轉換的 reflect.value。(或者是介面物件轉換的 reflect.value)。這個前提不難理解吧,如果是乙個 int 型別,它怎麼可能有指向的元素呢?所以,使用 elem 的時候要十分注意這點,因為如果不滿足這個前提,elem 是直接觸發 panic 的。

var x float64 = 3.4

v := reflect.valueof(&x)

if v.elem().canset()

fmt.println(x)

php中傳值與傳引用的區別

1,傳值 param1 1 定義變數1 param2 2 定義變數2 param2 param1 變數1賦值給變數2 echo param2 顯示為1 2,傳引用 param2 1 定義變數2 param1 param2 將變數2的引用傳給變數1 echo param2 顯示為1 param1 2 ...

C 中傳值 傳址與傳引用的總結

三 傳值 傳位址 傳引用的區別 四.哪種更高效?int a 10 定義乙個整型變數a int p a 定義乙個指向整型變數的指標變數p,該指標指向a的儲存單元,即p的值是a儲存單元的位址 int b a 定義乙個整型變數a的引用,a和b是同乙個東西,在記憶體中占用同乙個儲存單元 1 傳值呼叫 2 傳...

傳值與傳引用

python的函式傳值和傳引用,和c c 語言是一樣的。在開始之前,我們有必要分清一下python的一些基礎概念。首先要說的是 變數 與 物件 在python中,型別屬於物件,變數是沒有型別的,這正是python的語言特性,也是吸引著很多pythoner的一點。所有的變數都可以理解是記憶體中乙個物件...