Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

golang #19

Open
jinleileiking opened this issue Jul 25, 2023 · 0 comments
Open

golang #19

jinleileiking opened this issue Jul 25, 2023 · 0 comments

Comments

@jinleileiking
Copy link
Owner

jinleileiking commented Jul 25, 2023

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-debug] redirecting request 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

perf

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant