ninja_ken  

你在使用docker命令时,是不是曾碰到过{{.XXX}}类似的写法?比如菜鸟教程网站(https://www.runoob.com/docker/docker-inspect-command.html)上的这个docker inspect命令

runoob@runoob:~$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mymysql
172.17.0.3

这个写法是由Golang的标准库template提供,这个库比较特别,因为template就像是一个“脚本语言解析器”,其中涉及到变量赋值、函数/方法调用和各种条件/循环控制结构等。在这里简单记录下练习时的一些示例,供大家参考

package main

import (
	"os"
	"text/template"
)

type Test struct {
	Name string
}

func (Test) SayHello(words string) string {
	return "Hello " + words
}

func main() {
	tmpl := template.New("argument practice")
	var t = Test{"Someone"}
	var m = map[string]int{
		"A":     1,
		"AA":    2,
		"AAAAA": 5,
	}
	// boolean value, float value and map
	tmpl = template.Must(tmpl.Parse("{{false}},{{1.23}},{{.AA}}\n"))
	panicIfNonNill(tmpl.Execute(os.Stdout, m))

	// Method
	tmpl = template.Must(tmpl.Parse(`{{.SayHello "there\n"}}`))
	panicIfNonNill(tmpl.Execute(os.Stdout, t))

	// function
	var funcMap = template.FuncMap{
		"sayHi": sayHi,
	}
	tmpl.Funcs(funcMap)
	tmpl = template.Must(tmpl.Parse(`{{sayHi}}`))
	panicIfNonNill(tmpl.Execute(os.Stdout, nil))

	// variables
	tmpl = template.Must(tmpl.Parse(`{{$a := "mate\n"}}{{$a}}`))
	panicIfNonNill(tmpl.Execute(os.Stdout, nil))

	// pipeline
	tmpl = template.Must(tmpl.Parse(`{{range $key, $val := .}}{{println $key $val}}{{end}}`))
	panicIfNonNill(tmpl.Execute(os.Stdout, map[string]bool{"1": true, "2": false}))

}

func panicIfNonNill(err error) {
	if err != nil {
		panic(err.Error())
	}
}

func sayHi() string {
	return "sayHi, my friend\n"
}

posted on 2022-07-12 21:07  ninja_ken  阅读(653)  评论(0编辑  收藏  举报