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映射?

Go Playground

Go Playground - The Go Programming Language


更多关于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))
}

这些代码示例展示了如何:

  1. 加载多个JSON数据源
  2. 为每个数据源添加头部(main、sub等)
  3. 合并成一个单一的map结构
  4. 可以传递给Go模板或序列化为JSON
回到顶部