golang反射该怎么断言指针类型的结构体?


type User struct {
    Name   string
    Age    int64
    Hobbys *Hobby
    Sex string
}

type Hobby struct {
    Cars  *Car
    Games *Game
}

type Car struct {
    Brand string
    Color string
    Price string
}

type Game struct {
    Number int64
    Style  string
}

func main() {
    user := &User{
        Name: "张三",
        Age: 15,
        Hobbys : &Hobby{
            Cars:&Car{
                Brand : "奔驰",
                Color:"白色",
                Price:"100万",
            },
            Games : &Game{
                Number:10000,
                Style: "街机",
            },
        },
        Sex: "男",
    }
    traverse(*user)
}

func traverse(a interface{})  {
    aValue := reflect.ValueOf(a)
    aType := reflect.TypeOf(a)
    for i := 0; i < aValue.NumField(); i++ {
        aField := aValue.Field(i)
        aFieldType := aType.Field(i)
        fmt.Printf("%v: %v ", aFieldType.Name, aField.Interface())
        if aField.Kind() == reflect.Ptr {
            traverse(aField.Interface()) //这个地方要怎么去定义指针类型的结构体去执行递归
        }
    }
}
阅读 1.9k
2 个回答

试试这个方法 Elem()

image.png

改成这样?

package main

import (
    "fmt"
    "reflect"
)

func PrintlnFunc(in any) {
    fmt.Printf("\033[36;1;4mOutput:\033[0m \033[31;1;4m%v\033[0m\n", in)
}

func SprintfFunc(format string, in ...any) string {
    return fmt.Sprintf(format, in...)
}

type User struct {
    Name   string
    Age    int64
    Hobbys *Hobby
    Sex    string
}

type Hobby struct {
    Cars  *Car
    Games *Game
}

type Car struct {
    Brand string
    Color string
    Price string
}

type Game struct {
    Number int64
    Style  string
}

func traverse(a interface{}) {
    aValue := reflect.ValueOf(a)
    aType := reflect.TypeOf(a)
    for i := 0; i < aValue.Elem().NumField(); i++ {
        aField := aValue.Elem().Field(i)
        aFieldType := aType.Elem().Field(i)
        PrintlnFunc(SprintfFunc("%v: %v ", aFieldType.Name, aField.Interface()))
        if aField.Kind() == reflect.Ptr {
            traverse(aField.Interface()) //这个地方要怎么去定义指针类型的结构体去执行递归
        }
    }
}

func main() {
    user := &User{
        Name: "张三",
        Age:  15,
        Hobbys: &Hobby{
            Cars: &Car{
                Brand: "奔驰",
                Color: "白色",
                Price: "100万",
            },
            Games: &Game{
                Number: 10000,
                Style:  "街机",
            },
        },
        Sex: "男",
    }
    traverse(user)
}

输出:

Output: Name: 张三 
Output: Age: 15 
Output: Hobbys: &{0xc0000981b0 0xc0000a0030} 
Output: Cars: &{奔驰 白色 100万} 
Output: Brand: 奔驰 
Output: Color: 白色 
Output: Price: 100万 
Output: Games: &{10000 街机} 
Output: Number: 10000 
Output: Style: 街机 
Output: Sex: 男 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题