美文网首页
GO学习笔记(21) - 标准库

GO学习笔记(21) - 标准库

作者: 卡门001 | 来源:发表于2021-07-11 01:05 被阅读0次

目录

  • HTTP
  • JSON
  • 其他标准库
  • 查看标准库文档

HTTP

httpclient

package main

import (
    "fmt"
    "net/http"
    "net/http/httputil"
    _ "net/http/pprof" //用于分析性能
)

func httpClientDemo() {
    request,err := http.NewRequest(http.MethodGet,"https://www.imooc.com/",nil)
    request.Header.Add("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4385.0 Safari/537.36")

    //req:重定向的最重目标
    //via:多次重定向的数据列表s
    client := http.Client{
        CheckRedirect: func(req *http.Request, via []*http.Request) error{
            fmt.Println("CheckRedirect:",req)
            return nil
        },
    }
    resp,err := client.Do(request)
    //resp,err := http.Get("http://www.sina.com")
    if err != nil{
        panic(err)
    }
    defer resp.Body.Close()

    s,err := httputil.DumpResponse(resp,true)
    if err != nil{
        panic(err)
    }
    fmt.Printf("%s \n",s)

}

func main() {
    httpClientDemo()
}

http server

教程与源码见 《GO学习笔记(16) - 简易静态文件web应用》

性能分析
  • web.go改造:在之前代码的基础上增加如下包引入
_ "net/http/pprof"

网页版

http://localhost/debug/pprof

命令行

//cpu
go tool pprof  http://localhost/debug/ppro/profile  
//内存
go tool pprof  http://localhost/debug/ppro/heap
...

JSON

  • 注意json格式化输出
  • json数据格式打印
package main


import (
    "encoding/json"
    "fmt"
)

//格式输出
type Order struct {
    Id string  `json:"id"`
    Name string  `json:"name,omitempty"` //omitempty忽略空字段输出
    Quality int  `json:"quality"`
    TotalPrice float64  `json:"totalPrice"`
    Item []*OrderItem `json:"item"`
}

type OrderItem struct {
    Id string  `json:"id"`
    Name string `json:"name"`
    Price float64 `json:"price"`
}

func marshal()  {
    o := Order{
        Id: "1234",
        Name: "learn go",
        Quality: 10,
        TotalPrice: 100,
        Item: []*OrderItem{
            {
                Id: "item_1",
                Name: "learn go",
                Price: 15,
            },
            {
                Id: "item_2",
                Name: "netty",
                Price: 25,
            },
        },
    }
    //内存参数序列化为可以为网络上传输的byte[]数据
    b ,err := json.Marshal(o)
    if err != nil{
        panic(err)
    }
    //注意"+"号
    fmt.Printf("%+v \n",o)
    //可用于网络上传输
    //可用于跨语言间json的传输,输出为小写的字段
    fmt.Printf("%+s \n",b)
}

func main() {
    marshal()
}

  • 输出
{Id:1234 Name:learn go Quality:10 TotalPrice:100} 
{"id":"1234","name":"learn go","quality":10,"totalPrice":100,"item":{"id":"item_1","name":"earn go","price":15}} 

将字符串格式化为json

//将字符串变为json对象
func unmarshal()  {
    s := `{"id":"1234","name":"learn go","quality":10,"totalPrice":100,"item":[{"id":"item_1","name":"learn go","price":15},{"id":"item_2","name":"netty","price":25}]}`
    var o Order
    //注意&o(地址)
    err := json.Unmarshal([]byte(s),&o)
    if err != nil{
        panic(err)
    }
    fmt.Printf("%+v \n",o)

}

API接口取值

  • map方式
  • 结构体方式
func apiData()  {
    //...
    res :=`{
        "data": [
            {
            "synonym":"牛仔库",
            "weight":"0.8",
            "word":"韩都衣舍",
            "tag":"品牌"
            },
            {
            "synonym":"连衣裙",
            "weight":"0.9",
            "word":"lily",
            "tag":"品牌"
            },
            {
            "synonym":"上衣",
            "weight":"0.5",
            "word":"vero moda",
            "tag":"品牌"
            }   
        ]}` //json格式字串

    m := make(map[string]interface{})
    //map送过来的数据后面一定要加interface()
    m1 := struct {
        Data []struct{
            Synonym string `json:"synonym"`
            Word string `json:"word"`
        } `json:"data"`
    }{}
    err1 := json.Unmarshal([]byte(res),&m)
    err2 := json.Unmarshal([]byte(res),&m1)
    if err1 != nil{
        panic(err1)
    }
    if err2 != nil{
        panic(err2)
    }
    fmt.Printf("1. %+v \n\n",m)
    fmt.Printf("1. %+v \n\n",m1)
    //type
    fmt.Printf("2. %+v \n\n",m["data"].([]interface{})[2])
    //取值
    fmt.Printf("3. %+v \n\n",m["data"].([]interface{})[2].(map[string]interface{})["word"])
    fmt.Printf("4. %+v \n\n",m1.Data[2].Synonym)
    fmt.Printf("5. %+v \n\n",m1.Data[2].Word)
}

输出

1. map[data:[map[synonym:牛仔库 tag:品牌 weight:0.8 word:韩都衣舍] map[synonym:连衣裙 tag:品牌 weight:0.9 word:lily] map[synonym:上衣 tag:品牌 weight:0.5 word:vero moda]]] 
2. {Data:[{Synonym:牛仔库 Word:韩都衣舍} {Synonym:连衣裙 Word:lily} {Synonym:上衣 Word:vero moda}]} 
3. map[synonym:上衣 tag:品牌 weight:0.5 word:vero moda] 
4. vero moda 
5. 上衣 
6. vero moda 

其他标准库:

  • bufio: 比io.Reader与Writer速度会高很多
  • encoding/json
  • log
  • regexp
  • time
  • strings/math/rand

如何查看标准库文档

  • 安装
go get golang.org/x/tools/cmd/godoc
  • 启动
$ godoc -http :8080
----
返回如下值,代表成功
using module mode; GOMOD=NUL
godoc -http :8080
  • 浏览访问
http://localhost:8080/pkg/

第三方库

  • 日志库:logrus
  • 国际化或编码库:golang.org/x/text
//  可用于处理乱码
transform.NewReader(resp.Body,simplifiedchinese.GBK.NewDecoder())
  • 自动检查网页编码: go get -g -v golang.org/x/net/html

相关文章

  • GO学习笔记(21) - 标准库

    目录 HTTP JSON 其他标准库 查看标准库文档 HTTP httpclient http server 教程...

  • 笨办法学golang(三)

    这是Go语言学习笔记第三篇。 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 Go语言基本类型主要有布...

  • 笨办法学golang(二)

    这是Go语言学习笔记的第二篇文章。 Go语言学习笔记参考书籍「Go语言编程」、Go官方标准库 前文提要 上篇文章中...

  • 笨办法学golang(四)

    这是Go语言学习笔记的第四篇 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 数组 数组是指一系列同类...

  • golang学习资源

    教程类 Go 标准库中文文档 Go 标准库文档 Go 实例学标准库 Go入门指南The-way-to-go Go语...

  • go语言学习

    基础 go的学习,感谢Go By Example、go网络编程与go语言标准库随着学习的深入,此文章持续更新......

  • 22 Go 常用标准库简析

    Go 常用标准库 Go官方以包的形式提供功能丰富的标准库,了解这些包会让你在项目开发中如鱼得水。Go标准库很容易理...

  • Go 标准库介绍六: log

    Go 标准库介绍六: log 原文链接 http://ironxu.com/775 本文介绍Go 标准库 log ...

  • go 学习总结

    go 学习总结 Golang标准库 https://github.com/polaris1119/The-Gola...

  • Go 标准库中文文档

    Go标准库中文文档

网友评论

      本文标题:GO学习笔记(21) - 标准库

      本文链接:https://www.haomeiwen.com/subject/sylgultx.html