Akagi201
2/5/2015 - 1:02 PM

golang.md

functional options

eBPF

blog

distributed tracing

load testing tool

log interface

replay traffic

toml

go programming secure

go report

mooc

Golang and C++

std lib

TUI

deep equal

社区

articles

redis

http middleware

目录结构

book

mooc

火焰图

pprof

  • 生成 svg 图片: go tool pprof http://192.168.1.43:8201/debug/pprof/profile

为什么日志不是interface

best practice

check

  • goimports -w .
  • golint .
  • unused

go routine 可视化

book

golang vs python

cgo

  • 用 cgo 的一个问题是, C 的内存还要自己管理, 这样失去了 golang 的一大特性.

time

empty select

http

错误处理

channel

  • chan 要拷贝内存, 传 []byte 不能用 chan.
  • 用 chan 还不如用 io.pipe().

samples

查看实现了这个interface的有哪些类型

godoc 命令支持额外参数 -analysis ,能列出都有哪些类型实现了某个接口,相关参考 godoc -h 或 Static analysis features of godoc。另外,我做了一个官网镜像,能查看接口所有的实现类型,地址:http://docs.studygolang.com

go generate

设计模式

msgpack

golang import 分析

go get ...

  • go get github.com/nsqio/nsq/...
  • go fmt ./...
  • go test ./...
  • 使用命令 go get 可以下载一个单一的包或者用 ... 下载整个目录里每个包.

作用域的几种情况

{
xxx
}
func() {
xxxx
}()

这种可以用defer来清理资源, 可以用return语句, 来提前退出.

if true {

}

OO

cross compile

    GOOS=linux  GOARCH=amd64 go build -o upx-linux-amd64-$(VER) -ldflags "-X main.version=$(VER)" .
    GOOS=linux  GOARCH=386  go build -o upx-linux-i386-$(VER) -ldflags "-X main.version=$(VER)" .
    GOOS=darwin GOARCH=amd64 go build -o upx-darwin-amd64-$(VER) -ldflags "-X main.version=$(VER)" .
    GOOS=windows GOARCH=386 go build -o smk_win
  go build -o smk_osx
    GOOS=linux  GOARCH=amd64 go build -o smk_linux
    GOOS=windows GOARCH=386 go build -o smk_win

lru

社区

并发

net/context example

SQL database drivers

数据库连接池

go presentation

异常处理

init()函数

interface

  • 接吻需声明(注意口写小了些以便好笑增强记忆)

Go语言圣经

badge

版本管理

go语言官方对社区看法

请问 Go 现在对于社区的态度如何,之前看过篇文章作者的一些提交被无视了,不知道迁移到 GitHub 后社区参与程度怎样了 应该说迁移到 GitHub 之后 更严格了, Google 的背景也更明显了:

  1. golang.org 给 Google的包开了特权: http://godoc.org/google.golang.org/grpc
  2. github 只是一个镜像+ISSUE收集, 源在 https://go.googlesource.com/go
  3. 贡献代码转移到 Gerrit 进行, 不接受 Github 的 PR.

go asm

tutorial

beginner

cross compile

examples

go4android

library

lldb

gdb

github fork 问题

atom

podcast

理解 import

tutorials

libs

oo

http.Handler && net/context

idiom

  • error idiom
  • bool idiom
  • Done channel idiom

news

测试框架

Go 项目索引

import 原理

testing

  • 测试单个文件: 一定要带上被测试的原文件: go test -v gotest.go gotest_test.go
  • 测试单个方法: go test -v -test.run Test_Division_1

编译go开源项目二进制

工作区和GOPATH

  • 工作区是放置Go源码文件的目录.
  • 一般情况下, Go源码文件都需要存放到工作区中.
  • 但是, 对于命令源码文件来说, 这不是必须的.
  • 工作去的结构: src, pkg, bin

版本管理

bin目录

  • 当环境变量GOBIN已有效设置时, 该目录会变得无意义.
  • 当GOPATH的值中包含多个工作区的路径时, 必须设置GOBIN, 否则无法成功安装Go程序的可执行文件.

src源码文件

分三类

  • 命令源码文件, 库源码文件 --> Go语言程序
  • 测试源码文件 --> 辅助源码文件

命令源码文件

特征

  • 声明自己属于main代码包, 包含无参数声明和结果声明的main函数.
  • 被安装后, 相应的可执行文件会被存放到GOBIN指向的目录或<当前工作区目录>/bin下.

注意

  • 命令源码文件是Go程序的入口, 但不建议把程序都写在一个文件中.
  • 同一个代码包中强烈不建议直接包含多个命令源码文件.

库源码文件

  • 不具备命令源码文件的那两个特征的源码文件.
  • 被安装后, 相应的归档文件会被存放到<当前工作区目录>/pkg/<平台相关目录>下.

测试源码文件

  • 跟库源码文件一样, 不具备命令源码文件的那两个特征的源码文件.
  • 名称以_test.go为后缀.
  • 其中至少有一个函数的名称以Test或Benchmark为前缀.
  • 并且, 该函数接受一个类型为 * testing.T*testing.B的参数.
// 功能测试函数
func TestFind(t *testing.T) {
  // 省略若干条语句
}

// 性能/基准测试函数
func BenchmarkFind(b *testing.B) {
  // 省略若干条语句
}

代码包

作用

  • 编译和归档Go程序的基本单位.
  • 代码划分, 集结和依赖的有效组织形式, 也是权限控制的辅助手段.

规则

  • 一个代码包实际上就是由导入路径代表的目录.
  • 导入路径即 <工作区目录>/src 或 <工作区目录>/pkg/<平台相关目录> 之下的某段子路径.

声明

  • 每个源码文件必须声明其所属的代码包.
  • 同一个代码包中的所有源码文件声明的代码包应该是相同的.

代码包声明与代码包导入路径的区别

  • 代码包声明语句中的包名称应该是该代码包的导入路径的最右子路径.

导入

  • 代码包导入语句中使用的包名称应该与其导入路径一致.

初始化

  • 代码包初始化函数即: 无参数声明和结果声明的init函数.
  • init函数可以被声明在任何文件中, 且可以有多个.
  • init函数的执行时机 -- 单一代码包内: 对所有全局变量进行求值 --> 执行所有init函数.
  • init函数的执行时机 -- 不同代码包内: 执行被导入的代码包中的init函数 --> 执行导入它的那个代码包的init函数.
  • 注意: 我们不应该对在同一个代码包中被导入的多个代码包的init函数的执行顺序进行假设.
  • init函数的执行时机 -- 所有涉及到的代码包.

go install

  • 对于命令代码包, 如果设置了GOBIN, 这生成的二进制在$GOBIN/bin下, 如果没设置GOBIN, 生成在当前工作区的bin目录下.
  • 对于库代码包, 生成在当前工作区的pkg目录下.

go get

  • 用于从远处代码仓库下载并安装代码包.
  • 支持的VCS有: git, mercurial, svn, bazaar
  • 指定的代码包会被下载到GOPATH中包含的第一个工作区的src目录中.

环境变量

  • GOROOT: 实际上,现在不需要设置GOROOT。在1.0版出来之前,确实需要设置GOROOT。也就是说,这是个以前遗留下来的一个习惯而已 如果在同一台机器下安装了多个版本的GO,那设置GOROOT会导致一些debug的问题。所以,无视GOROOT这个环境变量就好。http://dave.cheney.net/2013/06/14/you-dont-need-to-set-goroot-really
# 为了方便使用Go语言命令和Go程序的可执行文件, 需要追加其值
export PATH=$PATH:$GOROOT/bin:$GOBIN

interface

go tools

  • Autocomplete using gocode (you must have the autocomplete-plus package activated for this to work)
  • Formatting source using gofmt, goimports, or goreturns
  • Code quality inspection using go vet
  • Linting using golint
  • Syntax checking using go build and go test
  • Display of test coverage using go test -coverprofile
  • Go to definition using godef

cgo

包搜索

IDEA

go语言插件

error

go里调C

Cross Compile