4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 go articles

go错误处理

Sentinel errors 哨兵模式,例如 ​ if io == io.EOF 优缺点:需要导包,可能循环引用 Error Types ​ 包含error以及其它信息的结构体 优缺点:需要导包,循环引用。但可得到更多的信息。比哨兵模式更好一点。 Opaque errors 黑盒策略,不关心具体错误类型,有错误则返回否则继续或根据是否具有某种行为(实现某种接口)判断是否重试。demo: func fn() error { x, err := bar.Foo() if err != nil { return err } // use x return nil } // type temporary interface { Temporary() bool} func IsTemporary(err error) bool { te, ok := err.(temporary) return ok && te.Temporary() } pkg/errors 携带一个message并可返回原始error以进行Sentinel errors比较的库:github.com/pkg/errors 可避免在多个层多次处理eror go1.13标准库的升级 https://www.flysnow.org/2019/09/06/go1.13-error-wrapping.html errorf %w –>不丢失原error的wrap error。 Unwrap 解一层wrap error Is wrap chain中是否包含 As error转换(断言) rob pike:Errors are values 法1:……

Continue reading

drone cicd实践

​ 在写一个后端的时候,前端的同学需要将接口部署上去。后端还在不断的迭代,因此需要反复编译部署十分麻烦,因此决定将这一套自动化。记录了在使用drone过程中踩的一系列坑。 选型 jenkins:war包, 需要java环境,比较吃内存,生态比较完善。 drone: go实现,可docker直接运行,文档不够详细。 由于之前Jenkins的不好体验,因此这次选择drone。 drone基本概念 drone由server和runner构成。两者通过rpc交互。 server端为web管理服务,可直接通过docker运行。 runner实际执行工作流的部分。 一个Go程序借助gitee的cicd demo 所需物料:gitee账号,配置好docker和go编译环境的linux 配置gitee ​ gitee设置–>第三方应用–>创建第三方应用 ​ 应用主页 :linux主机ip,例如: http://xxx.xxx.xxx.xxx(此处使用http而非https,和后续一致) ​ 应用回调地址 :应用主页地址 + “/login”.例如:http://xxx.xxx.xxx.xxx/login **权限** :选择projects,pr,hook必选。 创建一个secret并记录。可使用以下命令: $ openssl rand -hex 16 在gitee中创建好的应用中读取并记录 Client ID 和 Client Secret 以备下步使用 运行server,此处使用docker方式 # !!!注意替换环境变量 # DRONE_GITEE_CLIENT_ID和DRONE_GITEE_CLIENT_SECRET对应第三步获得的。 # DRONE_RPC_SECRET runner和server交互的secret。任意值,推荐使用第二步生成的值 # DRONE_SERVER_HOST 填写本机公网ip即可 # DRONE_SERVER_PROTO选择 http 以和第一步对应 # DRONE_USER_CREATE需创建超级管理员账号时请添加此环境变量,否则不需要。(trusted仓库时需要,此demo中不需要 docker run \ --volume=/var/lib/drone:/data \ --env=DRONE_GITEE_CLIENT_ID=f7018cd1a520c9e6f7eca37b97761de20 \ --env=DRONE_GITEE_CLIENT_SECRET=8a6bfd074b3c7befe72d5f9647ed02c \ --env=DRONE_RPC_SECRET=super-duper-secret \ --env=DRONE_SERVER_HOST=drone.……

Continue reading

Go Module下使用本地包

介绍两种方式: 方式一(推荐): 严格的说,方式一是使用项目目录下的go文件。 项目目录如下: |── studyModule //项目主目录 | |──log //主目录下文件夹 | | |──log.go // log目录下go文件 | |── main.go // 主目录下go文件 | |── go.mod log.go 中首行 package log,注意,log文件夹下不要go mod init,否则会导致无法编译 studyModule文件夹下 go mod init sts main.go中调用log.go中的方法:import “sts/log”-> 此处为主目录下的mod名下边的log文件夹 log目录下的方法,变量等依然需要大写。如果不能正常使用可尝试在主目录下执行go mod tidy 方式二(使用go mod replace) |── studyModule //项目主目录 | |──4fan.top //主目录下文件夹 | |──|──DY | | | |──DYlogger@v1.1.0 | | | | | |──*.go | | | | | |──go.mod【2】 | |── main.go // 主目录下go文件……

Continue reading