
Go笔记
记录工作中使用Go开发项目常用的功能语法和问题,方便检索参考
Bcc的笔记
2015年开始在搜狐畅游实习,2016年毕业,目前在抖音为直播业务保驾护航,欢迎加入我们
展开
-
go clean -modcache 把$GOPATH/pkg/mod 目录文件清空了如何恢复
scm编辑代码不通过(其实是因为go镜像低于本地go版本导致),oncall 同学抛过来一条命令go clean -modcache && go mod tidy,我对go clean -modcache 是不太清楚真正含义的,以为就是清空下项目的依赖包而已(后来才知道oncall同学也没有对其正确认知),于是就很信任的复制粘贴,按下回车键,然后瞬间慌了,同时Goland打开的三个项目窗口都闪了一下然后代码都不见了,很慌,因为还有未提交的代码,啥都不说了,开始找恢复的方法吧。原创 2023-03-07 20:39:39 · 1954 阅读 · 0 评论 -
GO 通过映射解析字段信息
识别结构体中被设置值的字段,更改结构体中字段的值原创 2022-07-23 10:10:00 · 329 阅读 · 1 评论 -
Gorm 优雅写SQL
多条件筛选的功能还是很常见的,每种筛选条件都可选可不选,这样就有n(n-1)/2种自由组合的方式,如果每种条件是最小单元,就像搭积木一样把他们任意组合,那么代码就会变得更灵活可复用。...原创 2022-07-23 09:34:10 · 878 阅读 · 0 评论 -
Golang 实现定时任务
前言日常运维中难免会遇到主从切换的场景,比如机房迁移、故障机替换等待,为了平滑迁移需要先将待下线主机上的主全部切走,主从切换动作有损所以需要低峰期操作,一般都是凌晨以后,如果联动业务核心指标做好前后校验,其实是可以将该动作自动化的,如果自动化就涉及到定时执行,这里记录下在平台上通过go语言实现定时任务的简单思路通过go语言实现定时任务有两种方法,一种是采用主机自带的crontab机制,go语言有对应的包实现,另一种是采用计时器的方式,如果采用前者,前端需要将通过时间选择器获取的时间转化为定时任务的时原创 2022-01-14 13:40:05 · 5348 阅读 · 0 评论 -
GO 遇到循环调用怎么办
当项目越来越大,难免会遇到两个包相互调用的问题,先不提通过重构文件目录组织结构来避免这种情况,如果项目架构上大方向没有问题,尤其是项目排期紧张时,这时候我们就可以采用一种优雅的方式来绕过循环调用比如pkgA包中定义了方法fa1,其中pkgA中的fa1中调用pkgB包中的fb2,import object/pkgBfunc fa1(){ pkgB.fb2() //调用pkgB包中的fb2方法}pkgB包中定义方法fb1,fb2,而pkgB包中的fb1调用pkgA包中的fa1import ob原创 2021-11-27 15:20:22 · 693 阅读 · 0 评论 -
指针&引用踩坑记录
案例1 如下代码在循环体外定义了变量instance,循环一列表中的元素,每次遍历构造instance结构体实例,然后追加到列表proxyInstances中,所以猜测一下最终proxyInstances列表中的元素会符合我们的预期吗?是的,最后你会发现proxyInstances的元素都是遍历结束后的最后构造的一个元素,原因是因为在外面定义instance时初始化了一片内存用来存储数据,进入遍历后每次构造instance数据时只是更改内存中的数据,内存地址还是那个地址,所以当你将instance的指针原创 2021-11-12 15:45:02 · 227 阅读 · 0 评论 -
go regex 使用case
问题背景对redis执行命令“info memroy”后返回的结果进行了处理转化成了字符串,然后通过regex匹配目标项,就出现了诡异的现象,暂时没有对regex的内部做深入研究,欢迎理解原因的大佬不吝赐教对redis执行info memroy并处理后的结果集存入变量replySlice中,为string类型func TestSendRedisExecMsgToServer(t *testing.T) { var syncMsg *pb.ManagerTaskMsg syncMsg = &am原创 2021-11-11 20:19:09 · 1220 阅读 · 0 评论 -
Golang操作MySQL
操作mysql常用的库有github.com/astaxie/beego/orm和database/sqlorm库支持映射数据结构到表结构,标准化增删改查操作,多用于单表的操作;同时支持原生sql,多用于复杂的多表查询操作,sql库也多用于此场景,有点是灵活,但缺少标准化;记录一下项目开发中用到原生sql的案例1、查询操作返回多行,并处理返回数据,构建结果集列表orm 包操作方式QueryHostInfo() (HostListInfoMap, error) {sql := fmt.Sprint原创 2021-11-03 19:06:54 · 230 阅读 · 0 评论 -
Vscode 调试 GOLANG
配置文件launch.json 举例注: 本地和远程调试均适用{ "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", "request": "launch", "mode": "debug", "program":"${workspaceFolder}/cmd原创 2021-07-01 20:39:39 · 373 阅读 · 0 评论 -
Vscode 远程开发Go语言项目
本地环境:MacOS1、Vscode 安装 Remote Development 插件2、本地主机和远端的主机配置免密登录将本地.ssh/id_rsa.pub文件中的内容追加到远端主机的.ssh/authorized_keys文件中(假如远端的账户为test,本地账户无限制)3、配置远端主机的连接配置内容如Host * ForwardAgent yes ServerAliveInterval 3 ServerAliveCountMax 20 TCPKeepAl原创 2021-05-07 11:04:51 · 580 阅读 · 0 评论 -
macOs 下部署编译kafka exporter项目遇到的问题总结
背景线上kafka集群的topic监控采用的是开源的kafka exporter项目来完成的,近期某个kafka集群由于某个topic写入和消费量很大导致集群中的某两个集群io负载打满,kafka exporter 采集信息也因此超时失败,如果指定某个topic采集则不会出现问题,所以猜测是因为一次批量获取所有的topic元数据信息时,遇到这种极端现象就会比较慢,打算查看下采集的实现逻辑来看下是否有优化的空间kafka exporter项目地址部署时发现依赖go 1.16及以上版本,而本地的环境是原创 2021-04-23 19:51:17 · 761 阅读 · 0 评论 -
Go loop
嵌套loop,子loop达到某个条件后退出所有的looppackage mainimport "fmt"func main() {OuterLoop: for i := 0; i < 10; i++ { for j := 0; j < 5; j++ { fmt.Println(i + j) if i+j == 5 { break OuterLoop } } }}如果子循环中的i+j=5条件满足则退出外部循环,输出0123412原创 2021-01-22 15:36:59 · 1299 阅读 · 0 评论 -
go 函数参数不限定个数和类型的使用
当遇到不限参数个数和类型的函数时,比如redis的Do方法,为了方便调用我们一般会封装一个同一的入口,参数均为命令串,然后再将命令串参数解析成Do函数的参数类型进行调用,这里简单记录一下这类参数的处理过程调用的函数定义如下,从第二个参数起可以传任意多个不限类型的参数,params类型为[]interface{}Do(commandName string, params ...interface{}) (reply interface{}, err error)封装成统一的命令执行入口,这里有关参.原创 2020-12-21 16:57:11 · 1443 阅读 · 0 评论 -
go interface
开发项目时为了易于扩展和复用代码使用到了接口,对接口的几点思考做一下简单总结接口和方法接口中可以定义一些方法,当某个对象具备其中的某个或某些方法时,则就说这个对象实现了此接口,如http_server.gopackage mainimport ( "fmt" "net/http")type Counter struct { n int}func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request.原创 2020-12-20 15:18:06 · 88 阅读 · 1 评论 -
go text/template
我这里主要记录项目开发中有关text/template中不容易在官方文档中找的使用方法,官方文档中的examples中可以直接找到的不再赘述将渲染后的文本输出到变量template的execute方法第一个参数类型时io.Writer,只要是实现此方法的类型都可以,比如os.Stdout、*os.File、*bytes.bufferpackage mainimport ( "bytes" "fmt" "text/template")type User struct { Name .原创 2020-12-14 22:52:51 · 630 阅读 · 0 评论 -
go实现Grpc 传输泛类型的消息体
背景最近在做的项目准备通过grpc进行通信,server端返回的数据类型是不固定的(通过go语言访问redis 中执行redis命令返回的数据类型是interface{}),所以我的诉求是client层可以通过grpc接收到这种泛类型。不将解析结果集的逻辑放在server层主要是考虑了两个方面执行redis命令返回的数据类型包括多种,其中包括嵌套数组,相应的protoc文件中消息结构体定义会变得比较复杂server层作为agent,如果将过多的逻辑放到这一层,后期的迭代更新成本会较大有两种原创 2020-11-15 16:20:12 · 3705 阅读 · 0 评论 -
flag
在写的一个项目中涉及到time.Duration的参数,不清楚如何命令上传此类型的参数,于是需求变为将int转为time.Duration实现如下package mainimport ( "flag" "fmt" "time")func main() { interval := flag.Int("interval", 10, "The i...原创 2020-05-25 17:31:00 · 70 阅读 · 0 评论 -
go 引入外部包的变量踩的坑
最近需要写个kafka topic探活工具,部门的开发技术栈主要是go,也被要求用go实现,只能一边探索一边上手开写(之前一直用python),今天就在一个小点上浪费了很多时间背景:打算将所有的公共变量放到global 包中然后在其他包中引用问题:由于global中的变量首字母不是大写导致无法在其他包中导入成功所以如果需要用做全局变量首字母需要大写,如果是局部变量则可以首字母小写...原创 2020-05-14 21:00:00 · 597 阅读 · 0 评论 -
beego 结构体构造及json转化
已有的beego项目实现一个查询接口,顺便记录一下常用的技术点package controllersApiimport ( "encoding/json" "fmt" "myproject/common" "myproject/models" "reflect" "github.com/astaxie/beego")// 获...原创 2020-10-20 20:47:00 · 829 阅读 · 0 评论 -
beego 实现接口认证
我这里实现的是一个简单的认证方式:使用的固定token本次主要想记录的技术点是获取用户的请求参数和请求头并在路由转发前先做权限校验通过结构体构建嵌套json服务端首先在路由的初始化函数中定义权限认证函数对接口url路由转发前进行权限认证从请求头中获取用户名并注册到ctx中,后端可以通过ctx获取已注册的变量router.gopackage routers...原创 2020-07-30 21:31:00 · 916 阅读 · 0 评论 -
go http get 请求实现
主要记录的功能点设置Header解析返回的消息体,获取需要的那部分服务侧的返回消息体{ "success": true, "message": "OK", "data": { "name": "xxx", "hostName": "xxxxx", "status": 0, "statusTi...原创 2020-08-06 17:13:00 · 539 阅读 · 0 评论 -
main flag redefined: graceful
beego项目新增一个api的校验功能结果运行导致panic/var/folders/3p/jc3w8_dn5dd0r5_5ccp3nrqm0000gn/T/go-build935260114/b001/exe/main flag redefined: gracefulpanic: /var/folders/3p/jc3w8_dn5dd0r5_5ccp3nrqm0000gn/T/g...原创 2020-07-29 19:06:00 · 1356 阅读 · 0 评论 -
Grpc实践
实践参考文档官方grpc小例子分析目录结构helloword.protoclient、server交互的接口定义文件,protoc命令会解析此文件生成对应的接口文件syntax = "proto3";option go_package = "google.golang.org/grpc/examples/helloworld/helloworld";option java_multiple_files = true;option java_package = "io.grpc.examp原创 2020-11-13 15:50:54 · 964 阅读 · 0 评论 -
通过go 语言访问redis
主要记录的功能点配置解析连接redis单侧配置模块定义配置结构体package configtype Configuration struct { // +++++++++++++++日志相关+++++++++++++++++ // 日志级别,这里使用了 beego 的 log 包 Log *LogConfigure `yaml:"log"` // 服务端消息chan长度 ServerMsgChanBufferLength int `yaml:"server-msgcha原创 2020-11-12 14:40:00 · 353 阅读 · 0 评论