go语言作为一个面向网络 面向服务 高并发的一门通用语言 http库是非常重要的

下面我们来了解http库及其他标准库

http库可以对客户端做很多的工作 下面我们来看一下

func main() {
	resp, err := http.Get("https://mp.csdn.net")//网址是否能够打开 如果能打开返回结构体指针
	if err != nil{    //错误返回报告
		panic(err)
	}
	defer resp.Body.Close()  //预先处理resp关闭
	s, err := httputil.DumpResponse(resp,true)//分析结构体指针是否正确 如果正确 返回utf8格式
	if err != nil{
		panic(err)
	}

	fmt.Printf("%s", s)//打印utf8
}

这是一个最简单的http调用函数 

 

下面我们对http.Get进行控制

首先打开爱慕课官网 按f12进入开发者模式

我们发现点击移动端显示后 网页会自动跳转出去

那他是怎么做的呢 我们也来试试看

首先获得一条指令

 

User-Agent:

Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1

这是指令 我复制下来了 下面我们进入代码

func main() {
	request,err := http.NewRequest(http.MethodGet,"http://www.imooc.com",nil)//同样返回结构体指针
	//将跳转指令放入requst中
	request.Header.Add("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
	resp, err := http.DefaultClient.Do(request)//引用Client{}结构体 将Client结构体指针返回到变量中 
	if err != nil{    //错误返回报告
		panic(err)
	}
	defer resp.Body.Close()  //预先处理resp关闭
	s, err := httputil.DumpResponse(resp,true)//分析结构体指针是否正确 如果正确 返回utf8格式
	if err != nil{
		panic(err)
	}

	fmt.Printf("%s", s)//打印utf8
}

运行成功 打印移动端页面信息  

 

其实我们可以不用http.DefaultClient.Do 因为他就是引用的Client 我们可以直接使用Client 自由控制Client

比如打印出网址信息

func main() {
	request,err := http.NewRequest(http.MethodGet,"http://www.imooc.com",nil)//同样返回结构体指针
	//将跳转指令放入requst中
	request.Header.Add("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
	client := http.Client{   //结构体Client赋值给变量 client
		CheckRedirect: func(req *http.Request,//指定地址
			via []*http.Request,//指定路径 
		) error{
			fmt.Println("Redirect:",req)   //将Request中的指定网址打印出
			return nil   //一般情况下为nil
		},
	}
	resp , err := client.Do(request) //调用Do 返回结构体指针
	if err != nil{    //错误返回报告
		panic(err)
	}
	defer resp.Body.Close()  //预先处理resp关闭
	s, err := httputil.DumpResponse(resp,true)//分析结构体指针是否正确 如果正确 返回utf8格式
	if err != nil{
		panic(err)
	}

	fmt.Printf("%s", s)//打印utf8
}

当我们使用自己定义的Client时 结果最上方打印出两条网址 一条是主网址 一条是跳转网址

 

我们看一下使用http库做了什么

.使用http客户端发送请求 

.使用http.Client http.NewRequest控制请求头部 重定向等

.使用httputil简化工作

 

下面我们在看一下http服务器的性能分析

打开我们之前的web.go

package main

import (
	"net/http"
	"awesomeProject1/filelistingserver/filelisting"
	"os"
	"github.com/gpmgo/gopm/modules/log"
	"awesomeProject1/golog"
	_ "net/http/pprof"
)
type appHandler func (writer http.ResponseWriter,request *http.Request) error

func errWrapper(handler appHandler) func(http.ResponseWriter, *http.Request){
	return func (writer http.ResponseWriter,request *http.Request){
		defer func() {
			if r := recover(); r != nil {
				golog.Printf("Panic: %v", r)
				http.Error(writer, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
			}
		}()
		err := handler(writer,request)
		if err != nil{
			log.Warn("Error handling request: %s", err.Error())
			if userErr, ok := err.(userError); ok{
				http.Error(writer,userErr.Message(),http.StatusBadRequest)
				return
			}
			code := http.StatusOK
			switch {
			case os.IsNotExist(err):
				code = http.StatusNotFound
			case os.IsPermission(err):
				code = http.StatusForbidden
			default:
				code = http.StatusInternalServerError
			}
			http.Error(writer,http.StatusText(code),code)
		}
	}
}
type userError interface{
	error
	Message() string
}
func main(){
	http.HandleFunc("/",errWrapper(filelisting.HandlefileList))
	err := http.ListenAndServe(":8888",nil)
	if err != nil{
		panic(err)
	}
}

我们在pprof后面加上_ "net/http/pprof"就可以不调用函数而使用包

接下来打开端口8888

 我们可以查看服务的运行状况 内存 cpu 等 根据运行状况进行优化

 

除了这个还有一个功能是图形化 记录30秒的cpu变化

 这样就显示了cpu的资源使用情况

 

当然我们还可以查看内存的使用情况

 http的性能分析

.import (_ “net/http/pprof”)

.访问/debug/pprof/

.使用go tool pprof分析性能

 

最后我们简要说一下其他库

.bufio  可以缓存较多数据后 一起发送到硬盘上

.log  打印错误报告

.encoding/json 后面会详细说

.ergexp 后面会详细

.time 跟时间有关的库

.string/math/rand 基本标准库 字符有关/数学有关/随机有关

那我们如何查看各种函数的用法呢 如下

在powershell输入godoc -http :8888打开浏览器查看packages文档

或者去官网查看标准库中文版

go语言的标准库就到这