go MethodByName()不能獲取私有方法的解決
在使用reflect包獲取函數(shù),并調(diào)用時(shí),總出現(xiàn)這個(gè)報(bào)錯(cuò):
panic: reflect: call of reflect.Value.Call on zero Value
然后測(cè)試發(fā)現(xiàn),只有公有函數(shù)(首字母大寫的函數(shù))可以通過reflect.MethodByName()函數(shù)獲取,私有方法是不行的。
測(cè)試如下:
定義一個(gè)接口obj
objA實(shí)現(xiàn)接口。
為objA分配三個(gè)方法,兩個(gè)公有方法一個(gè)私有方法。
使用MethodByName()獲取函數(shù)并調(diào)用。
type obj interface { Do() } type objA struct { a []int b []int c int } var N int = 1000 func NewObjA() (o *objA) { o = &objA{} rand.Seed(time.Now().UnixNano()) o.a = make([]int, N) o.b = make([]int, N) for i := 0; i < N; i++ { o.a[i] = rand.Intn(256) o.b[i] = rand.Intn(256) } return } func (o *objA) Do() { o.c = 0 for i := range o.a { o.c += o.a[i] * o.b[i] % 256 } } func (o *objA) do() { o.c = 0 for i := range o.a { o.c += o.a[i] * o.b[i] % 256 } } func (o *objA) Do2() int{ o.c = 0 for i := range o.a { o.c += o.a[i] * o.b[i] % 256 } return o.c } func main() { a := obj(NewObjA()) v:=reflect.ValueOf(a) if f1 := v.MethodByName("Do"); f1.IsValid() { f1.Call([]reflect.Value{}) fmt.Println("成功執(zhí)行 Do") } if f2 := v.MethodByName("do"); f2.IsValid() { f2.Call([]reflect.Value{}) fmt.Println("成功執(zhí)行 do") } if f2 := v.MethodByName("Do2"); f2.IsValid() { f2.Call([]reflect.Value{}) fmt.Println("成功執(zhí)行 Do2,結(jié)果 ") } fmt.Println("方法數(shù)量為:",v.NumMethod()) for i:=0;i< v.NumMethod();i++{ f:=v.Method(i) fmt.Println("方法",i,":",f.Type()) } }
運(yùn)行結(jié)果:
發(fā)現(xiàn)只有兩個(gè)公有方法能夠執(zhí)行
私有方法是沒有辦法獲取到的
到此這篇關(guān)于go MethodByName()不能獲取私有方法的解決的文章就介紹到這了,更多相關(guān)go MethodByName()不能獲取私有方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go習(xí)慣用法(多值賦值短變量聲明賦值簡(jiǎn)寫模式)基礎(chǔ)實(shí)例
本文為大家介紹了Go習(xí)慣用法(多值賦值,短變量聲明和賦值,簡(jiǎn)寫模式、多值返回函數(shù)、comma,ok 表達(dá)式、傳值規(guī)則)的基礎(chǔ)實(shí)例,幫大家鞏固扎實(shí)Go語言基礎(chǔ)2024-01-01使用go net實(shí)現(xiàn)簡(jiǎn)單的redis通信協(xié)議
本文主要介紹了go net實(shí)現(xiàn)簡(jiǎn)單的redis通信協(xié)議,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法
今天小編就為大家分享一篇Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08go中Excelize處理excel表實(shí)現(xiàn)帶數(shù)據(jù)校驗(yàn)的文件導(dǎo)出
本文主要介紹了go中Excelize處理excel表實(shí)現(xiàn)帶數(shù)據(jù)校驗(yàn)的文件導(dǎo)出,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06golang 實(shí)現(xiàn)對(duì)Map進(jìn)行鍵值自定義排序
這篇文章主要介紹了golang 實(shí)現(xiàn)對(duì)Map進(jìn)行鍵值自定義排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04