这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔
Go数据类型
-
指针类型
指针的使用我感觉还是和C语言有点像 // 准备一个字符串类型
var house = "Malibu Point 10880, 90265"
// 对字符串取地址, ptr类型为*string
ptr := &house
// 打印ptr的类型
fmt.Printf("ptr type: %T\n", ptr)// 打印ptr的指针地址
fmt.Printf("address: %p\n", ptr) -
Go数组
var a [3]int
q := [3]int{1, 2, 3}- 数组遍历
for k, v := range q{
fmt.Println(k, v)
}
- make() 函数构造切片
如果需要动态地创建一个切片,可以使用 make() 内建函数,格式如下:
make([]Type, size, cap )
cap是 的内部存储空间已经分配了的数量,但实际使用的是size数量。
Go复合数据类型
Map
Go中的map是哈希表的引用,他的顺序是随机,如果你要顺序取出,就要自己用sort包就排序
Map可以写成map[K]V,map中的Key必须是一个同一个类型,value也是,key和value可以是不一样
- map使用
ages := make(map[string]int)
ages := map[string]int{
"alice": 31,
"charlie": 34,
}
删除
delete(ages, "alice") /
文本和HTML模板
当printf输出的格式相对复杂的时候,这些功能是由text/template和html/template等模板包提供的,它们提供了一个将变量值填充到一个文本或HTML格式的模板的机制。
目前我理解的是Go语言内置了 text/template 和 html/template两个模板库,专门用于处理网页html模板。html/template 是在 text/template 模板库的基础上增加了对html输出的安全处理,主要目的是为了防止被攻击。
- 设置一个模板文件.tpl 例如下面模版代码保存至views/demo.tpl
{{define "demo"}} define "模板名" 用于定义子模板,后面渲染模板会用到这个名字。
昵称: {{.Name}}, //表示引用模板中的参数
//如果是string ,int ,float时可以直接{{.}}来使用
//Map中{{.里面的参数项}}
{{- if .IsWin}}
恭喜,大吉大利,今晚吃鸡!
{{- else}} 遗憾,鸡被吃光了!
{{- end}}
{{- end}}
2.导入包
import "text/template"
.3.加载模版代码 加载模版代码,并且创建template对象t template.ParseGlob 函数加载views目录下的所有tpl为后缀的模版文件 template.Must函数主要用于检测加载的模版有没有错误,有错误输出panic错误,并且结束程序。
t := template.Must(template.ParseGlob("./views/*.tpl"))
4.根据模版参数渲染模版 定义模版参数:
//这里定义一个struct类型的模版参数,实际上模版可以是任意类型数据
type GameStatus struct {
Name string
IsWin bool
}
tpl模板文件只能传入一个模版参数,如果想传入多个模版参数,可以使用map或者struct类型。 初始化模板参数, 这里初始化一个参数数组,下面用于循环渲染模板。
var userStatus = []GameStatus{
{"大春", true},
{"NiuBee", false},
{"球球", true},
}
下面是根据userStatus 数组循环渲染模板
for _, u := range userStatus {
//根据参数u, 渲染命名为demo的模板,并且将渲染结果打印到标准输出
err := t.ExecuteTemplate(os.Stdout, "demo", u)
if err != nil {
log.Println("executing template:", err)
}
}
输出结果:
昵称: 大春,
恭喜,大吉大利,今晚吃鸡!
昵称: NiuBee,
遗憾,鸡被吃光了!
昵称: 球球,
恭喜,大吉大利,今晚吃鸡!