Golang中未定义main函数的解决方法
Golang中未定义main函数的解决方法 我正在尝试分别填充两个菜单。但由于我只能向模板传递一个 JSON,我必须以某种方式将它们合并。然后在 Go 模板中提取每个菜单。
实现这个的语法是什么?这甚至可能吗?
package main
import (
"encoding/json"
"html/template"
"os"
)
func main() {
t := template.Must(template.New("").Parse(templ))
var m []map[string]interface{}
if err := json.Unmarshal([]byte(jsondata), &m); err != nil {
panic(err)
}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
}
const templ = `
<html><body>
<ul>
{{ range .main }}
<li id={{main.menu_id}}> {{main.menu_txt}}</li>
{{ end }}
</ul>
<ul>
{{ range .sub }}
<li id={{sub.menu_id}}> {{sub.menu_txt}}</li>
{{ end }}
</ul>
</body></html>`
const jsondata = `{
"main": [{
"menu_id": "1",
"menu_txt": "Home"
}, {
"menu_id": "2",
"menu_txt": "Prefs"
}],
"sub": [{
"menu_id": "3",
"menu_txt": "Test"
}, {
"menu_id": "4",
"menu_txt": "Test2"
}]
}`

更多关于Golang中未定义main函数的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
更多关于Golang中未定义main函数的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go模板中处理嵌套JSON数据时,需要正确解析数据结构并调整模板语法。以下是修正后的代码:
package main
import (
"encoding/json"
"html/template"
"os"
)
func main() {
t := template.Must(template.New("").Parse(templ))
// 使用map[string]interface{}来解析嵌套结构
var data map[string]interface{}
if err := json.Unmarshal([]byte(jsondata), &data); err != nil {
panic(err)
}
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
}
const templ = `
<html><body>
<ul>
{{ range .main }}
<li id="{{.menu_id}}"> {{.menu_txt}}</li>
{{ end }}
</ul>
<ul>
{{ range .sub }}
<li id="{{.menu_id}}"> {{.menu_txt}}</li>
{{ end }}
</ul>
</body></html>`
const jsondata = `{
"main": [{
"menu_id": "1",
"menu_txt": "Home"
}, {
"menu_id": "2",
"menu_txt": "Prefs"
}],
"sub": [{
"menu_id": "3",
"menu_txt": "Test"
}, {
"menu_id": "4",
"menu_txt": "Test2"
}]
}`
主要修改点:
-
数据结构修正:将
[]map[string]interface{}改为map[string]interface{},因为JSON的顶层是一个包含"main"和"sub"键的对象 -
模板语法修正:
- 使用
{{ range .main }}和{{ range .sub }}直接访问对应的数组 - 在range循环内使用
{{.menu_id}}和{{.menu_txt}}访问当前元素的字段 - 为id属性添加双引号:
id="{{.menu_id}}"
- 使用
-
替代方案:使用结构体定义更清晰的类型
type MenuItem struct {
MenuID string `json:"menu_id"`
MenuTxt string `json:"menu_txt"`
}
type MenuData struct {
Main []MenuItem `json:"main"`
Sub []MenuItem `json:"sub"`
}
func main() {
t := template.Must(template.New("").Parse(templ))
var data MenuData
if err := json.Unmarshal([]byte(jsondata), &data); err != nil {
panic(err)
}
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
}
这样模板可以保持相同,但代码类型安全性更高。两种方法都能正确渲染两个独立的菜单列表。

