golang笔记-struct体遍历

由于文章由markdown的方式编写, 部分链接与图片显示可能存在问题, 大家可以移步到github源查看

文章由https://studygolang.com/articles/5837启发, 进行展开发散.

利用reflect包对struct结构进行遍历, 对于学习golang有很大的帮助:

完整测试代码如下, 可以用以输出完整的struct成员, 增加递归函数可以很容易的做到多种类型输出:

package main

import (
	"fmt"
	"reflect"
)

type Event struct {
	Topic string
	Data  string
}

type Logs struct {
	Addr   string
	Hash   string
	Height uint64
	Events []Event
}

func main() {
	u := Logs{
		Addr:   "qwrtyuiopasdfghjkl",
		Hash:   "zxcvbnm",
		Height: 1011,
		Events: []Event{{Topic: "123456789", Data: "987654321"}, {Topic: "zz123456789", Data: "zz987654321"}},
	}
	t := reflect.TypeOf(u)
	v := reflect.ValueOf(u)
	for k := 0; k < t.NumField(); k++ {
		fmt.Printf("%s -- %v \n", t.Field(k).Name, v.Field(k).Interface())
		if v.Field(k).Kind() == reflect.Slice {
			t2 := v.Field(k).Type()
			v2 := v.Field(k)
			fmt.Println(t2.String() + " --")
			for i := 0; i < v2.Len(); i++ {
				v3 := v2.Index(i)
				for j := 0; j < v3.NumField(); j++ {
					fmt.Printf("%s -- %v \n", v3.Type().Field(j).Name, v3.Field(j).Interface())
				}
			}
		}
	}
}

编译结果:

Addr -- qwrtyuiopasdfghjkl

Hash -- zxcvbnm

Height -- 1011

Events -- [{123456789 987654321} {zz123456789 zz987654321}]

[]main.Event --

Topic -- 123456789

Data -- 987654321

Topic -- zz123456789

Data -- zz987654321

对于struct嵌套[]struct的处理方式:

if v.Field(k).Kind() == reflect.Slice {
			t2 := v.Field(k).Type()
			v2 := v.Field(k)
			fmt.Println(t2.String() + " --")
			for i := 0; i < v2.Len(); i++ {
				v3 := v2.Index(i)
				for j := 0; j < v3.NumField(); j++ {
					fmt.Printf("%s -- %v \n", v3.Type().Field(j).Name, v3.Field(j).Interface())
				}
			}
		}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值