日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Go動態調用函數的實例教程_Golang

作者:六號積極分子 ? 更新時間: 2023-02-07 編程語言

前言

經常在開發的時候會遇到這樣的場景,幾個模塊的都有相同的方法,但會因為不同的類型的需要調用不同模塊的方法。使用一個 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

欄目分類
最近更新