Golang中如何合并两个Map并添加Header?
Golang中如何合并两个Map并添加Header? 我只能向Go模板传递一个参数。但我有两个(或更多JSON)映射,我想将它们合并并添加一个“头部”。
最终结果应该是这样的。我想在每个JSON之前添加“main”和“sub”。
const jsondata = `{
"main": [{ <---------添加main头部
"menu_id": "1",
"menu_txt": "Home"
}, {
"menu_id": "2",
"menu_txt": "Prefs"
}],
"sub": [{ <---------添加sub头部
"menu_id": "3",
"menu_txt": "Test"
}, {
"menu_id": "4",
"menu_txt": "Test2"
}]
}
`
这两个JSON对象(映射?)是分别加载的,我希望将它们合并。
func load_main(main string) []map[string]interface{} {
resp, err := http.Get("https://api3.go4webdev.org/menu/" + main)
if err != nil {
fmt.Println("No response")
}
defer resp.Body.Close()
menu, err := io.ReadAll(resp.Body)
var data []map[string]interface{}
if err := json.Unmarshal([]byte(menu), &data); err != nil {
panic(err)
}
return data
}
func load_sub(sub string) []map[string]interface{} {
resp, err := http.Get("https://api3.go4webdev.org/menu/" + sub)
if err != nil {
fmt.Println("No response")
}
defer resp.Body.Close()
menu, err := io.ReadAll(resp.Body)
var data []map[string]interface{}
if err := json.Unmarshal([]byte(menu), &data); err != nil {
panic(err)
}
return data
}
每次加载的输出类似于:
[map[menu_id:home menu_txt:Home…] (main) [map[menu_id:code menu_txt:Code…] (sub)
我如何向每个映射添加头部,并将两个JSON合并成一个单一的JSON映射?

更多关于Golang中如何合并两个Map并添加Header?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
我想将它们合并。
最终我找到了一个解决方案。将它们作为字符串连接,然后进行映射。
func load_main(main string) string {
resp, err := http.Get("https://api3.go4webdev.org/menu/" + main)
if err != nil {
fmt.Println("No response")
}
defer resp.Body.Close()
menu, err := io.ReadAll(resp.Body)
return string(menu)
}
func load_sub(sub string) string {
resp, err := http.Get("https://api3.go4webdev.org/menu/" + sub)
if err != nil {
fmt.Println("No response")
}
defer resp.Body.Close()
menu, err := io.ReadAll(resp.Body)
return string(menu)
}
func load_menus(mainmenu string, submenu string) map[string]interface{} {
main := load_main(mainmenu)
sub := load_sub(submenu)
menu := (`{ "main":` + string(main) + `,"sub":` + string(sub) + `}`)
var data map[string]interface{}
if err := json.Unmarshal([]byte(menu), &data); err != nil {
panic(err)
}
return data
}
更多关于Golang中如何合并两个Map并添加Header?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go中合并两个Map并添加Header可以通过创建新的map结构来实现。以下是完整的解决方案:
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
func load_main(main string) []map[string]interface{} {
resp, err := http.Get("https://api3.go4webdev.org/menu/" + main)
if err != nil {
fmt.Println("No response")
return nil
}
defer resp.Body.Close()
menu, err := io.ReadAll(resp.Body)
if err != nil {
return nil
}
var data []map[string]interface{}
if err := json.Unmarshal(menu, &data); err != nil {
panic(err)
}
return data
}
func load_sub(sub string) []map[string]interface{} {
resp, err := http.Get("https://api3.go4webdev.org/menu/" + sub)
if err != nil {
fmt.Println("No response")
return nil
}
defer resp.Body.Close()
menu, err := io.ReadAll(resp.Body)
if err != nil {
return nil
}
var data []map[string]interface{}
if err := json.Unmarshal(menu, &data); err != nil {
panic(err)
}
return data
}
func mergeMapsWithHeaders(mainData, subData []map[string]interface{}) map[string]interface{} {
result := make(map[string]interface{})
if mainData != nil {
result["main"] = mainData
}
if subData != nil {
result["sub"] = subData
}
return result
}
func main() {
mainData := load_main("main")
subData := load_sub("sub")
mergedData := mergeMapsWithHeaders(mainData, subData)
jsonData, err := json.MarshalIndent(mergedData, "", "\t")
if err != nil {
panic(err)
}
fmt.Println(string(jsonData))
}
如果需要在模板中使用,可以这样传递:
package main
import (
"encoding/json"
"html/template"
"io"
"net/http"
"os"
)
func loadData() map[string]interface{} {
mainData := load_main("main")
subData := load_sub("sub")
return map[string]interface{}{
"main": mainData,
"sub": subData,
}
}
func renderTemplate() {
tmpl := `<!DOCTYPE html>
<html>
<body>
<h1>Main Menu</h1>
{{range .main}}
<div>{{.menu_txt}}</div>
{{end}}
<h1>Sub Menu</h1>
{{range .sub}}
<div>{{.menu_txt}}</div>
{{end}}
</body>
</html>`
t, err := template.New("webpage").Parse(tmpl)
if err != nil {
panic(err)
}
data := loadData()
err = t.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
func main() {
renderTemplate()
}
对于更通用的合并多个map的方法:
func mergeMultipleMaps(maps ...map[string][]map[string]interface{}) map[string]interface{} {
result := make(map[string]interface{})
for _, m := range maps {
for key, value := range m {
result[key] = value
}
}
return result
}
// 使用示例
func exampleUsage() {
mainData := load_main("main")
subData := load_sub("sub")
extraData := load_main("extra")
merged := mergeMultipleMaps(
map[string][]map[string]interface{}{"main": mainData},
map[string][]map[string]interface{}{"sub": subData},
map[string][]map[string]interface{}{"extra": extraData},
)
jsonData, _ := json.MarshalIndent(merged, "", " ")
fmt.Println(string(jsonData))
}
这些代码示例展示了如何:
- 加载多个JSON数据源
- 为每个数据源添加头部(main、sub等)
- 合并成一个单一的map结构
- 可以传递给Go模板或序列化为JSON

