Go语言中通过Interface{}接口传入结构体如何取到数值

使用interface接口进行处理时,由于需要对传入的参数进行断言,这就涉及到反射(reflect)的使用。
废话不多说,直接上代码

由于使用的是go test对例子进行测试,因此可以分为以下几个步骤

1、创建client_test.go文件

type ss struct {
	index int
	value string
}

func TestFun(t *testing.T) {

	var sss = ss{index: 1, value: "data"}
	dd(sss)

}

func dd(v ...interface{}) {
	for _, value := range v {

		switch value.(type) {
		case int:
			fmt.Println("int")
			break
		case string:
			fmt.Println("string")
			break
		case ss:
			fmt.Println("ss")
			var ds = reflect.ValueOf(value)
			fmt.Println(ds.FieldByName("value"))
			break
		}
	}

}

2、执行命令:

go test -v client_test.go

输出的结果为:

=== RUN   TestFun
ss
data
--- PASS: TestFun (0.00s)
PASS
ok      command-line-arguments  0.001s

可见在输入的类型为结构体类型时,执行的是type的第三个类型,即case:ss,由于传入的是结构体,

需要使用断言中的结构体相关函数来进行取值,反射中相关结构体的几个函数如下:
##########结构体相关: func (v Value) NumField() int // 获取结构体字段(成员)数量

func (v Value) Field(i int) reflect.Value //根据索引获取结构体字段

func (v Value) FieldByIndex(index []int) reflect.Value //
根据索引链获取结构体嵌套字段

func (v Value) FieldByName(string) reflect.Value //
根据名称获取结构体的字段,不存在返回reflect.ValueOf(nil)

func (v Value) FieldByNameFunc(match func(string) bool) Value //
根据匹配函数 match 获取字段,如果没有匹配的字段,则返回零值(reflect.ValueOf(nil))

########通道相关: func (v Value) Send(x reflect.Value)// 发送数据(会阻塞),v 值必须是可写通道。

func (v Value) Recv() (x reflect.Value, ok bool) // 接收数据(会阻塞),v
值必须是可读通道。

func (v Value) TrySend(x reflect.Value) bool // 尝试发送数据(不会阻塞),v
值必须是可写通道。

func (v Value) TryRecv() (x reflect.Value, ok bool) // 尝试接收数据(不会阻塞),v
值必须是可读通道。

func (v Value) Close() // 关闭通道

########函数相关 func (v Value) Call(in []Value) (r []Value) // 通过参数列表 in 调用 v 值所代表的函数(或方法)。函数的返回值存入 r 中返回。 // 要传入多少参数就在 in 中存入多少元素。 // Call
即可以调用定参函数(参数数量固定),也可以调用变参函数(参数数量可变)。

func (v Value) CallSlice(in []Value) []Value // 调用变参函数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绛洞花主敏明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值