Golang中如何将结构体数组传递给HTML模板以填充下拉菜单
Golang中如何将结构体数组传递给HTML模板以填充下拉菜单 大家好,
我对这门语言非常陌生,但我的项目需要使用它。我需要将我的结构体数组传递给HTML模板,以填充一个下拉菜单。我甚至无法传递一个简单的字符串来填充……看起来数据是空的……目标是传递整个结构体数组。在我的代码中,我尝试用其中一个项目来实现。
下拉菜单通过这段代码获得了新行,但里面没有数据。
请大家帮帮我……
这是我的Index.html代码:
<script type="text/javascript">
$(document).ready(function() {
$("#getKammer").on('click', function() {
$.ajax({
url: "http://localhost:8080/getKammer",
method: "GET",
success: function(data) {
var $dropdown = $("#Kammer");
$dropdown.append($("<option />").val(data).text(this.name));
$("#getKammer").prop('disabled', true);
},
});
});
});
</script>
这是我的Go代码:
//Klimakammer struct
type klimakammer struct {
name string
hersteller string
ip string
sollTemp string
istTemp string
sollFcht string
istFcht string
kammerstart bool
kammerstop bool
}
//Ct01 Klimakammern erstellen
var Ct01 = klimakammer{"ct01", "weiss", "10.0.62.22", "", "", "", "", false, true}
//Kammern - Fill Klimakammer Array
var Kammern = []klimakammer{
Ct01,
}
var tmpl = template.Must(template.New("tmpl").ParseFiles("./static/Index.html"))
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if err := tmpl.ExecuteTemplate(w, "Index.html", nil); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
http.ListenAndServe(":8080", nil)
http.HandleFunc("/getKammer", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, Ct01.name)
})
}
更多关于Golang中如何将结构体数组传递给HTML模板以填充下拉菜单的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
我试过了,但还是什么都没显示出来。
更多关于Golang中如何将结构体数组传递给HTML模板以填充下拉菜单的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
若要使字段可见,请将其导出(首字母大写)。
在Golang中正确传递结构体数组到HTML模板需要几个关键步骤。你的代码存在几个问题:字段未导出、模板执行错误、路由注册顺序问题。以下是修正后的代码:
1. 修正结构体字段导出问题:
// Klimakammer struct - 字段首字母必须大写才能被模板访问
type Klimakammer struct {
Name string
Hersteller string
IP string
SollTemp string
IstTemp string
SollFcht string
IstFcht string
Kammerstart bool
Kammerstop bool
}
// Ct01 Klimakammern erstellen
var Ct01 = Klimakammer{"ct01", "weiss", "10.0.62.22", "", "", "", "", false, true}
// Kammern - Fill Klimakammer Array
var Kammern = []Klimakammer{
Ct01,
}
2. 修正主函数和路由处理:
var tmpl = template.Must(template.New("tmpl").ParseFiles("./static/Index.html"))
func main() {
// 先注册路由再启动服务器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if err := tmpl.ExecuteTemplate(w, "Index.html", nil); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
http.HandleFunc("/getKammer", func(w http.ResponseWriter, r *http.Request) {
// 设置JSON响应头
w.Header().Set("Content-Type", "application/json")
// 将整个数组编码为JSON
json.NewEncoder(w).Encode(Kammern)
})
http.ListenAndServe(":8080", nil)
}
3. 修正HTML模板中的JavaScript:
<script type="text/javascript">
$(document).ready(function() {
$("#getKammer").on('click', function() {
$.ajax({
url: "http://localhost:8080/getKammer",
method: "GET",
dataType: "json", // 指定期望JSON响应
success: function(data) {
var $dropdown = $("#Kammer");
// 清空现有选项
$dropdown.empty();
// 添加默认选项
$dropdown.append($("<option />").val("").text("请选择"));
// 遍历JSON数组填充下拉菜单
$.each(data, function(index, kammer) {
$dropdown.append(
$("<option />")
.val(kammer.Name) // 使用导出的字段名
.text(kammer.Name + " - " + kammer.Hersteller)
);
});
$("#getKammer").prop('disabled', true);
},
error: function(xhr, status, error) {
console.error("AJAX请求失败:", error);
}
});
});
});
</script>
<!-- 下拉菜单HTML元素 -->
<select id="Kammer" name="Kammer"></select>
<button id="getKammer">加载气候室列表</button>
4. 如果需要直接在模板中渲染(非AJAX方式):
// 修改根路由处理函数
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 传递结构体数组到模板
data := struct {
Kammern []Klimakammer
}{
Kammern: Kammern,
}
if err := tmpl.ExecuteTemplate(w, "Index.html", data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
<!-- 在HTML模板中直接使用 -->
<select id="Kammer" name="Kammer">
{{range .Kammern}}
<option value="{{.Name}}">{{.Name}} - {{.Hersteller}}</option>
{{end}}
</select>
主要修正点:
- 结构体字段首字母大写以导出
- 使用JSON编码器返回结构化数据
- 修正JavaScript中JSON数据的处理
- 调整路由注册顺序(
ListenAndServe应在最后) - 添加错误处理和数据验证

