产生原因

调用 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.ValueOfarticle是一个指针,所以得到的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()})}
}

解决办法

  1. ValueOf()直接传入结构体
  2. 使用Elem()获取指针指向的元素Value
immutable := reflect.ValueOf(article).Elem()

【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value相关推荐

  1. 【Go】Panic函数

    panic(运行时恐慌)是一种只会在程序运行时才回抛出来的异常.在panic被抛出之后,如果没有在程序里添加任何保护措施的话,程序就会在打印出panic的详情,终止运行. 如果一个panic是无意间引 ...

  2. 【问题解决】panic: qtls.ClientHelloInfo doesn‘t match goroutine 1 [running]: github.com/marten-seemann/qt

    在跑Go代码的时候报错,如下问题 panic: qtls.ClientHelloInfo doesn't matchgoroutine 1 [running]: github.com/marten-s ...

  3. 解决panic: reflect: call of reflect.Value.Elem on struct Value [recovered]

    报错时的情景: panic: reflect: call of reflect.Value.Elem on struct Value [recovered]     panic: reflect: c ...

  4. go学习之异常记录01:panic: reflect: call of reflect.Value.NumField on int Value

    代码: package mainimport ("fmt""reflect""strconv""strings" )ty ...

  5. 【Go】string 优化误区及建议

    原文链接: https://blog.thinkeridea.com/... 本文原标题为 <string 也是引用类型>,经过 郝林 大佬指点原标题存在诱导性,这里解释一下 " ...

  6. Golang error 处理思路分享【详】

    error 封装 Error, Exception & Panic 1. Error 错误是程序中可能出现的问题,比如连接数据库失败,连接网络失败等,在程序设计中,错误处理是业务的一部分. G ...

  7. 【面试】我是如何在面试别人Spring事务时“套路”对方的

    作者:李新杰,来自:编程新说 "中国最好面试官" 自从上次写了一篇"[面试]我是如何面试别人List相关知识的,深度有点长文"的文章后,有读者专门加我微信,说我 ...

  8. 【ES6】Proxy对象

    [ES6]Proxy对象 一.Proxy的基本用法 二.Proxy示例的方法 1)get() 2)set() 3)apply() 查看更多ES6教学文章: 参考文献 引言:ES6规范里面新增了Prox ...

  9. 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理...

    [原创]分布式之缓存击穿 什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询, ...

最新文章

  1. 十项观察!药物开发中的AI现状
  2. 金融风控实战——有监督分箱
  3. LeetCode 38. Count and Say
  4. 【Flink】Flink 如何 保证 同一个key对应的state是一个呢?KeyedProcessFunction
  5. 注册表和计算机用户名关系,IUSR_计算机名和IWAM_计算机名帐户的用户名和密码...
  6. 嘿,我这里有一个 Survey!
  7. linux需要的GLIBCXX版本,Linux下GLIBCXX和GLIBC版本低造成的编译错误的解决方案
  8. 编写高效的C++程序方法之使用对象池
  9. 玩转CSS盒子之 三角形盒子
  10. 使用PEG估值法简单选股(1)
  11. 邮件营销EDM(Email Direct Marketing) 运营笔记
  12. Android ListView异步获取网络图片
  13. 旧唐书 卷一百九十六下 列传第一百四十六下
  14. 电脑安装matlab卡顿,解决 Windows 10 卡顿问题
  15. 约瑟夫问题(丢手绢问题)
  16. linux处理僵尸进程
  17. 苹果主题商店_盒子电视模拟器电视直播+影视点播!苹果安卓手机影视点播!...
  18. JavaScript正则表达式验证手机号码
  19. 2020-10-18大二第七周
  20. 磁场强度和磁感应强度区别

热门文章

  1. shiro管理下MD5加密的使用
  2. VS Code (visual studio code) VSC 编辑器(微软出品,js开发的编辑器)
  3. FreeSql (三十四)CodeFirst 迁移说明
  4. IntelliJ idea学习资源
  5. iPhone屏幕尺寸/launch尺寸/icon尺寸
  6. 转:upload.parseRequest为空
  7. 走台阶 OR 台阶走——《狂人C》习题解答14(第三章习题4)
  8. Android——Ubuntu android NDK 配置
  9. js转换字符串为base64位
  10. 2017年秋招-广联达面试及思考