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) 用于向浏览器输出信息 常用 ...
随机推荐
- Java Collecion的常用方法
import java.util.*; /** * 数组存储数据的特点: * ①一旦初始化,大小确定 * ②一旦定义,存储的类型确定且相同. * 数组存储的弊端: * ①大小无法改变. * ②方法较少 ...
- buu 不一样的flag
一.查壳 二.拖入ida,分析 从这里和51到53行的代码,基本判断这是一个迷宫题,并且是5行5列的一个迷宫.我当时感觉到一个奇怪的地方是 第一个,我自己想明白是因为可能是int型,数字占了4个字节, ...
- Java并发实战一:线程与线程安全
从零开始创建一家公司 Java并发编程是Java的基础之一,为了能在实践中学习并发编程,我们跟着创建一家公司的旅途,一起来学习Java并发编程. 进程与线程 由于我们的目标是学习并发编程,所以我不会把 ...
- 扩大UIPageViewController的点击范围
UIPageViewController中的边缘点击手势大概是屏幕的1/6,市面的大多数阅读器点击手势都在1/3以上,或者我干脆想自定义点击的范围,但又不想放弃系统的翻页效果,这时候该怎么做了?其实很 ...
- ROS2学习之旅(14)——编写简单的发布者和订阅者(C++)
节点是通过ROS Graph进行通信的可执行进程.在本文中,节点将通过话题以字符串消息的形式相互传递信息.这里使用的例子是一个简单的"talker"和"listener& ...
- Pandas高级教程之:window操作
目录 简介 滚动窗口 Center window Weighted window 加权窗口 扩展窗口 指数加权窗口 简介 在数据统计中,经常需要进行一些范围操作,这些范围我们可以称之为一个window ...
- 双线性插值算法的FPGA实现
本设计预实现720P到1080P的图像放大,输入是YUV444数据,分量像素位宽为10bit,采用的算法为双线性插值法,开发平台是xiinx K7开发板. 双线性插值法即双次线性插值,首先在横向线性插 ...
- RPC远程协议之Thrift入门
在上一篇文章<RPC远程协议之原理分析>中,我介绍了RPC的工作原理及欲实现RPC框架功能应该做哪些事情,因为要做的事情太多,完全由开发人员研发实现,不是很现实,所以市面上出现了诸多RPC ...
- java集合(4)-Set集合
Set集合,类似于一个罐子,程序可以把多个对象"丢进"Set集合,而Set集合通常不能记住每个元素的添加顺序.Set集合与Collection基本相同,没有提供任何额外的方法.实际 ...
- Hive——基本DDL语句
Hive--基本DDL语句 DDL:Data Definition Language(数据定义语言,与关系型数据库相似) 官方手册:https://cwiki.apache.org/confluenc ...