- golang.org/pkg 找到索引
- errors
- testing
- T
- Error()
- Errorf()
- Fatal()
- Fatalf()
- B
- syscall # 执行其它语言
- syscall/js
- js/wasm # 1.11, webAssembly
- go/doc
- go/token
- runtime
- Stack() # 调用栈
- Gosched() # 让出执行权
- Goexit() # 终止当前goroutine, 会执行defer
- LockOSThread() # 绑定协程到当前线程
- UnlockOSThread()
- GOMAXPROCS() # 并发线程数
- NumGoroutine() # 限制goroutine数
- runtime/debug
- os
- Stdin # 输入流
- Args # 运行参数
- FileInfo
- Open() # 打开文件
- Exit(1) # 1异常退出
- RemoveAll()
- Stat() # 文件信息
- os/exec # 子进程
- io
- EOF # 文件结束标志, 是一个error
- Copy()
- WriteString()
- io/ioutil
- Discard # 丢弃
- ReadFile() # 读整个文件到内存
- ReadAll()
- WriteFile()
- ReadDir()
- bufio # 带缓冲io
- NewScanner()
- Scanner # 以行或单词断开
- Scan() # 有内容返回true
- Text()
- NewReader()
- path # 文件路径
- path/filepath # 根据平台处理文件路径
- net
- net/http
- poolServer(epoll/kqueue/iocp)
- Get()
- HandleFunc()
- ResponseWriter
- Request
- RemoteAddr # 客户ip:端口
- Host
- Method
- Proto # 网络协议
- Header
- Form # 先ParseForm()
- URL
- ParseForm()
- ListenAndServe()
- net/http/httputil
- net/url
- context # 线程安全, 树形结构
- Cancel()
- Deadline(Timeout)
- Value()
- TODO()
- o→ ctx.Done()
-
func f(ctx context.Context) (error) {
errc := make(chan error, 1)
go func() {
defer close(errc)
time.Sleep(2 * time.Second)
errc <- nil
}()
select {
case <-ctx.Done():
<-errc
return ctx.Err()
case err := <-errc:
return err
}
}
- o→ WithTimeout
-
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) # 调cancel提前结束
defer cancel()
return f(ctx)
- flag
- Args # 非标识参数
- Parse() # 出错调os.Exit(2)
- o→ 输入’-s / a bc’, 输出’a/bc’
-
sep := flag.Strings("s", " ", "desc s")
flag.Parse()
println(strings.Join(flag.Args(), *sep))
- log
- SetPrefix()
- SetFlags() # 格式标记
- Fatal() # 加日期时间前缀
- Fatalf()
- time
- Time
- Now()
- Since()
- After()
- AfterFunc()
- NewTicker()
-
ticker := time.NewTicker(1 * time.Second)
<- ticker.C
ticker.Stop()
- Tick()
-
tick := time.Tick(1 * time.Second)
# 无法中止, 用于全局,否则内部goroutine泄漏
for {
<-tick
}
- fmt # string类型会调对象的String()方法
- Stringer # 接口,有String()方法可匹配
- Printf() # 可以用转义序列(\t等)表示不可见字符
- %d # 十进制整数
- %x, %o, %b # 十六进制、八进制、二进制整数
- %f, %g, %e # 浮点数6位小数、15位小数并自动精度与表示方式、6位小数e表示
- %t # 布尔
- %c # unicode字符
- %s # 字符串
- %q # 带引号字符串(“abc”),或字符(‘c’)
- %v # 内置格式的任何值
- %T # 类型
- %[1]c # 重复利用第一个参数
- Printf(“%d %[1]c %[1]q”, ‘a’)
- %% # %本身
- 特殊数字
- var z float64
- fmt.Println(z,-z,1/z,-1/z,z/z) # “0 -0 +Inf -Inf NaN”
- Fprintf()
- Scanf() # 格式化输入
- Errorf() # 产生一个error
- strconv # 类型转换
- ParseFloat()
- ParseInt()
- ParseUint()
- Itoa() # 整数转字符串
- FormatInt(int64(1a), 2)
- FormatUint()
- unicode # 单符号
- ToUpper()
- ToLower()
- IsDigit()
- IsLetter()
- unicode/utf8 # 逐个处理
- RuneCountInString() # 字符数
- DecodeRuneInString() # 解码, string类型默认调用
- bytes # 操作byte数组
- Buffer
- WriteByte()
- WriteRune()
- WriteString()
- String()
- Index()
- Contains()
- Count()
- Fields()
- HasPrefix()
- Join()
- Equal()
- strings # 处理UTF-8或位序列
- Index()
- Split()
- HasPrefix()
- HasSuffix()
- Contains()
- Count()
- Fields()
- Join()
- regexp
- MustCompile() # 检查
- Compile() # 编译表达式
- text/template
- Must() # 检查,有错panic
-
{{.Name}} # .代表当前值
{{range .Items}}
{{.Title | printf "%.64s"}}
{{.CreateAt | daysAgo}}
{{end}}
template.New("report").
Funcs(template.FuncMap{"daysAgo": daysAgo}).
Parse(templ)
- text/tabwriter # 生成表格
- html/template # 对html, js, css, url中原字符转义, 避免对输出页面注入控制
- Html # 字符串转成该类型,受信任,不用转义
- Parse() # 解析html
- encoding/json # unicode
- Marshal() # 转成json, 不可导出不可见
- MarshalIndent() # 格式化转成json
- Unmarshal()
- NewDecoder() # 流式解码
- encoding/xml
- encoding/gob
- encoding/asn1
- compress/gzip # DEFLATE算法
- compress/bzip2 # Burrows-Wheeler变换, 压缩高,慢
- sort
- IntSlice
- sort.Sort(sort.IntSlice(ints))
- Sort()
- Reverse()
- sort.Sort(sort.Reverse(values))
- IsSorted()
- Strings()
- Ints()
- IntsAreSorted()
-
type StringSlice []string
func (p StringSlice) Len()int {return len(p)}
func (p StringSlice) Less(i, j int)bool {return p[i] < p[j]}
func (p StringSlice) Swap(i, j int) {p[i], p[j] = p[j], p[i]}
sort.Sort(StringSlice(names))
- math
- Sin()
- NaN() # 返回NaN, NaN值比较总false(除!=), NaN用作信号量
- math/rand
- Seed(time.Now().UTC().UnixNano())
- Float64()
- math/cmplx # 复数运算
- math/bits
- image
- Rect()
- NewPaletted()
- Decode()
- Encode()
- image/color
- image/gif
- image/jpeg # 空导入注册解码器
- image/png # 空导入注册解码器
- sync
- Mutex
- RWMutex
- Lock()
- Unlock()
- RLock()
- RUnlock()
- Once # 单例资源初始化,解决了多线程下读检查,防重写的问题
- WaitGroup
- Cond
- Wait() # 计数加1, 进入阻塞
- Signal() # 解除一个阻塞,计数减1
- Broadcast() # 解除所有阻塞
- Map
- Pool
- reflect # 非导出字段反射可见, 不可更新
- Type # 类型
- String() # 类型描述, fmt.Printf()中的”%T” 内部调用
- Field() # 结构体成员, 返回StructField
- Method()
- Value # 值
- String() # 值描述,如""
- Type()
- Interface() # 返回接口具体值
- x := v.Interface()
- i := x.(int)
- Kind() # 得到类型,Bool, String, 各种数字, Array, Struct, Chan, Func, Ptr, Slice, Map, Interface, Invalid(零值), Func
- Index() # 数组
- NumField() # 结构体成员数
- FieldByName()
- MapKeys() # map
- MapIndex() # map
- IsValid()
- IsNil() # 指针
- Elem() # 指针指向元素
- CanAddr() # 是否可寻址,如指针元素取Elem()的值,数组元素
- Addr() # 取地址
- v.Addr().Interface().(*int)
- CanSet() # 检查CanAddr()和是否非导出字段
- Set() # 要求可寻址, 类型一致。可Set()interface{}类型
- SetInt(), SetUint(), SetString(), SetFloat() # 相对Set()有容错性,不可SetXx()interface{}类型
- SetMapIndex()
- NumMethod() # 方法数
- Method() # 取方法
- Call() # 执行Func类型Value
- StructField
- StructTag
- Method
- TypeOf()
- ValueOf()
- Zero() # 零值
- Append()
- MakeMap()
- New() # 类型新对象地址
- DeepEqual() # 深度比较,基本类型用==, 组合类型逐层比较。
- 判断武断,不认为值为nil的map和值不为nil的空map相等。slice同理
-
var c, d map[string]int = nil, make(map[string]int)
var a, b []string = nil, []string{}
- unsafe # 由编译器实现,暴露了内存布局。
- Pointer # 任何地址,可比较,可比较nil。无类型向内存写任意值。
- 可转成uintptr对地址计算
- 问题
- 移动垃圾回收器(目前未用)在移变量时地址改变使地址出错。
- goroutine增长栈时旧栈地址重新分配
- 解决
- Pointer转uintptr再转回来在一条语句中实现
- 应用
- 深度比较时,防止循环引用,每次比较存两个抽象的指针(即Pointer)和类型(y和y[0]地址一样)
-
var f float64
i := *(*uint64)unsafe.Pointer(&f)
- Sizeof() # 表达式占字节长度, 不计算表达式,由编译器推断
- Alignof # 报告类型对齐方式
- Offsetof() # 成员相对起始偏移量, 计算空位