【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()})}
}
解决办法
ValueOf()
直接传入结构体- 使用
Elem()
获取指针指向的元素Value
immutable := reflect.ValueOf(article).Elem()
【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value相关推荐
- 【Go】Panic函数
panic(运行时恐慌)是一种只会在程序运行时才回抛出来的异常.在panic被抛出之后,如果没有在程序里添加任何保护措施的话,程序就会在打印出panic的详情,终止运行. 如果一个panic是无意间引 ...
- 【问题解决】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 ...
- 解决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 ...
- go学习之异常记录01:panic: reflect: call of reflect.Value.NumField on int Value
代码: package mainimport ("fmt""reflect""strconv""strings" )ty ...
- 【Go】string 优化误区及建议
原文链接: https://blog.thinkeridea.com/... 本文原标题为 <string 也是引用类型>,经过 郝林 大佬指点原标题存在诱导性,这里解释一下 " ...
- Golang error 处理思路分享【详】
error 封装 Error, Exception & Panic 1. Error 错误是程序中可能出现的问题,比如连接数据库失败,连接网络失败等,在程序设计中,错误处理是业务的一部分. G ...
- 【面试】我是如何在面试别人Spring事务时“套路”对方的
作者:李新杰,来自:编程新说 "中国最好面试官" 自从上次写了一篇"[面试]我是如何面试别人List相关知识的,深度有点长文"的文章后,有读者专门加我微信,说我 ...
- 【ES6】Proxy对象
[ES6]Proxy对象 一.Proxy的基本用法 二.Proxy示例的方法 1)get() 2)set() 3)apply() 查看更多ES6教学文章: 参考文献 引言:ES6规范里面新增了Prox ...
- 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理...
[原创]分布式之缓存击穿 什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询, ...
最新文章
- SASE — Overview
- 快速开发平台网格部件合并单元格。
- 【转】Linux写时拷贝技术(copy-on-write)
- MOCTF-Web-Flag在哪?
- git 安装包_Git、TortoiseGit的安装、使用说明
- Scylla——开源免费的优秀代理 IP 池:自动验证、JSON API、基于 React 的 Web UI、Docker 支持...
- c++ amp vs2017 报错_opencv4教程-1 opencv的安装与调试Windows10+vs2017
- 用友发布智多星 AI 企业大脑,其核心组成原来是这样的
- Android studio 中使用xUtils报错
- 【汇编语言】【ARM扩展资料】汇编语言开发
- 【ZBrush笔刷收集】一百多个实用笔刷和Alpah,以及笔刷使用方法,全部免费
- 三款MikroTik家用和小型办公网路由器
- 夏普科学计算机标准差,疯狂期货夏普比率公式里面标准差实际应该怎么算
- english 后缀
- android 字幕跑马灯,led跑马灯字幕
- JS this指向总结
- python正则表达式爬取链家租房信息
- 启动管理-启动流程-启动过程(有流程图)
- 11.2. Yate Client
- C++部分函数调用形式耗时测试
热门文章
- 阮一峰 《ECMAScript 6 入门》:let 和 const 命令
- VScode 格式化代码快捷键、修改快捷键
- 聊一聊 cookie
- 分布式消息中间件 : Rocketmq
- Quartz 之入门示例
- 解决: Your ApplicationContext is unlikely to start due to a @ComponentScan of the default
- 【SCOI2005】【BZOJ1087】互不侵犯King(状压dp)
- 关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup...
- Oracle+ASM单机环境下,开启归档的最简单的方法
- [华为机试练习题]60.水仙花数