go常见内部包解析

go(二)

介绍一些常用的包
1、flag
导入方法:

import "flag"

flag包实现了命令行参数的解析,据我的理解就是数据绑定。使用flag.String(), Bool(), Int()等函数注册flag,下例声明了一个整数flag,解析结果保存在*int指针ip里

import "flag"
var ip = flag.Int("flagname", 1234, "help message for flagname")

将flag绑定到一个变量,使用Var系列函数

var flagvar int
func init() {
    flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
}

自定义一个用于flag的类型(满足Value接口)并将该类型用于flag解析

flag.Var(&flagVal, "name", "help message for flagname")
//对这种flag,默认值就是该变量的初始值

在所有flag都注册之后,调用

flag.Parse() f l a g . P a r s e ( )
解析命令行参数写入注册的flag里。解析之后,flag的值可以直接使用。如果你使用的是flag自身,它们是指针;如果你绑定到了某个变量,它们是值。

fmt.Println("ip has value ", *ip)
fmt.Println("flagvar has value ", flagvar)

解析后,flag后面的参数可以从flag.Args()里获取或用flag.Arg(i)单独获取。这些参数的索引为从0到flag.NArg()-1。

2、net/http
导入包:

import "net/http"

http包提供了HTTP客户端和服务端的实现。
Get、Head、Post和PostForm函数发出HTTP/ HTTPS请求。

resp, err := http.Get("http://example.com/")
...
resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
...
resp, err := http.PostForm("http://example.com/form",
    url.Values{"key": {"Value"}, "id": {"123"}})

程序在使用完回复后必须关闭回复的主体

resp, err := http.Get("http://example.com/")
if err != nil {
    // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)

要管理HTTP客户端的头域、重定向策略和其他设置,创建一个Client

client := &http.Client{
    CheckRedirect: redirectPolicyFunc,
}
resp, err := client.Get("http://example.com")
// ...
req, err := http.NewRequest("GET", "http://example.com", nil)
// ...
req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req)

要管理代理、TLS配置、keep-alive、压缩和其他设置,创建一个Transport

tr := &http.Transport{
    TLSClientConfig:    &tls.Config{RootCAs: pool},
    DisableCompression: true,
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://example.com")

Client和Transport类型都可以安全的被多个go程同时使用。出于效率考虑,应该一次建立、尽量重用

ListenAndServe使用指定的监听地址和处理器启动一个HTTP服务端。处理器参数通常是nil,这表示采用包变量DefaultServeMux作为处理器。Handle和HandleFunc函数可以向DefaultServeMux添加处理器

http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))

管理服务端的行为,可以创建一个自定义的Server

s := &http.Server{
    Addr:           ":8080",
    Handler:        myHandler,
    ReadTimeout:    10 * time.Second,
    WriteTimeout:   10 * time.Second,
    MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())

3、net/http/pprof
导入包

import "net/http/pprof"

通过它的HTTP服务端提供pprof可视化工具期望格式的运行时剖面文件数据服务,
使用pprof工具查看堆剖面

go tool pprof http://localhost:6060/debug/pprof/heap

或查看周期30秒的CPU剖面

go tool pprof http://localhost:6060/debug/pprof/profile

或查看go程阻塞剖面

go tool pprof http://localhost:6060/debug/pprof/block

4、os
导入

import "os"

os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息

file, err := os.Open("file.go") // For read access.
if err != nil {
    log.Fatal(err)
}
//打开一个文件并从中读取一些数据

如果打开失败,错误字符串是自解释的

open file.go: no such file or directory

文件的信息可以读取进一个[]byte切片。Read和Write方法从切片参数获取其内的字节数。

data := make([]byte, 100)
count, err := file.Read(data)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("read %d bytes: %q\n", count, data[:count])

5、sync
导入:

import "sync"

sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。

6、atomic
导入:

import "sync/atomic"

atomic包提供了底层的原子级内存操作,对于同步算法的实现很有用。
除了某些特殊的底层应用,使用通道或者sync包的函数/类型实现同步更好。
应通过通信来共享内存,而不通过共享内存实现通信。

7、time

import "time"

time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。

8、json

import "encoding/json"

json包实现了json对象的编解码,参见RFC 4627。Json对象和go类型的映射关系请参见Marshal和Unmarshal函数的文档。

9、strings

import "strings"

strings包实现了用于操作字符的简单函数

10、user

import "os/user"

user包允许通过名称或ID查询用户帐户。

11、errors

import "errors"

errors包实现了创建错误值的函数

12、filepath

import "path/filepath"

filepath包实现了兼容各操作系统的文件路径的实用操作函数

13、fmt

import "fmt"

mt包实现了类似C语言printf和scanf的格式化I/O。格式化动作(’verb’)源自C语言但更简单

14、runtime

import "runtime"

runtime包提供和go运行时环境的互操作,如控制go程的函数。它也包括用于reflect包的低层次类型信息;参见reflect报的文档获取运行时类型系统的可编程接口。

下面的环境变量($name或%name%,这依赖于主机的操作系统)控制go程序的运行时行为。它们的含义和用法可能在各发行版之间改变。

环境变量GOGC设置最初的垃圾收集目标百分比。当新申请的数据和前次垃圾收集剩下的存活数据的比率达到该百分比时,就会触发垃圾收集。默认GOGC=100。设置GOGC=off 会完全关闭垃圾收集。runtime/debug包的SetGCPercent函数允许在运行时修改该百分比。参见http://golang.org/pkg/runtime/debug/#SetGCPercent

环境变量GODEBUG控制运行时的debug输出。GODEBUG的值是逗号分隔的name=val对。支持的name如下:

allocfreetrace: 设置其为1,会导致每次分配都会被记录剖面,会记录每一个对象的分配、释放
  及其堆栈踪迹。
efence: 设置其为1,会导致分配器运行模式为:每个对象申请在独立的页和地址,且永不循环利用。
gctrace: 设置其为1,会导致垃圾收集器每次收集都向标准错误输出写入单行的数据,概述收集的总
  内存的大小和暂停的总时间长度。设置其为2,会写入同样的概述,但也会写入每次收集的两个数据。
gcdead: 设置其为1,会导致垃圾收集器摧毁任何它认为已经死掉的执行堆栈。
schedtrace: 设置其为X,会导致调度程序每隔X毫秒输出单行信息到标准错误输出,概述调度状态。
scheddetail: 设置schedtrace为X并设置其为1,会导致调度程序每隔X毫秒输出详细的多行信息,描述调度、进程、线程和go程的状态。

环境变量GOMAXPROCS限制可以同时运行用户层次的go代码的操作系统进程数。没有对代表go代码的、可以在系统调用中阻塞的go程数的限制;那些阻塞的go程不与GOMAXPROCS限制冲突。本包的GOMAXPROCS函数可以查询和修改该限制。

环境变量GOTRACEBACK控制当go程序因为不能恢复的panic或不期望的运行时情况失败时的输出。失败的程序默认会打印所有现存go程的堆栈踪迹(省略运行时系统中的函数),然后以状态码2退出。如果GOTRACEBACK为0,会完全忽略所有go程的堆栈踪迹。如果GOTRACEBACK为1,会采用默认行为。如果GOTRACEBACK为2,会打印所有现存go程包括运行时函数的堆栈踪迹。如果GOTRACEBACK为crash,会打印所有现存go程包括运行时函数的堆栈踪迹,并且如果可能会采用操作系统特定的方式崩溃,而不是退出。例如,在Unix系统里,程序会释放SIGABRT信号以触发核心信息转储。

环境变量GOARCH、GOOS、GOPATH和GOROOT构成完整的go环境变量集合。它们影响go程序的构建(参见http://golang.org/cmd/go andhttp://golang.org/pkg/go/build)。

GOARCH、GOOS和GOROOT在编译时被记录并可用本包的常量和函数获取,但它们不会影响运行时环境。

15、signal

import "os/signal"

signal包实现了对输入信号的访问。

16、bytes

import "bytes"

bytes包实现了操作[]byte的常用函数。本包的函数和strings包的函数相当类似。

17、strconv

import "strconv"

strconv包实现了基本数据类型和其字符串表示的相互转换。

18、math/rand

import "math/rand"

rand包实现了伪随机数生成器。

随机数从资源生成。包水平的函数都使用的默认的公共资源。该资源会在程序每次运行时都产生确定的序列。如果需要每次运行产生不同的序列,应使用Seed函数进行初始化。默认资源可以安全的用于多go程并发。

19、sort

import "sort"

sort包提供了排序切片和用户自定义数据集的函数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海燕技术栈

你的鼓励我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值