【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value
生活随笔
收集整理的這篇文章主要介紹了
【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
產生原因
調用 FieldByName()方法時,調用者與預期類型不相符。
// 錯誤代碼 func setNewArticleInfoToCache(article *Article) {fields := []string{"Title", "Abstract", "ID", "AuthorID", "CreateTime",}immutable := reflect.ValueOf(article)// immutable := reflect.ValueOf(article).Elem()for _, field := range fields {val := immutable.FieldByName(field)fmt.Println(val)} }//panic: reflect: call of reflect.Value.FieldByName on ptr Value [recovered] // panic: reflect: call of reflect.Value.FieldByName on ptr Value由于傳遞給reflect.ValueOf的 article是一個指針,所以得到的immutable的類型是Ptr, 而FieldByName方法需要調用者類型為Struct:
func (v Value) FieldByName(name string) Value {// 必須是 Struct 類型v.mustBe(Struct)if f, ok := v.typ.FieldByName(name); ok {return v.FieldByIndex(f.Index)}return Value{} }func (f flag) mustBe(expected Kind) {if Kind(f&flagKindMask) != expected {// 此處拋出的異常panic(&ValueError{methodName(), f.kind()})} }解決辦法
總結
以上是生活随笔為你收集整理的【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python微信语音转发方法_最简单的微
- 下一篇: 酷派删除android系统软件,Cool