2023年12月2日星期六

结构体反射的一个关于指针的事例

结构体反射的一个关于指针的事例

博主最近在学习go语言,这里记录一下一个关于结构体反射的小trick
关于将结构体的指针类型作为reflect.ValueOf的参数
因为myst的Field有这Name``age``hobby三个,所以在获取NumField和Field时需要将TypeOf(*myst).Elem()作为参数
而两个方法是将指针类型作为接收者,所以ValueOf(*myst).Method(i).Call(nil)可以调用方法。

package main

import (
	"fmt"
	"reflect"
)

func (m *myst) Kaihe() {
	fmt.Println(m.Name, m.age, m.hobby)
}

func (m *myst) Shangxue() {
	fmt.Println(m.Name, "今天上学")
}

type myst struct {
	Name  string `json:"name" ini:"s_name"`
	age   int
	hobby []string
}

func main() {
	stu := &myst{Name: "Epicmo", age: 50, hobby: []string{"play", "jump"}}
	stu.Shangxue()
	t := reflect.TypeOf(stu).Elem()
	for i := 0; i < t.NumField(); i++ {
		fileobj := t.Field(i)
		fmt.Printf("name %v, type %v tag %v \n", fileobj.Name, fileobj.Type, fileobj.Tag)
		fmt.Println(fileobj.Tag.Get("json"))
	}
	v := reflect.ValueOf(stu)
	for i := 0; i < v.NumMethod(); i++ {
		v.Method(i).Call(nil)
	}
}
Epicmo 今天上学
name Name, type string tag json:"name" ini:"s_name" 
name
name age, type int tag  

name hobby, type []string tag  

Epicmo 50 [play jump]
Epicmo 今天上学

0 评论:

发表评论