结构体的属性名称转为字符串

huangapple go评论66阅读模式
英文:

Property name of a structure to string

问题

我想知道是否可以从结构体中获取属性的名称并将其转换为字符串。

例如,在以下代码中:

package main

import "fmt"

type StructA struct {
    ValueAA string
    ValueAB string
}

type StructB struct {
    ValueBA    string
    ValueBB    string
    RefStructA StructA
}

func main() {
    //传递任何结构体的属性
    fmt.Println(castProperty(StructB.RefStructA.ValueAA))
    //打印传递的名称,但以字符串形式。不打印值
    //期望输出: "StructB.RefStructA.ValueAA"
}

func castProperty(value interface{}) string {
    //一些代码
}

是否可以编写一个函数,允许获取结构体属性的名称并转换为字符串?不需要属性值。

英文:

I would like to know if it is possible to get the name of a property from a structure and convert it to string.

For example in the following code:

package main

import "fmt"

type StructA struct {
	ValueAA string
	ValueAB string
}

type StructB struct {
	ValueBA    string
	ValueBB    string
	RefStructA StructA
}

func main() {
	//pass any attribute of any structure
	fmt.Println(castProperty(StructB.RefStructA.ValueAA))
	//print the name passed but in string. Do not print the value
	//expected output: "StructB.RefStructA.ValueAA"
}

func castProperty(value interface{}) string {
	//some code
}

Is it possible to write a function that allows obtaining the name of the property of a structure and converted to a string? property value is not required.

答案1

得分: 1

这被称为“反射”。我让你阅读这个页面,它可以让你做你想做的事情。

首先,阅读“反射的第一定律”:https://go.dev/blog/laws-of-reflection

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x float64 = 3.4
    fmt.Println("类型:", reflect.TypeOf(x))
}

https://play.golang.org/p/OuGgD1TlSMO

英文:

That's called Reflection. I let you read the page, it lets you do what you want.

First, read the The first law of reflection: https://go.dev/blog/laws-of-reflection

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x float64 = 3.4
    fmt.Println("type:", reflect.TypeOf(x))
}

https://play.golang.org/p/OuGgD1TlSMO

答案2

得分: 1

我不确定你想如何给你的函数输入,但是这里有一个可能会帮到你的示例:

package main

import (
	"log"
	"reflect"
)

func main() {
	getPropertyName(B{})
}

type A struct {
	field1 string
}

type B struct {
	field A
}

func getPropertyName(b interface{}) {
	parentType := reflect.TypeOf(b)
	val := reflect.ValueOf(b)

	for i := 0; i < val.Type().NumField(); i++ {
		t := val.Type().Field(i)
		ty := val.Type().Field(i).Type.Name()
		log.Println(parentType.Name() + "." + t.Name + "." + ty)
	}
}

请注意,这只是一个示例代码,用于演示如何获取结构体字段的名称和类型。你可以根据自己的需求进行修改和扩展。

英文:

I am not sure exactly how do you want to give input to your function but here is an example that may help you

package main

import (
	&quot;log&quot;
	&quot;reflect&quot;
)

func main() {
	getPropertyName(B{})
}

type A struct {
	field1 string
}

type B struct {
	field A
}

func getPropertyName(b interface{}) {
	parentType := reflect.TypeOf(b)
	val := reflect.ValueOf(b)

	for i := 0; i&lt; val.Type().NumField(); i++ {
		t := val.Type().Field(i)
		ty := val.Type().Field(i).Type.Name()
		log.Println(parentType.Name()+&quot;.&quot;+ t.Name+&quot;.&quot;+ty)
	}
}

答案3

得分: 0

你可以这样做:

package main

import (
	"fmt"
)

type StructA struct {
	ValueAA string
	ValueAB string
}

type StructB struct {
	ValueBA    string
	ValueBB    string
	RefStructA StructA
}

func main() {
	x := &StructB{RefStructA: StructA{ValueAA: "something"}}
	fmt.Printf("%+v", x)
}

输出结果:

&{ValueBA: ValueBB: RefStructA:{ValueAA:something ValueAB:}}
英文:

you could do something like this :

package main

import (
	&quot;fmt&quot;
)

type StructA struct {
	ValueAA string
	ValueAB string
}

type StructB struct {
	ValueBA    string
	ValueBB    string
	RefStructA StructA
}

func main() {
	x := &amp;StructB{RefStructA: StructA{ValueAA: &quot;something&quot;}}
	fmt.Printf(&quot;%+v&quot;, x)
}

out :

&amp;{ValueBA: ValueBB: RefStructA:{ValueAA:something ValueAB:}}

huangapple
  • 本文由 发表于 2021年8月20日 11:07:28
  • 转载请务必保留本文链接:https://go.coder-hub.com/68856558.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定