網站首頁 編程語言 正文
前言
經常在開發的時候會遇到這樣的場景,幾個模塊的都有相同的方法,但會因為不同的類型的需要調用不同模塊的方法。使用一個 switch 可以很方便的解決問題。但是當你遇到的場景是幾個模塊的方法都是需要的執行,同時它需要在不同的配置下執行相對應的方法。
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() })
以上使用簡單的偽代碼說明了下,在執行定時任務時不同的定時時間執行不同的定時任務,但當存在很多個定時任務的時候,就會寫很多的重復的代碼,只是核心的調用具體的方法不一樣。在閱讀上也會讓人覺得頭疼。
JavaScript 動態調用函數
遇到以上的場景時,可以想到的是使用動態調用函數的方式。但是在 Go 中可能還不像之前使用 JavaScript開發時動態調用函數那么簡單。在 JavaScript 中可以使用 eval 來實現。eval 函數可以執行參數字符串,即將字符串作為函數名然后就可以直接調用函數。
function m1(){}
function m2(){}
function m3(){}
funMap ={
config1:'m1'
config2:'m2'
config3:'m3'
}
funMap.foreach((val)=>{
evl(val+"()")
})
當然 JavaScript 還有很多方式可以支持動態調用函數。但是今天主要介紹的是 Go 中的動態調用函數。
Go 中動態調用方法
Go 中想要動態調用函數,需要通過反射的方式來實現。而且其應該是對某個類型進行反射,然后獲取到其相關的屬性。
type my struct{} func (m *my)m1(){} //----main--- mname="m1" funcs := reflect.ValueOf(&my{}) f := funcs.MethodByName(mname) f.call()
從以上代碼的實現就可以容易入手學會使用動態調用。其原理應該就是對某類型的反射,然后通過字符串的函數名獲取到對應的函數,最后直接使用 call 方法就可以正常調用該方法。
當函數是一個帶有參數的方法的時候,那么我們動態調用的時候還需要傳遞函數參數。只需要將參數放入call函數中就可以正常傳遞參數。
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)
以上就是實現帶參數的動態調用函數。輕松學會動態調用。不僅可以優化代碼,后續就不用太繁瑣的寫一大堆重復的代碼,這樣后續只需增加方法名對應的集合。然后循環執行就可以了。
mapMd :=map[string]string{ "key1":"m1" "key2":"m2" } funcs := reflect.ValueOf(&my{}) for key, val := range mapMd { f := funcs.MethodByName(key) f.Call() }
需要注意的是,這個是針對動態調用方法,因為其綁定到對應的結構體了,所以能夠通過映射方式獲取到對應結構體的屬性和方法。
原文鏈接:https://juejin.cn/post/7169599307266392072
相關推薦
- 2023-02-17 Golang實踐指南之獲取目錄文件列表_Golang
- 2022-06-11 golang實現簡單工廠、方法工廠、抽象工廠三種設計模式_Golang
- 2022-02-22 電腦鍵盤注冊表已損壞導致無法輸入信息的修復方式
- 2022-07-22 python:實現從給定的子串列表返回包含所有可能的列表算法(附完整源碼)
- 2022-12-25 python字典中items()函數用法實例_python
- 2022-05-18 ASP.NET?Core?6框架揭秘實例演示之如何承載你的后臺服務_實用技巧
- 2022-11-03 python回歸分析邏輯斯蒂模型之多分類任務詳解_python
- 2022-12-04 Jetpack?Compose慣性衰減動畫AnimateDecay詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支