产生原因

调用 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. SASE — Overview
  2. 快速开发平台网格部件合并单元格。
  3. 【转】Linux写时拷贝技术(copy-on-write)
  4. MOCTF-Web-Flag在哪?
  5. git 安装包_Git、TortoiseGit的安装、使用说明
  6. Scylla——开源免费的优秀代理 IP 池:自动验证、JSON API、基于 React 的 Web UI、Docker 支持...
  7. c++ amp vs2017 报错_opencv4教程-1 opencv的安装与调试Windows10+vs2017
  8. 用友发布智多星 AI 企业大脑,其核心组成原来是这样的
  9. Android studio 中使用xUtils报错
  10. 【汇编语言】【ARM扩展资料】汇编语言开发
  11. 【ZBrush笔刷收集】一百多个实用笔刷和Alpah,以及笔刷使用方法,全部免费
  12. 三款MikroTik家用和小型办公网路由器
  13. 夏普科学计算机标准差,疯狂期货夏普比率公式里面标准差实际应该怎么算
  14. english 后缀
  15. android 字幕跑马灯,led跑马灯字幕
  16. JS this指向总结
  17. python正则表达式爬取链家租房信息
  18. 启动管理-启动流程-启动过程(有流程图)
  19. 11.2. Yate Client
  20. C++部分函数调用形式耗时测试

热门文章

  1. 阮一峰 《ECMAScript 6 入门》:let 和 const 命令
  2. VScode 格式化代码快捷键、修改快捷键
  3. 聊一聊 cookie
  4. 分布式消息中间件 : Rocketmq
  5. Quartz 之入门示例
  6. 解决: Your ApplicationContext is unlikely to start due to a @ComponentScan of the default
  7. 【SCOI2005】【BZOJ1087】互不侵犯King(状压dp)
  8. 关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup...
  9. Oracle+ASM单机环境下,开启归档的最简单的方法
  10. [华为机试练习题]60.水仙花数