go 学习笔记
第六版 下 预览
span里面有obj,一共67种class, class 0 就是一个大内存
大块内存=span
go module
- 如果引用了一个1.0.0那你就别删老的,删了再建新的1.0.0, go module不好使
- 新版本2.0.0不让用了,要用1.1.0之类不能用2,会报用v2
- 升级一个依赖的步骤:1. 改go.mod, 2. go build
- 升级最新的版本: go get -u github.com/prometheus/client_golang@main 注意不是master是main。有老的master没删掉,就尴尬了
http
u, err := url.Parse("http://localhost:8080")
host, port, err := net.SplitHostPort(u.Host)
transport.go (t *Transport) dialCon
readloop:
_, err := pc.br.Peek(1) --这里只看一下,没数据也没事,eof也没事
rc := <-pc.reqch reqch chan requestAndChan // written by roundTrip; read by readLoop
pc.readResponse
所以就是read先等write信号,write完,跑read
对于eof pc.readResponse`挂了
2172 ▸ ▸ resp, err = ReadResponse(pc.br, rc.req)¬
| 2173 ▸ ▸ if err != nil {¬
| 2174 ▸ ▸ ▸ return¬
| 2175 ▸ ▸ }¬
应该是这里返回eof了
test & gin
mysql
var db *sql.DB
var err error
pool, err := dockertest.NewPool("")
pool.MaxWait = time.Minute * 5
if err != nil {
log.Fatalf("Could not connect to docker: %s", err)
}
resource, err := pool.Run("mysql/mysql-server", "8.0", []string{"MYSQL_ROOT_PASSWORD=123456"})
if err != nil {
log.Fatalf("Could not start resource: %s", err)
}
defer func() {
if err := pool.Purge(resource); err != nil {
log.Fatalf("Could not purge resource: %s", err)
}
}()
fmt.Println("mysql docker exposed port is:" + resource.GetPort("3306/tcp"))
if err := pool.Retry(func() error {
var err error
db, err = sql.Open("mysql", fmt.Sprintf("ut:123456@(localhost:%s)/live", resource.GetPort("3306/tcp")))
if err != nil {
spew.Dump(err)
return err
}
//启动阶段不停的重试连接,如果连接上了,则需要授权,让宿主机能连上
//一句话也不能少,因为要建立live的database
resource.Exec([]string{"mysql", "-uroot", "-p123456", "-e", `CREATE USER 'ut'@'%' IDENTIFIED BY '123456';`}, dockertest.ExecOptions{})
resource.Exec([]string{"mysql", "-uroot", "-p123456", "-e", `GRANT ALL ON *.* TO 'ut'@'%'`}, dockertest.ExecOptions{})
resource.Exec([]string{"mysql", "-uroot", "-p123456", "-e", `flush privileges;`}, dockertest.ExecOptions{})
resource.Exec([]string{"mysql", "-uroot", "-p123456", "-e", `create database live;`}, dockertest.ExecOptions{})
return db.Ping()
}); err != nil {
log.Fatalf("Could not connect to database: %s", err)
}
// 在项目根目录执行: ROOT=`pwd` go test ./... -v -timeout 10000s
execSql(db, os.Getenv("ROOT")+"/ddl/ddl.sql")
ctx
gin
other
go + gitlab
最大boss,私有gitlab使用非80,443端口,为什么不用80,443呢?因为如果小企业,电信出口不能暴露80,443。。。。
- 你的项目go.mod必须要用域名来命名pacakge: xxx.com/group/project.git
- 项目只能import下级的目录 比如 import pkg/xxxxx
- 同级目录引用,或引用上级,你在 pkg/yyy/yyy.go 需要 带域名引用 import xxx.com/group/project.git/pkg/xxx
- 所以别用同级目录
- 引用的project,增加deploy token,以便被引用。
- 改gitconfig
[url "https://TOKEN:PW@xxx.com:12345/group/project"]
insteadOf = https://xxx.com/group/project
- Enjoy
golang-cilint
perf
go tool pprof -http=:8034 http://a30caa4cf1bdc47bf8644e1deb81bd83-839478928.us-east-2.elb.amazonaws.com:8800/debug/pprof/profile
go 学习笔记
第六版 下 预览
span里面有obj,一共67种class, class 0 就是一个大内存
大块内存=span
go module
http
所以就是read先等write信号,write完,跑read
对于eof pc.readResponse`挂了
应该是这里返回eof了
test & gin
mysql
,所以在go支持很不好,解决办法是 双引号用+ 连接起来,因为双引号不能换号,里面的``不能转义。。。。ctx
https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-context/gin
other
FindStringSubmatchgo + gitlab
最大boss,私有gitlab使用非80,443端口,为什么不用80,443呢?因为如果小企业,电信出口不能暴露80,443。。。。
golang-cilint
GL_DEBUG=loader,gocritic,env,autogen_exclude,nolint golangci-lint run -v --no-config --disable ineffassign --disable deadcode --disable unused --timeout=10m -E gofmt ./...,好了,有个历史老bug:context loading failed: no go files to analyze golangci/golangci-lint#825perf
go tool pprof -http=:8034 http://a30caa4cf1bdc47bf8644e1deb81bd83-839478928.us-east-2.elb.amazonaws.com:8800/debug/pprof/profile