Golang语言系列-13-常用内置包
常用内置包
net/http包
http请求和响应

http服务端
main.go文件
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
// http server
func f1(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close() //关闭连接
b, err := ioutil.ReadFile("./xx.html")
if err != nil {
w.Write([]byte(fmt.Sprintf("%v", err))) //如果找不到文件,直接把错误返回给浏览器
}
w.Write(b)
}
func f2(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close() //关闭连接
// 获取请求的方式
fmt.Println(r.Method) //GET POST等等
// 请求头
fmt.Println("Header: ", r.Header)
//自己写的客户端访问的请求头
//Header: map[Accept-Encoding:[gzip] Content-Length:[33] Content-Type:[application/json] User-Agent:[Go-http-client/1.1]]
//用浏览器访问的请求头
//Header: map[
// Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8]
// Accept-Encoding:[gzip, deflate, br]
// Accept-Language:[zh-CN,zh;q=0.9]
// Connection:[keep-alive]
// Cookie:[csrftoken=2tO2t7lIF0yq5bQhg7VQRORGmejfFtQhoJv4kSbzrDiExqLSuE5i198y31BzZAnp]
// Upgrade-Insecure-Requests:[1]
// User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4)
// AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36]]
//GET请求
if r.Method == "GET" {
//Get请求,所有的参数都是放在URL上的,请求体中是没有数据的
//发送请求的url http://127.0.0.1:9090/xx/?name=alnk&passwd=123456
url := r.URL
fmt.Println("url: ", url) //url: /xx/?name=alnk&passwd=123456
//获取请求中的参数
//如果请求中一个参数有多个值怎么处理?
queryParam := r.URL.Query()
name := queryParam.Get("name")
passwd := queryParam.Get("passwd")
fmt.Printf("name:%s passwd:%s\n", name, passwd) //name:alnk passwd:123456
//返回数据给客户端
w.Write([]byte("get is ok!\n"))
}
//POST请求 这里也可以使用postman发送请求数据
if r.Method == "POST" {
//获取客户端传过来的表单数据,
//注意如果打开获取表单数据,那么就把获取json数据注释掉,不然可能会出问题
fmt.Printf("name:%s, %T\n", r.FormValue("name"), r.FormValue("name"))
fmt.Printf("name:%s, %T\n", r.FormValue("passwd"), r.FormValue("passwd"))
//获取客户端传过来的json数据
//b, err := ioutil.ReadAll(r.Body)
//if err != nil {
// fmt.Println("读取数据报错了哦", err)
// return
//}
//bToString := string(b) //可以通过内置的json包转换成对应的结构体
//fmt.Printf("%T -- %v\n", bToString, bToString)
//返回数据给客户端
w.Write([]byte("post is ok!"))
}
}
func main() {
http.HandleFunc("/hello/", f1)
http.HandleFunc("/xx/", f2)
http.ListenAndServe("0.0.0.0:9090", nil)
}
浏览器发送GET请求

GET

工具发送POST请求

http模拟浏览器客户端
GET访问
1.参数直接写在Get方法中的URL里
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
/*
客户端
[长连接和短连接]
https://www.zhihu.com/question/22677800
*/
func main() {
//一.GET访问服务端
// 1.参数直接写在Get方法中的URL里
resp, err := http.Get("http://127.0.0.1:9090/xx/?name=alnk&passwd=123456")
if err != nil {
fmt.Printf("get url failed, err:%v\n", err)
return
}
defer resp.Body.Close() //一定要记得关闭resp.Body
// 获取服务端的返回
receByte, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("read from resp.Body failed, err:%v\n", err)
return
}
fmt.Println(string(receByte)) // get is ok!
}
2.拼接参数发送Get请求
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
/*
客户端
[长连接和短连接]
https://www.zhihu.com/question/22677800
*/
func main() {
// 2.拼接参数发送Get请求 这个例子相比于上一个例子是更加灵活的,比如可以自定义请求头等
apiUrl := "http://127.0.0.1:9090/xx/" //URL
// URL参数
data := url.Values{} //可以看源码
data.Set("name", "alnk")
data.Set("passwd", "123")
u, err := url.ParseRequestURI(apiUrl)
if err != nil {
fmt.Printf("parse url requestUrl failed, err:%v\n", err)
return
}
u.RawQuery = data.Encode() //url编码
// 发送请求给服务端
resp, err := http.Get(u.String())
fmt.Printf("u.String(): %s\n", u.String()) //u.String(): http://127.0.0.1:9090/xx/?name=alnk&passwd=123
if err != nil {
fmt.Printf("get 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)
}
fmt.Println(string(b)) //get is ok!
}
POST访问
1.表单数据访问服务端
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
// 客户端
func main() {
// POST访问服务端
url := "http://127.0.0.1:9090/xx/"
// 表单数据
contentType := "application/x-www-form-urlencoded"
data := "name=alnk&passwd=123456"
// 发送post请求
resp, err := http.Post(url, contentType, strings.NewReader(data))
if err != nil {
fmt.Printf("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)
return
}
fmt.Println(string(b)) //post is ok!
}
2.json数据访问服务端
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
// 客户端
func main() {
// POST访问服务端
url := "http://127.0.0.1:9090/xx/"
// json数据
contentType := "application/json"
data := `{"name":"alnk","passwd":"123456"}`
// 发送post请求
resp, err := http.Post(url, contentType, strings.NewReader(data))
if err != nil {
fmt.Printf("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)
return
}
fmt.Println(string(b)) //post is ok!
}
os.Args包
package main
import (
"fmt"
"os"
)
// os.Args
// 简单的获取命令行参数,使用os.Args来获取
// os.Args是一个[]string
// os.Args是一个存储命令行参数的字符串切片,它的第一个元素是执行文件的名称本身
func main() {
for index, arg := range os.Args {
fmt.Printf("args[%d]=%v\n", index, arg)
}
}
# 执行结果
# 需要编译以后执行
lichengguo@lichengguodeMacBook-Pro 02os.Args_demo % go build
lichengguo@lichengguodeMacBook-Pro 02os.Args_demo % ./02os.Args_demo args1 args2
args[0]=./02os.Args_demo
args[1]=args1
args[2]=args2
flag包
package main
import (
"flag"
"fmt"
"time"
)
/*
flag包实现了命令行参数的解析
flag包支持的命令行参数类型有bool、int、int64、uint、uint64、float float64、string、duration(时间)
字符串flag 合法字符串
整数flag 1234、0664、0x1234等类型,也可以是负数。
浮点数flag 合法浮点数
bool类型flag 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。
时间段flag 任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m”。
合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。
*/
func f1() {
// 定义命令行参数方式
var name string
var age int
var married bool
var delay time.Duration
flag.StringVar(&name, "name", "张三", "姓名") //变量指针,参数名称,默认值,help提示语
flag.IntVar(&age, "age", 0, "年龄")
flag.BoolVar(&married, "married", false, "婚否")
flag.DurationVar(&delay, "delay", 0, "结婚多少时间了")
// 解析命令行参数
flag.Parse()
//
fmt.Println(name, age, married, delay)
// 返回命令行参数后的其他参数
fmt.Println(flag.Args()) //[]string 类型
// 返回命令行参数后的其他参数个数
fmt.Println(flag.NArg())
// 返回使用的命令行参数的个数
fmt.Println(flag.NFlag())
}
func main() {
f1()
}
/*
使用方法
提示
% ./03flag_demo -help
Usage of ./02flag_demo:
-age int
年龄 (default 18)
-delay duration
延迟时间间隔
-married
婚否
-name string
姓名 (default "张三")
默认值
% ./03flag_demo
张三 18 false 0s
[]
0
0
正常使用命令行参数
./02flag_demo -name 沙河娜扎 --age 28 -married=false -delay=1h30m
沙河娜扎 28 false 1h30m0s
[]
0
4
% ./02flag_demo -name 沙河娜扎 --age 28 -married=false -delay=1h30m a b c
沙河娜扎 28 false 1h30m0s
[a b c] flag.Args()
3 flag.NArg()
4 flag.NFlag()
*/
Golang语言系列-13-常用内置包的更多相关文章
- Go语言内置包之strconv
文章引用自 Go语言内置包之strconv Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换. strconv包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下 ...
- PYTHON语言之常用内置函数
一 写在开头本文列举了一些常用的python内置函数.完整详细的python内置函数列表请参见python文档的Built-in Functions章节. 二 python常用内置函数请注意,有关内置 ...
- 前端JavaScript(2) --常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍
昨日内容回顾 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...
- Golang语言系列-10-包
包 自定义包 package _0calc import ( "fmt" ) /* [Go语言的包] 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基 ...
- Golang语言系列-01-Go语言简介和变量
Go语言简介 Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pi ...
- python 全栈开发,Day51(常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍)
昨日内容回顾 1.三种引入方式 1.行内js <div onclick = 'add(3,4)'></div> //声明一个函数 function add(a,b){ } 2. ...
- JMeter之BeanShell常用内置对象
一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...
- JavaScript常用内置对象(window、document、form对象)
由于刚开始学习B/S编程,下面对各种脚本语言有一个宏观的简单认识. 脚本语言(JavaScript,Vbscript,JScript等)介于HTML和C,C++,Java,C#等编程语言之间.它的优势 ...
- ASP.NET常用内置对象
ASP.NET 常用内置对象:Response对象.Request对象.Session对象.Server对象.Application对象 1.Response对象: (1) 用于向浏览器输出信息 常用 ...
随机推荐
- UI自动化学习笔记- UnitTest单元测试框架详解
一.UnitTest基本使用 1. UnitTest框架 1.1 什么是框架 说明: 框架英文单词frame 为解决一类事情的功能集合 1.2什么是UnitTest框架 概念:UnitTest是pyt ...
- PHP观察者模式 (转)
观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新. 场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻 ...
- Python实现 利用朴素贝叶斯模型(NBC)进行问句意图分类
目录 朴素贝叶斯分类(NBC) 程序简介 分类流程 字典(dict)构造:用于jieba分词和槽值替换 数据集构建 代码分析 另外:点击右下角魔法阵上的[显示目录],可以导航~~ 朴素贝叶斯分类(NB ...
- Requests方法 -- 参数关联
一.删除草稿箱1.参数这篇https://www.cnblogs.com/Teachertao/p/11144726.html 2.删除刚才保存的草稿 3.用 fiddler 抓包,抓到删除帖子的请求 ...
- PAT乙级:1084 外观数列 (20分)
PAT乙级:1084 外观数列 (20分) 题干 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d ...
- php使用curl模拟post请求
废话不多说,直接上代码,做个笔记. $url="http://localhost/header_server.php"; $body = array("mobile&qu ...
- 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题
转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...
- C++第三十五篇 -- 写第一个驱动开发程序
VS2017+WDK+VMware12+Win10环境配置完毕,接下来写第一个驱动程序. 1.新建一个KMDF的程序. 2.配置项目属性. 3.编译项目.一般这里应该成功,我一台电脑成功了,另一台电脑 ...
- eladmin-plus V2.0.0 发布,单表链式调用更丝滑
一.项目简介 eladmin的mybatis-plus版本,单表使用链式调用,代码更简洁,调用更便捷.目前更新到2021年7月.项目基于 Spring Boot 2.4.2 . Mybatis-plu ...
- 构建前端第12篇之---在Vue中对组件,变量,函数的全局引入
张燕涛写于2020-01-16 星期two 本篇还是源于import和export的使用,昨天看es6入门 和MDN文档,大体上用法了解了,但今天看ElementUI源码的时候,看到 //src/in ...