Go语言(十二)web编程
时间:2022-07-25
本文章向大家介绍Go语言(十二)web编程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
web编程
web编程基础
web的工作方式
http协议介绍
- http请求体
- http响应体
Web程序开发
- 基于“net/http”封装的web服务相关的功能
- 使用简单
func sayhelloName(w http.ResponseWriter,r *http.Request) {
r.ParseForm() //参数解析
fmt.Printf("r.Form:%vn",r.Form)
fmt.Printf("Path:%vn",r.URL.Path)
fmt.Printf("Schema:%vn",r.URL.Scheme)
fmt.Printf("r.Form[url_long]:%vn",r.Form["url_long"])
for k,v := range r.Form{
fmt.Printf("key=%vn",k)
fmt.Printf("val=%vn",strings.Join(v,""))
}
fmt.Fprintf(w,"hello")
}
func main() {
http.HandleFunc("/",sayhelloName)
err := http.ListenAndServe(":9090",nil)
if err != nil {
log.Fatal("ListenAndServer:",err)
}
}
golang web服务工作方式
表单提交
- 通过
<form></form>
扩起来的区域,允许用户提交数据 - 用户登录验证小例子
- login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="/login" method="POST">
<div>
<span>用户名:</span>
<input type="text" name="username">
</div>
<div>
<span>密码:</span>
<input type="text" name="password">
</div>
<div>
<input type="submit" value="登录">
</div>
</form>
</body>
</html>
- AuthFunc.go
func loginFunc(w http.ResponseWriter,r *http.Request) {
if r.Method == "GET" {
data,err := ioutil.ReadFile("./login.html")
if err != nil {
http.Redirect(w,r,"/404.html",http.StatusNotFound)
fmt.Errorf("read file faild:err:%vn",err)
return
}
w.Write(data)
}else if r.Method == "POST" {
r.ParseForm()
username := r.FormValue("username")
password := r.FormValue("password")
if username == "admin" && password == "admin" {
fmt.Fprintf(w,"login success")
}else {
fmt.Fprintf(w,"username or password error")
}
}
}
func main() {
http.HandleFunc("/login",loginFunc)
err := http.ListenAndServe(":9090",nil)
if err != nil {
log.Fatal("ListenAndServer:",err)
}
}
模板介绍与使用
模板替换
-
{{}}
来包含需要在渲染时被替换的字段,{{.}}
表示当前对象
通过{{.FieldName}}
来访问对象的属性
- demo.go
var (
t *template.Template
)
type User struct {
Name string
Age int
}
func initTemplate() (err error){
//加载模板
t, err = template.ParseFiles("./index.html")
if err != nil {
fmt.Println("parse file error:",err)
return
}
return
}
func handleUserInfo(w http.ResponseWriter,r *http.Request) {
var user User = User{
Name: "wanghui",
Age: 20,
}
t.Execute(w,user)
}
func main() {
err := initTemplate()
if err != nil {
return
}
http.HandleFunc("/user/info",handleUserInfo)
err = http.ListenAndServe(":9090",nil)
if err != nil {
fmt.Errorf("http start error %vn",err)
return
}
}
- index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="/login" method="POST">
<div>
<span>用户名:{{ .Name }}</span>
</div>
<div>
<span>年龄:{{ .Age }}</span>
</div>
</form>
</body>
</html>
if判断
- index.html
<div>
<span>用户名:{{ .Name }}</span>
</div>
<div>
<span>年龄:{{ .Age }}</span>
</div>
<div>
{{ if gt .Age 18 }}
<p>Hello old man</p>
{{ else }}
<p>hello young man</p>
{{ end }}
</div>
with用法
为了简化结构体嵌套的问题
- index.html
<body>
<form action="/login" method="POST">
<div>
<span>用户名:{{ .Name }}</span>
</div>
<div>
<span>年龄:{{ .Age }}</span>
</div>
{{with .Address}}
<div>
<span>省:{{.Province}}</span>
</div>
<div>
<span>城市:{{.City}}</span>
</div>
<div>
<span>邮编:{{.Code}}</span>
</div>
{{end}}
</form>
</body>
- server.go
var (
t *template.Template
)
type Address struct {
Province string
City string
Code string
}
type User struct {
Name string
Age int
Address Address
}
func initTemplate() (err error){
//加载模板
t, err = template.ParseFiles("./index.html")
if err != nil {
fmt.Println("parse file error:",err)
return
}
return
}
func handleUserInfo(w http.ResponseWriter,r *http.Request) {
var user User = User{
Name: "wanghui",
Age: 20,
Address:Address{
Province: "gansu",
City: "zhangye",
Code: "734000",
},
}
t.Execute(w,user)
}
func main() {
err := initTemplate()
if err != nil {
return
}
http.HandleFunc("/user/info",handleUserInfo)
err = http.ListenAndServe(":9090",nil)
if err != nil {
fmt.Errorf("http start error %vn",err)
return
}
}
range循环语法
- index.html
<body>
<form action="/login" method="POST">
{{range .}}
<div>
<span>用户名:{{ .Name }}</span>
</div>
<div>
<span>年龄:{{ .Age }}</span>
</div>
{{with .Address}}
<div>
<span>省:{{.Province}}</span>
</div>
<div>
<span>城市:{{.City}}</span>
</div>
<div>
<span>邮编:{{.Code}}</span>
</div>
<hr>
{{end}}
{{end}}
</form>
</body>
- server.go
package main
import (
"fmt"
"html/template"
"net/http"
)
var (
t *template.Template
)
type Address struct {
Province string
City string
Code string
}
type User struct {
Name string
Age int
Address Address
}
func initTemplate() (err error) {
//加载模板
t, err = template.ParseFiles("./index.html")
if err != nil {
fmt.Println("parse file error:", err)
return
}
return
}
func handleUserInfo(w http.ResponseWriter, r *http.Request) {
var users []*User
for i := 0; i < 15; i++ {
var user User = User{
Name: "wanghui",
Age: 20,
Address: Address{
Province: "gansu",
City: "zhangye",
Code: "734000",
},
}
users = append(users,&user)
}
t.Execute(w, users)
}
func main() {
err := initTemplate()
if err != nil {
return
}
http.HandleFunc("/user/info", handleUserInfo)
err = http.ListenAndServe(":9090", nil)
if err != nil {
fmt.Errorf("http start error %vn", err)
return
}
}
- 因为超算云,你将比别人早10年“抵达”未来
- 网页加速特技之 AMP
- 刷屏的背后:原来腾讯字体是CDC和Monotype联手打造的
- 重磅!腾讯与科大讯飞技术共创,Google ProtoBuf进入TARS家族!
- 一个简易版的T4代码生成"框架"
- yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[上篇]
- 以上下文(Context)的形式创建一个共享数据的容器
- yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[下篇]
- ASP.NET MVC下的四种验证编程方式
- 总体介绍ASP.NET Web API下Controller的激活与释放流程
- 如何让ASP.NET Web API的Action方法在希望的Culture下执行
- ASP.NET Web API标准的“管道式”设计
- ASP.NET Web API路由系统:Web Host下的URL路由
- ASP.NET Web API路由系统:路由系统的几个核心类型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 字符集其实很简单
- kubernetes(二十)SpringCloud微服务容器化迁移
- HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
- kubernetes(七) 二进制部署k8s(1.18.4版本)
- Java并发编程(7)- 线程调度 - 线程池
- Java并发编程(6)- J.U.C组件拓展
- Java并发编程(5)- J.U.C之AQS及其相关组件详解
- Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。
- Java并发编程(4)- 线程安全策略
- Java并发编程(3)- 如何安全发布对象
- Python 技术篇-3行代码实现语音朗读,pywin32库实现语音朗读
- Java并发编程(2)- 线程安全性详解
- Python 技术篇-1行代码实现语音识别,speech库快速实现简单的语音对话
- linux和windows互传文件,用户配置文件和密码配置文件,用户组和用户管理
- 除Innodb和MyISAM外MySQL还有哪些存储引擎