golang reflect.value.FieldByIndex() panic?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang reflect.value.FieldByIndex() panic?相关的知识,希望对你有一定的参考价值。

测试代码如下:
package main

import (
"fmt"
"reflect"
)

// Student is for test the struct reflect
type Student struct
Name string
Age int


func main()
stu := StudentName: "zhangsan", Age: 33
v := reflect.ValueOf(stu)

field0Val := v.Field(0)
fmt.Printf("field0Val: %v\n", field0Val) // field0Val: zhangsan
field1Val := v.Field(1)
fmt.Printf("field1Val: %v\n", field1Val) // field1Val: 33

kind := v.Kind()
fmt.Printf("kind: %v, %d\n", kind, kind) // struct, 25

fieldVals := v.FieldByIndex([]int0, 1) // panic: reflect: call of reflect.Value.Field on string Value
fmt.Printf("fieldVals: %v\n", fieldVals)

执行代码结果如下:
$ ./reflect02
field0Val: zhangsan
field1Val: 33
kind: struct, 25
panic: reflect: call of reflect.Value.Field on string Value

goroutine 1 [running]:
reflect.Value.Field(0x4adf20, 0xc000096440, 0x98, 0x1, 0x4adf20, 0xc000096440, 0x98)
C:/Go/src/reflect/value.go:827 +0x12a
reflect.Value.FieldByIndex(0x4b9bc0, 0xc000096440, 0x99, 0xc0000c7ec0, 0x2, 0x2, 0x2, 0x11, 0x0)
C:/Go/src/reflect/value.go:871 +0x8d
main.main()
D:/go/reflect02/main.go:26 +0x3d2
执行结果显示,测试代码26行的v.FieldByIndex([]int0, 1)panic了,追踪到reflect包的value.go文件第871行:
871行源码:v = v.Field(x)
执行的是结构体value的方法reflect.value.Field(),又追踪到value.go的827行,826,827,828的源码如下:
if v.kind() != Struct
panic(&ValueError"reflect.Value.Field", v.kind())

就是说panic的原因是826行的:v.kind() != Struct ,value的kind()方法的返回值不等于Struct(常量const Struct Kind = 25),那么,问题就在这了,但是我在测试代码里单独调用value的Field()方法(测试代码18行:field0Val := v.Field(0))是不会panic的,而且测试代码里单独调用Kind()方法(测试代码23,24行)返回值确实是:struct,25,没毛病啊,为什么panic呢,想了想,或许是记忆惯性导致找不到错误,或许使用方式不对,又或者其他原因,折腾半天了

参考技术A 我测试了一下
0可以得到fieldVals: zhangsan
1可以得到fieldVals: 33
但不能是0, 1本回答被提问者采纳

golang如何打印内存内容

参考技术A golang如何打印内存内容

以上是关于golang reflect.value.FieldByIndex() panic?的主要内容,如果未能解决你的问题,请参考以下文章

Golang入门到项目实战 第一个golang应用

golang编译androidso无法加载

golang如何打印内存内容

Golang入门到项目实战 golang匿名函数

json [Golang] golang #golang #snippets中有用的片段

golang使用成本高