How can I use dynamic key for struct in Go lang?

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

How can I use dynamic key for struct in Go lang?

问题

我有这个用于从 JSON 字符串中获取数据的结构体。

type msg struct {
    Msg1 string `json:"msg1"`
    Msg2 string `json:"msg2"`
    Msg3 string `json:"msg3"`
}

我需要按照以下方式使用这个结构体。

num := // 一个小于3的随机数
data := msg.Msg + num  // 类似于 msg.Msg1, msg.Msg2...

在 Go 语言中,你可以使用反射来实现这个目标。首先,你需要将 JSON 字符串解析为 msg 结构体的实例。然后,你可以使用反射来获取 msg 结构体的字段,并根据 num 的值构建字段名。

以下是一个示例代码:

import (
    "encoding/json"
    "fmt"
    "reflect"
)

func main() {
    jsonString := `{"msg1": "Hello", "msg2": "World", "msg3": "Golang"}`
    var m msg
    err := json.Unmarshal([]byte(jsonString), &m)
    if err != nil {
        fmt.Println("解析 JSON 失败:", err)
        return
    }

    num := 1 // 这里假设 num 的值为 1
    fieldName := fmt.Sprintf("Msg%d", num)
    fieldValue := reflect.ValueOf(m).FieldByName(fieldName).String()

    data := fieldValue + strconv.Itoa(num)
    fmt.Println(data) // 输出:Hello1
}

希望这可以帮助到你!如果你有任何其他问题,请随时问我。

英文:

I have this struct for get data from Json string.

    type msg struct {
         Msg1 string   `json:"msg1"`
         Msg2 string  `json:"msg2"`
         Msg3 string `json:"msg3"`
    }

And I need to use this struct like below.

num := // some random number under 3
data := msg.Msg + num  // as msg.Msg1, msg.Msg2...

How can I do this in Go lang?
I searched a lot but couldn't find any good solutions.

答案1

得分: 1

你可以使用Go语言中的动态键吗?

很抱歉,Go语言中无法直接使用动态键。这在Go中是不可行的。

(如果需要,可以使用map来实现。)

英文:

> How can I use dynamic key for struct in Go lang?

You simply cannot. This is not doable in Go.

(Use a map if you need this.)

答案2

得分: 0

只展示给你如何使用Json和Map,可能会有帮助

package main

import (
	"fmt"
	"encoding/json"
)

type sample struct{
	Member1 string `json:"TheMember1"`
}

func main() {
	map_contains := make(map[string]string)
	//Part 1 直接添加到Map
	map_contains["w"]="mmmmm"
	fmt.Println(map_contains)
	fmt.Println(map_contains["w"])
	
	//Part 2 Json字符串转为Map
	json.Unmarshal([]byte(`{"a":"123"}`),&map_contains)
	fmt.Println(map_contains)
	fmt.Println(map_contains["a"])

	//Part 3 结构体转为Json字符串再转为Map
	s1:=sample{
		Member1:"June",
	}
	s1json,err:=json.Marshal(s1)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(s1json))
	json.Unmarshal(s1json,&map_contains)
	fmt.Println(map_contains)
	fmt.Println(map_contains["TheMember1"])
}

希望对你有所帮助。

英文:

Just Show You How To Using Json And Map ,May be helpful

package main

import (
	"fmt"
	"encoding/json"
)
type sample struct{
	Member1 string `json:"TheMember1"`
}


func main() {
	map_contains := make(map[string]string)
	//Part 1 Direct Add to Map
	map_contains["w"]="mmmmm"
	fmt.Println(map_contains)
	fmt.Println(map_contains["w"])
	
	//Part 2 JsonString to Map
	json.Unmarshal([]byte(`{"a":"123"}`),&map_contains)
	fmt.Println(map_contains)
	fmt.Println(map_contains["a"])

	//Part 3 Struct To JsonString To Map
	s1:=sample{
		Member1:"June",
	}
	s1json,err:=json.Marshal(s1)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(s1json))
	json.Unmarshal(s1json,&map_contains)
	fmt.Println(map_contains)
	fmt.Println(map_contains["TheMember1"])
}

huangapple
  • 本文由 发表于 2022年3月25日 14:51:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/71613131.html
匿名

发表评论

匿名网友

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

确定