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) 用于向浏览器输出信息 常用 ...
随机推荐
- Linux:Linux安装配置JDK1.8
1 在/usr/local 文件夹下新建一个文件夹software ,将JDK放到此文件夹中 并在此文件夹下解压执行命令 tar zxvf jdk-8u144-linux-x64.tar. ...
- php自动识别背景并且把它改为白色
此源码有个阈值可以自己调节,精确度等自测 <?php /*$Colorimg = new Colorimg(); $image=$Colorimg->IMGaction("G:/ ...
- bugku Crypto 下半部分wp
1. 百度托马斯这个人居然还发明了一种轮转的加密法,发现原理是,他将很多行乱序的26个字母,插到一根柱子上,参考糖葫芦的样子,可以旋转每一行,设置自己要发送的明文后,向对方发送乱码的一列,对方只要将这 ...
- nmon工具安装及nmon analyser的使用
步骤一:下载nmon及nmon analyser工具 nmon:http://nmon.sourceforge.net/pmwiki.php 根据自己系统的版本下载相应的版本即可 nmon analy ...
- 如何处理RabbitMQ 消息堆积和消息丢失问题
消息堆积 解决方案: 增加消费者或后台相关组件的吞吐能力 增加消费的多线程处理 根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务 默认情况下,RabbitMQ消费者为单线程串行消费,设置并行消 ...
- FreeRTOS-00-基础知识+任务创建删除
1 说明 本文仅作为学习FreeRTOS的记录文档,作为初学者肯定很多理解不对甚至错误的地方,望网友指正. 1.1 简介 FreeRTOS是一个RTOS(实时操作系统)系统,支持抢占式.合作式和时间片 ...
- SELECT SQL
替换换行符: update qgnews set article_url=REPLACE(article_url,char(10),'') 替换回车符: update qgnews set artic ...
- web系统国际化思路
需求:php开发多个中文系统支持国际化 思路: 提炼各个系统中的中文字符,替换为资源key. 多媒体文件中的中文定位(图片中的中文,中文录音,中文视频,中文模板等). 统一翻译文字.准备资源文件. 各 ...
- vlc+flv.js 摄像头 H5 直播
背景 业务需求:用最短的时间搞定摄像头直播到Web页面.因为没有过这方面经验,所以走了很多弯路,其实也不算弯路吧,大部分时间花在学习基础概念,寻找快速方案中.惯性思维想当然的以为找组件,配地址就能搞定 ...
- bash的快捷键
ctrl + u取消 当前光标之前的输入 ctrl + k 取消 当前光标之后的输入 ctrl + a 移动 当前光标到行首 ctrl + e 移动 当前光标到行尾