欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go動(dòng)態(tài)調(diào)用函數(shù)的實(shí)例教程

 更新時(shí)間:2023年01月03日 10:11:49   作者:六號(hào)積極分子  
本文主要介紹了Go動(dòng)態(tài)調(diào)用函數(shù)的實(shí)例教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

經(jīng)常在開發(fā)的時(shí)候會(huì)遇到這樣的場景,幾個(gè)模塊的都有相同的方法,但會(huì)因?yàn)椴煌念愋偷男枰{(diào)用不同模塊的方法。使用一個(gè) switch 可以很方便的解決問題。但是當(dāng)你遇到的場景是幾個(gè)模塊的方法都是需要的執(zhí)行,同時(shí)它需要在不同的配置下執(zhí)行相對應(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()  
})

以上使用簡單的偽代碼說明了下,在執(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ù)

遇到以上的場景時(shí),可以想到的是使用動(dòng)態(tài)調(diào)用函數(shù)的方式。但是在 Go 中可能還不像之前使用 JavaScript開發(fā)時(shí)動(dòng)態(tài)調(diào)用函數(shù)那么簡單。在 JavaScript 中可以使用 eval 來實(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ù),需要通過反射的方式來實(shí)現(xiàn)。而且其應(yīng)該是對某個(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)該就是對某類型的反射,然后通過字符串的函數(shù)名獲取到對應(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ù)只需增加方法名對應(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è)是針對動(dòng)態(tài)調(diào)用方法,因?yàn)槠浣壎ǖ綄?yīng)的結(jié)構(gòu)體了,所以能夠通過映射方式獲取到對應(yīng)結(jié)構(gòu)體的屬性和方法。

到此這篇關(guān)于Go動(dòng)態(tài)調(diào)用函數(shù)的實(shí)例教程的文章就介紹到這了,更多相關(guān)Go動(dòng)態(tài)調(diào)用函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言實(shí)現(xiàn)ssh&scp的方法詳解

    Go語言實(shí)現(xiàn)ssh&scp的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語言實(shí)現(xiàn)ssh&scp,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下
    2022-10-10
  • go 讀取BMP文件頭二進(jìn)制讀取方式

    go 讀取BMP文件頭二進(jìn)制讀取方式

    這篇文章主要介紹了go 讀取BMP文件頭二進(jìn)制讀取方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go與C語言的互操作實(shí)現(xiàn)

    Go與C語言的互操作實(shí)現(xiàn)

    在Go與C語言互操作方面,Go更是提供了強(qiáng)大的支持。尤其是在Go中使用C,你甚至可以直接在Go源文件中編寫C代碼,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2021-12-12
  • golang中sync.Mutex的實(shí)現(xiàn)方法

    golang中sync.Mutex的實(shí)現(xiàn)方法

    本文主要介紹了golang中sync.Mutex的實(shí)現(xiàn)方法,mutex?主要有兩個(gè)?method:?Lock()?和?Unlock(),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Go語言基礎(chǔ)單元測試與性能測試示例詳解

    Go語言基礎(chǔ)單元測試與性能測試示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)單元測試與性能測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步
    2021-11-11
  • Golang中的crypto/ecdh包使用詳解

    Golang中的crypto/ecdh包使用詳解

    這篇文章主要給大家詳細(xì)介紹了Golang 中的 crypto/ecdh 包,主要包括什么是ECDH 算法和crypto/ecdh 包的使用方法,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 淺析Go中關(guān)于零值和空值判斷的問題

    淺析Go中關(guān)于零值和空值判斷的問題

    這篇文章主要是對零值和空值判斷現(xiàn)狀進(jìn)行簡單的梳理和分享,文中的示例代碼講解詳細(xì),對我們深入了解go語言有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • golang使用通道時(shí)需要注意的一些問題

    golang使用通道時(shí)需要注意的一些問題

    本文主要介紹了golang使用通道時(shí)需要注意的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Golang中切片的用法與本質(zhì)詳解

    Golang中切片的用法與本質(zhì)詳解

    Go的切片類型為處理同類型數(shù)據(jù)序列提供一個(gè)方便而高效的方式,下面這篇文章就來給大家介紹了關(guān)于Golang中切片的用法與本質(zhì)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了

    Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了

    這篇文章主要介紹了Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論