cgo
- 反汇编 go tool objdump -S -s YOUR_FUNC x.exe
- GODEBUG=cgocheck=2 检查内存违规
- -ldflags ‘-linkmode=internal’ 完全静态链接
- //go:nosplit 禁止栈扩容检测 编译时通过-N -l检查是否不会超出
- //go:systemstack 强制使用系统栈
- //go:noescape 禁止逃逸分析
- //go:uintptrescapes 允许uintptr指针逃逸
- //go:uintptrkeepalive 保持uintptr指针活跃
- //go:notinheap 仅runtime包内使用, 禁止类型分配在堆上
- //go:yeswritebarrierrec 强制启用写屏障递归检查 调试用显著降低性能 必须 GODEBUG=wbshadow=1
- //go:nowritebarrierrec 禁止GC写屏障递归调用
- //go:norace 禁用竞态检测
- /go:nocheckptr 跳过指针边界检查
- //go:cgo_export_dynamic go函数强制导出为动态库写入ELF的.dynsym段 Windows需额外.def文件
- //go:cgo_import_static go函数强制静态导出
- //go:packed
- //go:noinline
- //go:linkname 链接到其他包的未导出函数
- //go:embed 编译期嵌入文件资源 单个文件最大2GB
- //go:build 编译标记
- syscall.RawSyscall 通过汇编中断和寄存器直接在Goroutine直接系统调用 如eBPF交互
go1.5
- GO15VENDOREXPERIMENT=1 替代GOPATH使用项目中的vendor目录
- 查找顺序 当前包下的vendor目录->向上级目录查找vendor目录->GOROOT->GOPATH
go1.7
- 去掉GO15VENDOREXPERIMENT 默认使用
go1.11
-
GO111MODULE=off on auto 取代vendor包管理 - 项目脱离GOPATH可以放置于任意位置
go1.14
- type A interface {a() b()} type B interface {b() c()} type C interface {A B}
- 实现问题
type Aa struct{} func (Aa) a() {} func (Aa) b() {} type Bb struct{} func (Bb) b() {} func (Bb) c() {} type Cc struct { C } func (Cc) b() {} //must define this func f := Cc { A: Aa{}, B: Bb{}, } - 协程调度用基于系统信号的异步抢占取代了协作式抢占, 有协程死循环也可以被切换出。但如果代码本身直接或间接调用syscall,调用平台相关API,可能触发系统信号,导致协程被切换,因此等切换回来必须检测EINTR错误,并重新调用syscall
- -mod=mod 强制使用module包管理
- GOINSECURE 不强制校验https证书
go module
-
GO111MODULE=off on auto - go modules 在代码目录中生成go.mod go.sum
- go install 将包安装到GOPATH/pkg/mod 编译到GOPATH/bin
- go mod init 初始化go.mod 可以指定自定义名称
- go mod download 下载package
- go mod graph 打印模块依赖结构
- go mod tidy 清理项目, 添加依赖包,删除未使用包
- go mod verify 包校验
- go mod why 查询需要的依赖包
- go mod vendor 将依赖导出到vendor目录
- go mod edit 编辑go.mod
- go list -m -json all 用json格式打印依赖
- go build 时会自动添加依赖并下载
- go get 时会自动添加依赖到mod文件
- go.mod
module github.com/nomadli/agent //项目包路径
go 1.14 //使用的go版本
require ( //用到的包
example.com/apple v0.1.2
example.com/banana v1.2.3
)
exclude example.com/banana v1.2.4 //忽略指定版本的依赖包
replace( //墙掉的库
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)
- go.sum ```