jinleileiking / learning-notes

Notes for my learning.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

golang

jinleileiking opened this issue · comments

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

  • 分hostname, port:
u, err := url.Parse("http://localhost:8080")
host, port, err := net.SplitHostPort(u.Host)
  • http client
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

  • NopCloseReader的含义就是读完数据就没了,土的办法是read完之后,再造一个,好的方法,参见gin。。
  • gin中间件读requestbody的正确方法:
  • 用shouldbindwithbody! ,但是如果用的话,你就都用withbody,别用json,仔细看代码,为什么 。。。。。。
  • 多了个/ 导致307, 坑:gin-gonic/gin#1004

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

  1. 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:golangci/golangci-lint#825

perf

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