Golang反射呼叫函式

2021-06-26 22:09:20 字數 2768 閱讀 8666

首先,來看看這段 php **:

view source

print?

1functionfoobar()

4$funcs=array(

5

"foobar"=>"foobar",

6

"hello"=>"foobar",

7);

8$funcs["foobar"]();

9$funcs["hello"]();

它會輸出:

view source

print?

1mikespook@mikespook-laptop:~/desktop$ phpfoobar.php

2hellogolang

3hellogolang

用這個方法呼叫匹配名字的函式,非常有效。

那麼,在 golang 中是否可能用函式的名字來呼叫某個函式呢?

作為乙個靜態、編譯型語言,答案是否定的……又是肯定的!

在 golang 中,你不能這樣做:

view source

print?

01func foobar()

04funcname :="foobar"

05funcname()

06不過可以:

07

08func foobar()

11funcs :=map[string]func()

12funcs["foobar"]()

但這裡有乙個限制:這個 map 僅僅可以用原型是「func()」的沒有輸入引數或返回值的函式。

如果想要用這個方法實現呼叫不同函式原型的函式,需要用到 inte***ce{}。

這樣,就可以新增有著不同函式原型的函式到乙個 map 中:

view source

print?

1func foo()

4func bar(a, b, cint)

7funcs :=map[string]inte***ce{}

那麼如何呼叫 map 中的函式呢?像這樣嗎:

funcs["foo"]()

絕對不行!這無法工作!你不能直接呼叫儲存在空介面中的函式。

反射走進我們的生活!在 golang 中有著叫做「reflect」的包。

view source

print?

01func call(mmap[string]inte***ce{}, name string, params ... inte***ce{})(result reflect.value, err error)

07

in:= make(reflect.value, len(params))

08

fork, param := range params

11

result= f[name].call(in)

12

return

13}

14call(funcs,"foo")

15call(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...