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"
	}]
}`

Go Playground - The Go Programming Language

Go Playground - The Go Programming Language


更多关于Golang中未定义main函数的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

Sibert:

执行此操作的语法是什么?

我想我找到了一个解决方案:

Go Playground - The Go Programming Language

还有其他解决方案吗?

更多关于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"
	}]
}`

主要修改点:

  1. 数据结构修正:将[]map[string]interface{}改为map[string]interface{},因为JSON的顶层是一个包含"main"和"sub"键的对象

  2. 模板语法修正

    • 使用{{ range .main }}{{ range .sub }}直接访问对应的数组
    • 在range循环内使用{{.menu_id}}{{.menu_txt}}访问当前元素的字段
    • 为id属性添加双引号:id="{{.menu_id}}"
  3. 替代方案:使用结构体定义更清晰的类型

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)
	}
}

这样模板可以保持相同,但代码类型安全性更高。两种方法都能正确渲染两个独立的菜单列表。

回到顶部