首页 > 其他分享 >go语言学习-标准库template和http

go语言学习-标准库template和http

时间:2023-03-20 22:32:17浏览次数:49  
标签:pipeline http nil err fmt template go 模板

template

html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/template包。

模板示例

通过将模板应用于一个数据结构(即该数据结构作为模板的参数)来执行,来获得输出。模板中的注释引用数据接口的元素(一般如结构体的字段或者字典的键)来控制执行过程和获取需要呈现的值。模板执行时会遍历结构并将指针表示为’.‘(称之为”dot”)指向运行过程中数据结构的当前位置的值。

用作模板的输入文本必须是utf-8编码的文本。”Action”—数据运算和控制单位—由”{{“和”}}“界定;在Action之外的所有文本都不做修改的拷贝到输出中。Action内部不能有换行,但注释可以有换行。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello</title>
</head>
<body>
<p>Hello {{.}}</p>
</body>
</html>

go语言学习-标准库template和http_Go

服务端渲染模板

package main

import (
"fmt"
"html/template"
"net/http"
)

func sayHello(w http.ResponseWriter, r *http.Request) {
// 解析指定文件生成模板对象
tmpl, err := template.ParseFiles("./demo.html")
if err != nil {
fmt.Println("create template failed, err:", err)
return
}
// 利用给定数据渲染模板,并将结果写入w
tmpl.Execute(w, "羊草")
}
func main() {
//指定路由
http.HandleFunc("/", sayHello)
//监听服务
err := http.ListenAndServe(":9080", nil)
if err != nil {
fmt.Println("HTTP server failed,err:", err)
return
}
}

运行结果如下:

go语言学习-标准库template和http_html_02


模板语法

模板语法都包含在{{和}}​中间,其中{{.}}中的点表示当前对象。

当我们传入一个结构体对象时,我们可以根据.来访问结构体的对应字段

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello</title>
</head>
<body>
<p>Hello {{.Name}}</p>
<p>性别:{{.Gender}}</p>
<p>年龄:{{.Name}}</p>
</body>
</html>

go语言学习-标准库template和http_数据_03

package main

import (
"fmt"
"html/template"
"net/http"
)

//结构体渲染模板
type UserInfo struct {
Name string
Gender string
Age int
}

func SayHello(w http.ResponseWriter, r *http.Request) {
//解析指定文件生成模板对象
templ, err := template.ParseFiles("demo.html")
if err != nil {
fmt.Println("create failed ,err:", err)
return
}
//利用给定数据渲染模板,并将结果写入w
user := UserInfo{
Name: "羊草",
Gender: "男",
Age: 18,
}
templ.Execute(w, user)

}

func main() {
//指定路由
http.HandleFunc("/", SayHello)
//监听服务
err := http.ListenAndServe(":9080", nil)
if err != nil {
fmt.Println("HTTP server failed,err:", err)
return
}
}

go语言学习-标准库template和http_Go_04


注释

{{/* a comment */}}
注释,执行时会忽略。可以多行。注释不能嵌套,并且必须紧贴分界符始止。

pipeline

pipeline是指产生数据的操作。比如{{.}}、{{.Name}}等。Go的模板语法中支持使用管道符号|链接多个命令,用法和unix下的管道类似:|前面的命令会将运算结果(或返回值)传递给后一个命令的最后一个位置。

注意 : 并不是只有使用了|才是pipeline。Go的模板语法中,pipeline的概念是传递数据,只要能产生数据的,都是pipeline。

变量

Action里可以初始化一个变量来捕获管道的执行结果。初始化语法如下:

$variable := pipeline

其中$variable是变量的名字。声明变量的action不会产生任何输出。

条件判断

Go模板语法中的条件判断有以下几种:

{{if pipeline}} T1 {{end}}

{{if pipeline}} T1 {{else}} T0 {{end}}

{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}

range

Go的模板语法中使用range关键字进行遍历,有以下两种写法,其中pipeline的值必须是数组、切片、字典或者通道。

{{range pipeline}} T1 {{end}}
如果pipeline的值其长度为0,不会有任何输出

{{range pipeline}} T1 {{else}} T0 {{end}}
如果pipeline的值其长度为0,则会执行T0。

with

{{with pipeline}} T1 {{end}}
如果pipeline为empty不产生输出,否则将dot设为pipeline的值并执行T1。不修改外面的dot。

{{with pipeline}} T1 {{else}} T0 {{end}}
如果pipeline为empty,不改变dot并执行T0,否则dot设为pipeline的值并执行T1。

预定义函数

执行模板时,函数从两个函数字典中查找:首先是模板函数字典,然后是全局函数字典。一般不在模板内定义函数,而是使用Funcs方法添加函数到模板里。

预定义的全局函数如下:

and
函数返回它的第一个empty参数或者最后一个参数;
就是说"and x y"等价于"if x then y else x";所有参数都会执行;
or
返回第一个非empty参数或者最后一个参数;
亦即"or x y"等价于"if x then x else y";所有参数都会执行;
not
返回它的单个参数的布尔值的否定
len
返回它的参数的整数类型长度
index
执行结果为第一个参数以剩下的参数为索引/键指向的值;
如"index x 1 2 3"返回x[1][2][3]的值;每个被索引的主体必须是数组、切片或者字典。
print
即fmt.Sprint
printf
即fmt.Sprintf
println
即fmt.Sprintln
html
返回其参数文本表示的HTML逸码等价表示。
urlquery
返回其参数文本表示的可嵌入URL查询的逸码等价表示。
js
返回其参数文本表示的JavaScript逸码等价表示。
call
执行结果是调用第一个参数的返回值,该参数必须是函数类型,其余参数作为调用该函数的参数;
如"call .X.Y 1 2"等价于go语言里的dot.X.Y(1, 2);
其中Y是函数类型的字段或者字典的值,或者其他类似情况;
call的第一个参数的执行结果必须是函数类型的值(和预定义函数如print明显不同);
该函数类型值必须有1到2个返回值,如果有2个则后一个必须是error接口类型;
如果有2个返回值的方法返回的error非nil,模板执行会中断并返回给调用模板执行者该错误;

比较函数

布尔函数会将任何类型的零值视为假,其余视为真。

下面是定义为函数的二元比较运算的集合:

eq      如果arg1 == arg2则返回真
ne 如果arg1 != arg2则返回真
lt 如果arg1 < arg2则返回真
le 如果arg1 <= arg2则返回真
gt 如果arg1 > arg2则返回真
ge 如果arg1 >= arg2则返回真

http

GET

GET请求,使用net/http包编写一个简单的发送HTTP请求的Client端。

package main

import (
"fmt"
"io/ioutil"
"net/http"
)

func main() {
resp, err := http.Get("http://www.baidu.com")
if err != nil {
fmt.Println("get failed, err:", err)
return
}
//延迟关闭
defer resp.Body.Close()
//读取respon的body数据
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("read from resp.Body failed,err:", err)
return
}
fmt.Print(string(body))
}

带参数的GET请求

GET请求的参数需要使用Go语言内置的net/url这个标准库来处理。

func main() {
apiUrl := "http://127.0.0.1:9090/get"
// URL param
data := url.Values{}
data.Set("name", "羊草")
data.Set("age", "18")
u, err := url.ParseRequestURI(apiUrl)
if err != nil {
fmt.Printf("parse url requestUrl failed,err:%v\n", err)
}
u.RawQuery = data.Encode() // URL encode
fmt.Println(u.String())
resp, err := http.Get(u.String())
if err != nil {
fmt.Println("post failed, err:%v\n", err)
return
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("get resp failed,err:%v\n", err)
return
}
fmt.Println(string(b))
}


发送post请求

func main() {
url := "http://127.0.0.1:9090/post"
// 表单数据
//contentType := "application/x-www-form-urlencoded"
//data := "name=羊草&age=18"
// json
contentType := "application/json"
data := `{"name":"羊草","age":18}`
resp, err := http.Post(url, contentType, strings.NewReader(data))
if err != nil {
fmt.Println("post failed, err:%v\n", err)
return
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("get resp failed,err:%v\n", err)
return
}
fmt.Println(string(b))
}

标签:pipeline,http,nil,err,fmt,template,go,模板
From: https://blog.51cto.com/u_11555417/6138660

相关文章

  • 深入理解Go语言中的sync.Cond
    1.简介本文将介绍Go语言中的sync.Cond并发原语,包括sync.Cond的基本使用方法、实现原理、使用注意事项以及常见的使用使用场景。能够更好地理解和应用Cond来实现g......
  • 获得HibernateTemplate的方法
    [b]通过注解注入方式[/b]1.在applicationContext.xml定义<!--启动注解--><context:component-scanbase-package="com.service.impl"/><beanid=......
  • Spring Http Invoker使用简介
    [color=red]SpringHTTPinvoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用(意味着可以通过防火墙),并使用java的序列化机制在网络间传递对象。这需要在......
  • zbus logo消息队列、服务总线 zbus
    轻量级服务总线/消息队列1)多种消息模式--支持生产者/消费者,发布订阅,RPC2)丰富的API--C/C++/C#/JAVA/Python/Node.JS跨平台、多语言支持3)开放协议标准--原生兼容HTTP协议(长......
  • springmvc中获得HttpServletRequest request方法
    在web。xml中配置一个监听<listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>......
  • Go语言:利用 TDD 测试驱动开发帮助理解数组与动态数组(切片)的区别
    ArrayVSSlice数组允许你以特定的顺序在变量中存储相同类型的多个元素。对于数组来说,最常见的就是迭代数组中的元素。我们创建一个Sum函数,它使......
  • golang导出docker镜像
    1.下载镜像//downloadDockerImageimageTagName:="k8s.gcr.io/etcd:3.5.0-0"funcdownloadDockerImage(imageTagNamestring)(string,error){//要执行的命......
  • B. Make Array Good【二进制构造】
    B.MakeArrayGoodhttps://codeforces.com/problemset/problem/1762/B思路将不是\(2^n(n>0)\)的数构造成最小的一个大于\(a[i]\)的\(2^n\),证明:\[a[i]_{new}=2^......
  • golang面试题单向链表和双向链表
    甲流难受中,简单发一个链表 1.单项列表packagemainimport( "fmt" "strconv")typeNodestruct{ valueint next*Node}typeLinkliststruct{ leni......
  • HTTP 方法与GET 和 POST 方法的对比
    HTTP方法与GET 1.常用的HTTP方法浏览器发送请求时采用的方法,和响应无关GET、POST、PUT、DELETE用来定义对于资源才去......