上篇已经学习了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语言网络编程的笔记和视频教程若有不懂或者想要全部笔记的可私信交流哦~