首页 > 解决方案 > 如何构建复杂的 Go 数据结构

问题描述

我有以下数据结构来构建和发送数据。然后将其转换为json并写入文件。我需要一个数组。它的元素是一张地图。map["targets"]value 是一个数组,map["labels"]是另一个映射。如何构建复杂的数据结构?

[
  {
    "targets": ["10.11.150.1:7870", "10.11.150.4:7870"],
    "labels": {
      "job": "mysql"
    }
  },
  {
    "targets": ["10.11.122.11:6001", "10.11.122.15:6002"],
    "labels": {
      "job": "postgres"
    }
  }
]

~

标签: go

解决方案


所以你的结构看起来像这样:

type Obj struct {
    Targets []string `json:"targets"`
    Labels map[string]string `json:"labels"`
}

填充它:

obj := []Obj{
    Obj{
        Targets: []string{"10.11.150.1:7870", "10.11.150.4:7870"},
        Labels: map[string]string{
            "job": "mysql",
        },
    },
    Obj{
        Targets: []string{"10.11.122.11:6001", "10.11.122.15:6002"},
        Labels: map[string]string{
            "job": "postgres",
        },
    },
}

将其编组为字符串:

jsonBytes, err := json.Marshal(obj)
if err != nil {
    log.Fatal("error marshaling struct to JSON:", err)
}

将其写入文件:

if err := ioutil.WriteFile("output.json", jsonBytes, 0644); err != nil {
    log.Fatal("error writing file:", err)
}

这是所有内容:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
)

type obj struct {
    Targets []string          `json:"targets"`
    Labels  map[string]string `json:"labels"`
}

func main() {

    obj := []obj{
        obj{
            Targets: []string{"10.11.150.1:7870", "10.11.150.4:7870"},
            Labels: map[string]string{
                "job": "mysql",
            },
        },
        obj{
            Targets: []string{"10.11.122.11:6001", "10.11.122.15:6002"},
            Labels: map[string]string{
                "job": "postgres",
            },
        },
    }

    jsonBytes, err := json.Marshal(obj)
    if err != nil {
        log.Fatal("error marshaling struct to JSON:", err)
    }

    if err := ioutil.WriteFile("output.json", jsonBytes, 0644); err != nil {
        log.Fatal("error writing file:", err)
    }

    fmt.Printf("%+v\n", jsonBytes)
}

推荐阅读