gpt4 book ai didi

go - 在 Go 中递归打印 map 中的所有值

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:44 24 4
gpt4 key购买 nike

假设我有一张这种类型的 map :

var results map[string]interface{}

值可以是任何东西,甚至是另一张 map 。我将如何打印所有值?如果该值是一个数组,我想单独打印数组中的每个项目。如果是另一张 map ,我想在 map 上递归调用同一个函数。

最佳答案

前段时间我无耻地从网站上撕下了这个:

import (
"fmt"
"reflect"
"strings"
)

/*
InspectStruct prints the guts of an instantiated struct. Very handy for debugging
usage: InspectStruct(req, 0) -> prints all children
*/

func InspectStructV(val reflect.Value, level int) {
if val.Kind() == reflect.Interface && !val.IsNil() {
elm := val.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
val = elm
}
}
if val.Kind() == reflect.Ptr {
val = val.Elem()
}

for i := 0; i < val.NumField(); i++ {
valueField := val.Field(i)
typeField := val.Type().Field(i)
address := "not-addressable"

if valueField.Kind() == reflect.Interface && !valueField.IsNil() {
elm := valueField.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
valueField = elm
}
}

if valueField.Kind() == reflect.Ptr {
valueField = valueField.Elem()

}
if valueField.CanAddr() {
address = fmt.Sprintf("0x%X", valueField.Addr().Pointer())
}

fmt.Printf("%vField Name: %s,\t Field Value: %v,\t Address: %v\t, Field type: %v\t, Field kind: %v\n",
strings.Repeat("\t", level),
typeField.Name,
//valueField.Interface(),
address,
typeField.Type,
valueField.Kind())

if valueField.Kind() == reflect.Struct {
InspectStructV(valueField, level+1)
}
}
}

func InspectStruct(v interface{}, level int) {
InspectStructV(reflect.ValueOf(v), level)
}

关于go - 在 Go 中递归打印 map 中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28775485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com