【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动态代理...
[原创]分布式之缓存击穿 什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询, ...
最新文章
- 十项观察!药物开发中的AI现状
- 金融风控实战——有监督分箱
- LeetCode 38. Count and Say
- 【Flink】Flink 如何 保证 同一个key对应的state是一个呢?KeyedProcessFunction
- 注册表和计算机用户名关系,IUSR_计算机名和IWAM_计算机名帐户的用户名和密码...
- 嘿,我这里有一个 Survey!
- linux需要的GLIBCXX版本,Linux下GLIBCXX和GLIBC版本低造成的编译错误的解决方案
- 编写高效的C++程序方法之使用对象池
- 玩转CSS盒子之 三角形盒子
- 使用PEG估值法简单选股(1)
- 邮件营销EDM(Email Direct Marketing) 运营笔记
- Android ListView异步获取网络图片
- 旧唐书 卷一百九十六下 列传第一百四十六下
- 电脑安装matlab卡顿,解决 Windows 10 卡顿问题
- 约瑟夫问题(丢手绢问题)
- linux处理僵尸进程
- 苹果主题商店_盒子电视模拟器电视直播+影视点播!苹果安卓手机影视点播!...
- JavaScript正则表达式验证手机号码
- 2020-10-18大二第七周
- 磁场强度和磁感应强度区别