如何在Go的text/template中区分map的缺失值与0?
解决Go模板中区分map键不存在与值为0的问题
你遇到的问题根源在于:当用index访问map里不存在的键时,它会返回对应类型的零值(int类型的零值是0),而with动作会把零值判定为“假”,所以值为0和键不存在的情况都会走到else分支显示“n/a”。
要只在键不存在时显示“n/a”,可以用模板的变量赋值语法,同时获取值和键的存在状态:
package main import ( "os" "text/template" ) func main() { // 定义模板,用变量同时获取值和存在标志 tmpl := template.Must(template.New("mapDisplay").Parse(` {{range $key := .CheckKeys}} 键{{$key}}对应的取值:{{$val, $ok := index $.MyMap $key}}{{if $ok}}{{$val}}{{else}}n/a{{end}} {{end}} `)) // 测试数据:包含值为0的键,以及不存在的键 data := map[string]interface{}{ "MyMap": map[string]int{"apple": 0, "banana": 50, "orange": 20}, "CheckKeys": []string{"apple", "banana", "grape"}, } // 执行模板 tmpl.Execute(os.Stdout, data) }
这段代码的关键是{{$val, $ok := index $.MyMap $key}}:当index作用于map时,会返回两个结果——对应键的值,以及一个布尔值$ok(键存在时为true,不存在为false)。之后通过判断$ok的真假,就能精准区分“值为0但键存在”和“键不存在”的情况。
如果允许修改原有数据结构,也可以把map[string]int改成map[string]*int:此时不存在的键会返回nil,而值为0的键会返回指向0的指针。这种情况下原有的with写法就能生效,因为with会把nil判定为假,而指针(即使指向0)会被判定为真。不过这种方法需要调整你的数据初始化和使用逻辑,适合能改动数据结构的场景。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

