jinleileiking / learning-notes

Notes for my learning.
GNU General Public License v3.0
1 stars 2 forks source link

golang #19

Open jinleileiking opened 1 year ago

jinleileiking commented 1 year ago

go 学习笔记

第六版 下 预览

span里面有obj,一共67种class, class 0 就是一个大内存

大块内存=span

go module

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。。。。

  1. 你的项目go.mod必须要用域名来命名pacakge: xxx.com/group/project.git
  2. 项目只能import下级的目录 比如 import pkg/xxxxx
  3. 同级目录引用,或引用上级,你在 pkg/yyy/yyy.go 需要 带域名引用 import xxx.com/group/project.git/pkg/xxx
  4. 所以别用同级目录
  5. 引用的project,增加deploy token,以便被引用。
  6. 改gitconfig
    
    [url "https://TOKEN:PW@xxx.com:12345/group/project"]
    insteadOf = https://xxx.com/group/project

7. Enjoy

# 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:https://github.com/golangci/golangci-lint/issues/825

# perf

 go tool pprof -http=:8034 http://a30caa4cf1bdc47bf8644e1deb81bd83-839478928.us-east-2.elb.amazonaws.com:8800/debug/pprof/profile