首先,來看看這段 php **:
view source
print?
1
function
foobar()
4
$funcs
=
array
(
5
"foobar"
=>
"foobar"
,
6
"hello"
=>
"foobar"
,
7
);
8
$funcs
[
"foobar"
]();
9
$funcs
[
"hello"
]();
它會輸出:
view source
print?
1
mikespook@mikespook-laptop:~/desktop$ phpfoobar.php
2
hellogolang
3
hellogolang
用這個方法呼叫匹配名字的函式,非常有效。
那麼,在 golang 中是否可能用函式的名字來呼叫某個函式呢?
作為乙個靜態、編譯型語言,答案是否定的……又是肯定的!
在 golang 中,你不能這樣做:
view source
print?
01
func foobar()
04
funcname :=
"foobar"
05
funcname()
06
不過可以:
07
08
func foobar()
11
funcs :=map[string]func()
12
funcs[
"foobar"
]()
但這裡有乙個限制:這個 map 僅僅可以用原型是「func()」的沒有輸入引數或返回值的函式。
如果想要用這個方法實現呼叫不同函式原型的函式,需要用到 inte***ce{}。
這樣,就可以新增有著不同函式原型的函式到乙個 map 中:
view source
print?
1
func foo()
4
func bar(a, b, c
int
)
7
funcs :=map[string]inte***ce{}
那麼如何呼叫 map 中的函式呢?像這樣嗎:
funcs["foo"]()
絕對不行!這無法工作!你不能直接呼叫儲存在空介面中的函式。
反射走進我們的生活!在 golang 中有著叫做「reflect」的包。
view source
print?
01
func call(mmap[string]inte***ce{}, name string, params ... inte***ce{})(result reflect.value, err error)
07
in:= make(reflect.value, len(params))
08
for
k, param := range params
11
result= f[name].call(in)
12
return
13
}
14
call(funcs,
"foo"
)
15
call(funcs,
"bar"
, 1,2, 3)
將函式的值從空介面中反射出來,然後使用 reflect.call 來傳遞引數並呼叫它。
沒有什麼是很難理解的。
[1]
golang反射中函式和方法的呼叫
眾所周知,golang中的函式是可以像普通的int float等型別變數那樣作為值的,例如 package main import fmt func hello func main prints hello world 既然函式可以像普通的型別變數一樣可以的話,那麼在反射機制中就和不同的變數一樣的,...
Golang學習筆記 反射
反射讓我們可以在執行時獲取物件的型別資訊,比如檢視乙個結構體有多少字段,檢視函式的入參型別和返回值型別等。go提供了reflect.typeof 和reflect.valueof獲取任意物件的reflect.value和reflect.type,其中reflect.type是乙個介面型別,該介面提供...
golang的反射機制
首先,golang反射,分為 t reflect.typeof n num t.numfield t reflect.typeof n num t.field n int 從0開始,以宣告的順序排序type students struct func stu students t func stu s...