網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一文帶你輕松學(xué)會(huì)Go語(yǔ)言動(dòng)態(tài)調(diào)用函數(shù)_Golang
作者:六號(hào)積極分子 ? 更新時(shí)間: 2022-12-24 編程語(yǔ)言前言
經(jīng)常在開發(fā)的時(shí)候會(huì)遇到這樣的場(chǎng)景,幾個(gè)模塊的都有相同的方法,但會(huì)因?yàn)椴煌念愋偷男枰{(diào)用不同模塊的方法。使用一個(gè) switch 可以很方便的解決問題。但是當(dāng)你遇到的場(chǎng)景是幾個(gè)模塊的方法都是需要的執(zhí)行,同時(shí)它需要在不同的配置下執(zhí)行相對(duì)應(yīng)的方法。
func m1(){} func m2(){} func m3(){} c := cron.New(cron.WithSeconds()) c.addFunc(config1,func(){ m1() }) c.addFunc(config2,func(){ m2() }) c.addFunc(config3,func(){ m3() })
以上使用簡(jiǎn)單的偽代碼說(shuō)明了下,在執(zhí)行定時(shí)任務(wù)時(shí)不同的定時(shí)時(shí)間執(zhí)行不同的定時(shí)任務(wù),但當(dāng)存在很多個(gè)定時(shí)任務(wù)的時(shí)候,就會(huì)寫很多的重復(fù)的代碼,只是核心的調(diào)用具體的方法不一樣。在閱讀上也會(huì)讓人覺得頭疼。
JavaScript 動(dòng)態(tài)調(diào)用函數(shù)
遇到以上的場(chǎng)景時(shí),可以想到的是使用動(dòng)態(tài)調(diào)用函數(shù)的方式。但是在 Go 中可能還不像之前使用 JavaScript開發(fā)時(shí)動(dòng)態(tài)調(diào)用函數(shù)那么簡(jiǎn)單。在 JavaScript 中可以使用 eval 來(lái)實(shí)現(xiàn)。eval 函數(shù)可以執(zhí)行參數(shù)字符串,即將字符串作為函數(shù)名然后就可以直接調(diào)用函數(shù)。
function m1(){}
function m2(){}
function m3(){}
funMap ={
config1:'m1'
config2:'m2'
config3:'m3'
}
funMap.foreach((val)=>{
evl(val+"()")
})
當(dāng)然 JavaScript 還有很多方式可以支持動(dòng)態(tài)調(diào)用函數(shù)。但是今天主要介紹的是 Go 中的動(dòng)態(tài)調(diào)用函數(shù)。
Go 中動(dòng)態(tài)調(diào)用方法
Go 中想要?jiǎng)討B(tài)調(diào)用函數(shù),需要通過反射的方式來(lái)實(shí)現(xiàn)。而且其應(yīng)該是對(duì)某個(gè)類型進(jìn)行反射,然后獲取到其相關(guān)的屬性。
type my struct{} func (m *my)m1(){} //----main--- mname="m1" funcs := reflect.ValueOf(&my{}) f := funcs.MethodByName(mname) f.call()
從以上代碼的實(shí)現(xiàn)就可以容易入手學(xué)會(huì)使用動(dòng)態(tài)調(diào)用。其原理應(yīng)該就是對(duì)某類型的反射,然后通過字符串的函數(shù)名獲取到對(duì)應(yīng)的函數(shù),最后直接使用 call 方法就可以正常調(diào)用該方法。
當(dāng)函數(shù)是一個(gè)帶有參數(shù)的方法的時(shí)候,那么我們動(dòng)態(tài)調(diào)用的時(shí)候還需要傳遞函數(shù)參數(shù)。只需要將參數(shù)放入call函數(shù)中就可以正常傳遞參數(shù)。
params := make([]reflect.value,len(args)) for i, _ := range args { params[i] = reflect.ValueOf(args[i]) } mname="m1" funcs := reflect.ValueOf(&my{}) f := funcs.MethodByName(mname) f.call(params)
以上就是實(shí)現(xiàn)帶參數(shù)的動(dòng)態(tài)調(diào)用函數(shù)。輕松學(xué)會(huì)動(dòng)態(tài)調(diào)用。不僅可以優(yōu)化代碼,后續(xù)就不用太繁瑣的寫一大堆重復(fù)的代碼,這樣后續(xù)只需增加方法名對(duì)應(yīng)的集合。然后循環(huán)執(zhí)行就可以了。
mapMd :=map[string]string{ "key1":"m1" "key2":"m2" } funcs := reflect.ValueOf(&my{}) for key, val := range mapMd { f := funcs.MethodByName(key) f.Call() }
需要注意的是,這個(gè)是針對(duì)動(dòng)態(tài)調(diào)用方法,因?yàn)槠浣壎ǖ綄?duì)應(yīng)的結(jié)構(gòu)體了,所以能夠通過映射方式獲取到對(duì)應(yīng)結(jié)構(gòu)體的屬性和方法。
原文鏈接:https://juejin.cn/post/7169599307266392072
相關(guān)推薦
- 2022-06-14 利用Python?NumPy庫(kù)及Matplotlib庫(kù)繪制數(shù)學(xué)函數(shù)圖像_python
- 2022-07-18 properties配置文件解耦合連接數(shù)據(jù)庫(kù)的原理
- 2022-05-13 ffmpeg+pyqt5簡(jiǎn)單實(shí)現(xiàn)一個(gè)抽幀可視化小工具
- 2022-02-02 去掉chorme瀏覽器自動(dòng)補(bǔ)全時(shí)input框的背景樣式
- 2022-05-07 Python?遞歸式實(shí)現(xiàn)二叉樹前序,中序,后序遍歷_python
- 2022-10-24 Python?NumPy教程之索引詳解_python
- 2022-08-28 c++在windows、linux下獲取指定文件夾下所有文件名的方法
- 2023-02-01 Python中列表遍歷使用range和enumerate的區(qū)別講解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支