上篇已经学习了HTTP概述、HTTP协议客户端实现、HTTP协议服务端实现的知识(14天搞定Go语言,从0到1保姆级教程(第十天)Go语言网络编程-HTTP概述、HTTP协议客户端实现、HTTP协议服务端实现),本篇将开始Golang模板、JSON编码和JSON解析的学习。
Golang模板、JSON编码、JSON解析
学习目标
(1)能够掌握Golang模板
(2)能够掌握JSON编码
(3)能够掌握JSON解析
Golang模板
Ø 模板的概念
模板就是在写动态页面时不变的部分,服务端程序渲染可变部分生成动态网页,Go语言提供了html/template包来支持模板渲染。Go提供的html/template包对HTML模板提供了丰富的模板语言。主要用于Web应用程序。
Ø 基本语法
1、 变量
模板中的变量通过{{.}}来访问。其中{{.}}称为管道和root。在模板文件内,{{.}}代表当前变量,即在非循环体内,{{.}}就代表传入的那个变量。模板中使用{{/* comment */}}来进行注释。
Golang渲染template的时候,可以在模板文件中读取变量内的值并渲染到模板里。有两个常用的传入类型。一是struct,在模板内可以读取该struct的内容。二是map[string]interface{},在模板内可以使用key来进行渲染。
假设定义了一个结构体,如下所示。
在模板内获取数据的方式如下所示。
假如在程序中是这样给User对象赋值的。
那么对应渲染后的模板内容如下所示。
假设定义了一个map,如下所示。
在模板内获取数据的方式如下所示。
模板中还可以定义变量,给变量初始化后,就可以在该模板文件中调用。如下所示。
这样就可以在页面上显示"StevenWang"。
2、 逻辑判断
Golang的模板支持if条件判断,当前支持最简单的bool类型和string类型,定义如下所示。
当.condition是bool类型时,值为true表示执行。当.condition是string类型时,值非空则表示执行。也支持if else if嵌套。定义如下所示。
Golang的模板提供了一些内置的模板函数来执行逻辑判断,下面列举目前常用的一些内置模板函数。如表所示。
函数语法 | 函数作用 |
{{if not .condition}}{{end}} | not 非 |
{{if and .condition1 .condition2}}{{end}} | and 与 |
{{if or .condition1 .condition2}}{{end}} | or 或 |
{{if eq .var1 .var2}}{{end}} | eq 等于 |
{{if ne .var1 .var2}}{{end}} | ne 不等于 |
{{if lt .var1 .var2}}{{end}} | lt 小于 |
{{if le .var1 .var2}}{{end}} | le 小于等于 |
{{if gt .var1 .var2}}{{end}} | gt 大于 |
{{if ge .var1 .var2}}{{end}} | ge 大于等于 |
假设在go文件中定义了一个map,如下所示。
然后在模板文件中进行逻辑判断,如下所示。
最后页面会输出:“Err:账号名称不一致”
3、 循环遍历
Golang的template支持range循环来遍历map、slice中的内容,语法格式如下所示。
在这个range循环内,遍历数据通过$index和$value。还有一种遍历方式,语法格式如下所示。
这种方式无法访问到$index和$key的值,需要通过{{.}}来访问对应的$value。那么在这样情况下,在循环体内,外部变量需要使用{{$.}}来访问。
模板文件的代码如下所示。
4、 模板嵌套
在编写模板的时候,经常需要将公用的模板进行整合,比如每一个页面都有导航栏和页脚,通常的做法是将其编写为一个单独的模块,让所有的页面进行导入,这样就不用重复的编写了。
任何网页都有一个主模板,然后可以在主模板内嵌入子模板来实现模块共享。当模板想要引入子模板的时候,通常使用的语句如下所示。
JSON编码
Ø JSON简介
(JavaScript Object Notation,JavaScript对象表示法)JSON是一种轻量级的数据交换格式,因简单、可读性强广泛使用。
1.JSON语法规则
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。与C或者Java的字符串非常相似。
1. JSON的优点
l 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小。
l 易于客户端的解析, JavaScript可以简单的进行JSON数据的读取。
l 支持当前主流的所有编程语言,便于服务器端的解析。
2. Go的标准包encoding/json对JSON的支持。
JSON编码即将Go数据类型转换为JSON字符串。用到的函数如下所示。
该函数递归遍历v的结构,生成对应的JSON。
Ø map转JSON
下面通过一个案例实现map转JSON,参见。
大家可以看到Marshal()函数返回的JSON字符串是没有空白字符和缩进的,这种紧凑的表示形式是最常用的传输形式,但是不好阅读。如果需要为前端生成便于阅读的格式,可以调json.MarshaIndent,该函数有两个参数表示每一行的前缀和缩进方式,具体参见。
Ø 结构体转JSON
结构体转换成JSON在开发中经常会被用到。json包是通过反射机制来实现编解码的,因此结构体必须导出所转换的字段,没有导出的字段不会被json包解析,具体参见。
Ø 结构体字段标签
json包在解析结构体时,如果遇到key为JSON的字段标签,则会按照一定规则解析该标签:第一个出现的是字段在JSON串中使用的名字,之后为其他选项,例如omitempty指定空值字段不出现在JSON中。如果整个value为"-",则不解析该字段。将例10-10中的结构体改为,具体参见。
Ø 匿名字段
json包在解析匿名字段时,会将匿名字段的字段当成该结构体的字段处理,具体使用方式参见。
Ø 注意事项
Marshal函数只有在转换成功的时候才会返回数据,在转换的过程中需要注意如下几点。
l JSON对象只支持string作为key,所以要编码一个map,必须是map[string]T这种类型(T是Go语言中任意的类型)。
l Channel, complex和function是不能被编码成JSON的。
l 指针在编码的时候会输出指针指向的内容,而空指针会输出null。
Ø JSON解析
JSON解析就是将JSON转换为Go数据类型。
用到的函数声明如下所示。
此函数将data表示的JSON转换为v。
Ø JSON转切片
下面通过一个小案例演示json转切片,参见。
在解码过程中,json包会将JSON类型转换为Go类型,转换规则如下所示。
Ø JSON转结构体
JSON可以转换成结构体。同编码一样,json包是通过反射机制来实现解码的,因此结构体必须导出所转换的字段,不导出的字段不会被json包解析,另外解析时不区分大小写,参见。
Ø 结构体字段标签
解码时依然支持结构体字段标签,规则和编码时一样,参见。
Ø 匿名字段
编码时,和解码类似,在解码JSON时,如果找不到字段,则查找字段的字段,参见。
Go语言网络编程知识点总结
https://www.zhihu.com/video/1555129419592806400介绍了Go语言网络编程相关知识,作为一门诞生于网络时代的语言,Go内置了丰富的用于网络编程的标准库。无论是处理HTTP 请求或响应,还是开发网站或Web服务器,Go语言都让问题变得更加简单,可以让开发者用少量的代码做更多的事情。
PS:梳理了Go语言网络编程的笔记和视频教程,若有不懂或者想要全部笔记的可私信交流哦~