Golang
文章平均质量分 65
翔云123456
这个作者很懒,什么都没留下…
展开
-
Prometheus相关的语言客户端
Prometheus官方提供了多种语言的客户端库,以便开发者可以在不同的编程语言中集成Prometheus监控。原创 2024-09-16 17:03:33 · 1129 阅读 · 0 评论 -
go gc信息如何查看
在Go语言中,可以通过设置环境变量和使用运行时包中的调试功能来打印垃圾回收(GC)的信息。原创 2024-08-24 11:34:02 · 839 阅读 · 1 评论 -
go语言中的GC
GC是 Go 运行时(runtime)的一部分,负责自动管理内存的分配和释放。当程序中的变量或对象不再被需要时,GC 会自动回收这些不再使用的内存空间,使其可以被重新分配给其他变量或对象。Go 的垃圾收集器是并发的,并且是非阻塞的,这意味着它在后台运行,尽量减少对程序执行的干扰。通过自动管理内存,GC 使得 Go 程序员可以更加专注于业务逻辑的实现,而不需要手动管理内存的分配和释放,从而减少了内存泄漏和其他内存相关错误的可能性。GC触发方式包括:自动和手动两种。其中,手动是用户主动调用。原创 2024-08-18 23:27:17 · 460 阅读 · 0 评论 -
如何在Go的函数中得到调用者函数名(caller)
在go语言中,可以通过runtimepackage中 Caller函数获取调用者信息Caller举个例子outputskip 0, caller就是test1skip 1, caller就是test2skip 1, 一个新goroutine执行 test1,caller就是。原创 2023-03-28 21:02:20 · 782 阅读 · 0 评论 -
为什么在连接mysql时,设置 SetConnMaxIdleTime 没有作用
在使用golang 连接 mysql时,为了节省连接资源,在连接使用过后,希望在指定长度时间不再使用后,自动关闭连接。这时,经常会使用,设置最大连接有效时间,使用,设置最大空闲连接时间 max idle time。这两个函数的作用听起来差不多,理论上,都能达到相同效果。但是在实际使用中,却有些出人意料。首先看下测试代码,在以下代码中,设置 max idle time 为传入的参数值,设置 max life time 为传入的参数值,设置 max open conn 为1,原创 2023-02-25 22:08:02 · 1592 阅读 · 0 评论 -
Orchestrator中的hooks函数
Orchestrator中有很多hooks函数,用于调用外部服务做一些配置或者准备等工作。原创 2022-09-30 23:10:21 · 670 阅读 · 0 评论 -
golang 连接mysql 的时间参数loc, parseTime
在使用golang连接MySQL的时候,经常会用到和。这两个参数的作用是什么呢?先说下不带这两个参数存在的问题:下面看下这两个参数。如果配置了,MySQL中的、等时间类型字段将自动转换为golang中的类型。 类似的 ,会被转为的零值。否则,如果没有配置或配置了, 只会转为 / 。设置转换为 类型时, 使用的时区信息 (当设置parseTime=true)。默认值 ,表示解析为UTC时间。一般设置为,表示使用当地时间。这个设置只表示解析为类型时,使用的配置。原创 2022-04-30 23:05:18 · 6896 阅读 · 0 评论 -
golang 哪些类型可以作为map key
在golang 中,我们已经熟知的可以作为map key 的类型有 string, int。那还有哪些类型可以作为key,哪些类型不可以呢?本文对此做下简单介绍。在golang规范中,可比较的类型都可以作为map key,包括:类型说明boolean 布尔值numeric 数字包括整型、浮点型,以及复数string 字符串pointer 指针两个指针类型相等,表示两指针指向同一个变量或者同为nilchannel 通道两个通道类型相等,表示两个通道原创 2022-03-26 22:52:16 · 10486 阅读 · 0 评论 -
golang 使用go-sqlmock对 insert, update, delete, select做单元测试
上篇文章go 单元测试go-sqlmock 已经介绍了如何使用go-sqlmock进行 sql相关的单元测试。本文着重介绍平时开发过程中常见的例子。目录模拟insert模拟update模拟delete模拟select模拟insert例如以下 insert 代码。package orangeimport ( "database/sql" "fmt")type OrangeProcess struct{ Id int64 Hostname string原创 2022-03-05 23:23:47 · 3023 阅读 · 0 评论 -
MySQL error 是哪里来的
目录1.MySQL error分类2.测试3.参考在使用MySQL的过程,有时会遇到MySQL 报错信息,例如,权限报错:Error 1045: Access denied for user 'root'@'10.3.18.88' (using password: YES)连接报错:Error 2013: Lost connection to MySQL server during query无法识别的MySQL server报错:Error 2005: Unknown MySQL ser原创 2021-11-28 15:37:31 · 801 阅读 · 0 评论 -
golang 中时间差的计算
操作系统提供两种时钟:“wall clock” 墙上时钟 和 “monotonic clock” 单调时钟,wall clock 会受到时钟同步的影响,用于显示时间。monotonic clock 用于计量时间,例如 时间大小比较,时间差计算。不会时钟重置的影响。例如,下面代码中,计算耗时,耗时一直是正的,20ms。即使 wall clock 被重置。start := time.Now()... operation that takes 20 milliseconds ...t := time原创 2021-06-05 22:42:27 · 4548 阅读 · 0 评论 -
go 单元测试go-sqlmock
目录文章目录1.安装2.举例3.参考在数据库应用开发过程中,会在数据库上执行各种 SQL 语句。在做单元测试的时候,一般不会与实际数据库交互,这时就需要mock 数据库操作。即在不建立真实连接的情况下,模拟 sql driver 中的各种操作。本文介绍golang中 mock sql 操作的 库 go-sqlmock。1.安装go get github.com/DATA-DOG/go-sqlmock2.举例介绍下github上的例子:代码中,执行有两个操作 update和insert原创 2021-03-28 23:33:48 · 3957 阅读 · 0 评论 -
go 单元测试 gomonkey
单元测试中,经常需要mock。例如,一个函数中,需要调用网络连接函数建立连接。做单元测试时,这个建立连接的函数就可以mock一下,而不真正去尝试建立连接。gomonkey 就是这样的工具库。mock 有时也称为“打桩”。例如,mock一个函数,可以说,为一个函数打桩。本文主要介绍使用gomonkey进行mock。1.安装$ go get github.com/agiledragon/gomonkey2.使用方法2.1 mock一个函数下面例子中,调用链是:Compute()–>原创 2021-03-27 23:49:26 · 10959 阅读 · 3 评论 -
Cannot modify session.sql_log_bin inside a transaction
目录问题解决方案参考问题当主库上数据的某些变更,不希望复制到从库上时,经常会将sql_log_bin关闭,使更新操作不记录bin log。例如,在一个连接会话开始的时候,关闭sql_log_bin,接下来,这个连接上执行的更新操作都不记录bing log。为了保证,关闭sql_log_bin和更新操作,是在同一个连接上,我们会想到使用事务transaction。但在使用事务过程中,遇到如下报错:Error 1694: Cannot modify @@session.sql_log_bin ins原创 2021-02-28 16:23:04 · 1204 阅读 · 0 评论 -
数据库事务transaction
目录1.什么是事务?2.golang中对事务的支持开启事务执行更新操作提交回滚例子3.参考1.什么是事务?数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。–百度百科例如,转账就是一个事务,它由两个操作组成:将款项从第一个账户划出。将款项存入第二个账户。这两个操作要不全部成功,要不全部不成功。如果第一个操作成功了,而第二个操作失败了,原创 2021-02-28 14:47:26 · 728 阅读 · 0 评论 -
golang 中map的并发安全
目录1.加锁的map2.使用sync.Map3.参考golang 自带的map不是并发安全的,并发读写会报错:fatal error: concurrent map read and map write一般的解决方式是加锁,控制互斥。1.加锁的map如下代码所示:package mainimport ( "fmt" "sync" "time")type Map struct { m map[int]int sync.RWMutex}fun原创 2021-02-27 16:26:19 · 1192 阅读 · 1 评论 -
golang slice的判空 和 并发安全
目录文章目录如何判断slice是否为空slice的并发如何判断slice是否为空判断slice是否为空,不能与nil进行比较做判断,因为slice有可能已初始化。而是应该使用len计算长度。例如package mainimport ( "fmt")func main() { var slice1 []int slice2 := []int{} fmt.Println("slice1 == nil:", slice1 == nil) fmt原创 2021-02-27 15:24:33 · 2085 阅读 · 0 评论 -
golang 中奇怪的空切片
本文中介绍一个奇怪现象,一个空列表(或切片),却可以打印出列表中的内容。以下代码中,在一个json字符串中,定义一个列表,列表中有一个空字符串。接着,将json字符串解析到结构体中,最后,打印结构体中的字符串列表。package mainimport ( "fmt" "encoding/json")type Host struct { IPList []string}func main() { b := []byte(`{"IPList": [""]原创 2021-02-11 21:48:29 · 512 阅读 · 0 评论 -
golang 单元测试覆盖率
目录单元测试覆盖率示例代码执行单元测试查看具体的测试覆盖情况参考单元测试是代码质量的重要保证,测试覆盖率是关键的衡量指标。在golang 中,通过go test 进行单元测试,并可以分析覆盖率。单元测试覆盖率示例代码首先看下示例代码。新建目录utils,目录有以下文件 lltotal 16-rw-r--r-- 1 lanyang staff 132B 12 31 21:09 add_hint.go-rw-r--r-- 1 lanyang staff 360B 12 31原创 2021-01-02 22:26:41 · 3419 阅读 · 1 评论 -
go 单元测试—只执行指定的单元测试函数
本文介绍go单元测试中,如何执行指定的单元测试函数。首先看下示例代码。新建目录utils,目录有以下文件 lltotal 16-rw-r--r-- 1 lanyang staff 132B 12 31 21:09 add_hint.go-rw-r--r-- 1 lanyang staff 360B 12 31 21:09 add_hint_test.goadd_hint.go 文件内容如下:package utilsfunc AddPrefix(s string) st原创 2020-12-31 21:44:21 · 5070 阅读 · 1 评论 -
golang 匿名结构体成员,具名结构体成员,继承,组合
目录文章目录1.匿名结构体成员---继承例子1例子22.具名结构体成员--组合例子1例子23 参考本文将介绍继承、组合这些复用概念在golang中是如何体现的。在golang中,通过匿名结构体成员,可以访问匿名结构体中定义的的方法,就是所谓的实继承。通过具名结构体成员,也可以访问该结构体中定义的方法,这就是所谓的组合。1.匿名结构体成员—继承例子1结构体A1中包含匿名结构体A。定义A1的变量a1,通过a1访问A的方法。package mainimport ( "fmt")原创 2020-11-07 23:02:19 · 1652 阅读 · 1 评论 -
golang go-sql-driver/mysql基本原理
目录1.驱动注册2.打开一个database3.查询4.参考上篇文章关于golang database_sql 包讲述了 database/sql 的整体设计框架。本文简要介绍go-sql-driver的调用关系,是如何与database/sql关联起来的,包括从驱动注册到具体查询,每个步骤的底层调用。我们查询MySQL的大体代码demo如下:package mainimport ( "database/sql" "log" _ "github.co原创 2020-11-01 22:59:51 · 1645 阅读 · 0 评论 -
Orchestrator 集群扩容后新节点无法加入集群 raft: Remote peer 10.23.116.176:10008 does not have local node
Orchestrator是基于Raft的分布式集群。现在原有三节点集群基础上,新扩容两个节点。所有节点更新配置文件,并重启后,新的节点无法加入集群。新节点报错信息;2020/09/04 15:22:53 [WARN] raft: Heartbeat timeout from "" reached, starting election2020/09/04 15:22:53 [INFO] raft: Node at 10.77.243.28:10008 [Candidate] entering Can原创 2020-09-06 15:56:58 · 363 阅读 · 4 评论 -
关于golang database_sql 包
golang中的标准库database/sql 包为SQL和类SQL数据库的操作提供了通用的接口。database/sql 包 必须与数据库driver 配套使用。目前已有的SQL database drivers 见链接。这里面就包括比较常用的MySQL driver go-sql-driver/mysql 。database/sql 包的设计可以说是很巧妙。它对于上层应用提供了标准的API接口,对下层驱动driver暴露了简单的驱动接口。并且实现了连接池的管理。这意味着,不同数据库的驱动只需原创 2020-09-05 22:58:38 · 893 阅读 · 0 评论 -
无锁加载配置
动态加载配置,是服务中常用的功能。动态加载配置是指不重启服务情况下,使配置文件的改动或者其他方式的改动生效。一般普遍使用的方式是,加锁方式。其步骤大体过程如下:从配置文件中读取配置到新的配置变量加锁将新的配置变量赋值给已有的配置变量解锁使用新的配置接下里,介绍一种方式,即无锁加载配置。golang中的atomic 提供了大量底层同步原语。其中的Value就是本文的重点。下面是加载配置的例子:package mainimport ( "log" "sync/a原创 2020-07-26 12:37:38 · 245 阅读 · 0 评论 -
go tool trace 浏览器空白页问题 trace shows blank page
问题使用go tool trace时,会打开浏览器显示相关页面,但有很多链接无法打开,显示空白页。页面中的报错:Uncaught ReferenceError: tr is not defined at trace_viewer_html.js:595Uncaught ReferenceError: tr is not defined at onResult (trace?goid=3126858:73) at trace?goid=3126858:57在github原创 2020-07-12 16:37:17 · 998 阅读 · 0 评论 -
godoc的使用
如何在本地轻松查看go document?如何解决godoc无法找到的问题:GolangDoc: Could not find godoc, (hint: is godoc installed?)本文将介绍如何使用godoc查看go语言文档。安装godocgo get -v golang.org/x/tools/cmd/godoc启动Go Documentation Servergodoc -http=:6060在浏览器中,打开urlhttp://localhost:go doc原创 2020-07-11 16:43:48 · 1515 阅读 · 0 评论 -
orchestrator raft leader频繁变化问题
最近在使用orchestrator的过程中,遭遇了严重的问题。最初上线的几个月里,raft leader非常稳定。但随着时间的推移,raft leader 频繁变化的问题就爆发了。leader的变化,直接原因,就是leader没有按时发送heartbeat,从而触发了选举机制。第一个怀疑的原因,就是网络抖动,出现丢包。但是,通过查看监控数据,发现没有丢包迹象。接着,通过tcpdump抓包,也证实没有数据丢失。第二个怀疑的是,raft的代码实现有问题。查看github仓库,已经很长时间没有relea原创 2020-07-04 23:26:59 · 483 阅读 · 3 评论 -
golang mysql unexpected EOF(invalid connection)
1.问题在使用go-sql-driver/mysql连接MySQL 服务过程,隔一段时间,会报MySQL连接错误:[mysql] 2020/05/09 02:02:01 packets.go:36: unexpected EOF2020-05-09 02:02:01 ERROR goroutine 59835131 invalid connection排查下来,是由于使用无效的连接导致的。基本场景是:client 连接MySQL,执行SQL后,不立刻关闭连接。client保留连接在连接池中。原创 2020-05-24 15:39:45 · 9096 阅读 · 0 评论 -
制作docker映像(三)--golang应用程序
本篇文章与制作docker映像(二)–golang应用程序的不同之处在于,不会拷贝程序源代码到容器中,而是通过挂载数据卷的方式,使容器与容器共享文件。1. Dockerfile首先新建项目目录,目录中的文件如下:[lanyang@localhost docker_demo]$ cd myapp3[lanyang@localhost myapp3]$ lltotal 8-rw-rw-r-...原创 2020-02-16 22:16:51 · 296 阅读 · 0 评论 -
制作docker映像(二)--golang应用程序
本文以简单golang应用为例,介绍docker映像制作。1.创建Dockerfile工程目录结构如下:[lanyang@localhost docker_demo]$ mkdir -p myapp2[lanyang@localhost docker_demo]$ cd myapp2/[lanyang@localhost myapp]$ ll$ lltotal 8-rw-rw-r-...原创 2020-02-15 19:50:56 · 456 阅读 · 0 评论 -
go goroutine id
使用go语言开发过程,很多情况,需要了解goroutine的执行情况,尤其在大量并发场景中,需要根据日志跟踪任务的执行情况,这个时候可以大致根据goroutine id来跟踪程序执行的状态。在go语言中,没有获取goroutine id(简称goid)的API。为什么没有提供呢?原因如下:为了避免采用Goroutine Id当成Thread Local Storage的Key。强烈...原创 2019-12-28 23:21:24 · 921 阅读 · 0 评论 -
go语言中 json转换--nil
go语言中如果一个变量的值为nil,是否能否为json?如果能否转换,转换后的结果是什么?下面直接看下例子。package mainimport ( "encoding/json" "fmt")func main() { marshalTest()}func marshalTest() { b, err := json...原创 2019-12-28 22:12:40 · 2311 阅读 · 0 评论 -
go module 使用举例
在go语言,从1.11开始,引入module,进行版本管理。通过使用module,工程目录的位置不用必须放在GOPATH下。本文介绍 module的使用。下文中用的Go版本是1.13。1. go mod命令通过go mod可以进行modules的相关操作。首先看下 go mod命令:$ go help modGo mod provides access to operations ...原创 2019-12-22 17:56:43 · 343 阅读 · 0 评论 -
关于go module
从Go 1.11开始引入module,用于版本管理。当前版本是1.13,下文中将以Go1.13为例介绍module。在Go 1.13中,继续使用临时环境变量GO111MODULE来设置是否使用module。1.关于GO111MODULEGO111MODULE 可设置为off, on, 或auto (默认)。1.1 GO111MODULE=on如果GO111MODULE=on, go ...原创 2019-12-21 22:21:11 · 727 阅读 · 0 评论 -
golang 故障模拟工具failpoint的使用
测试是功能上线之前的重要环节。测试过程中,要尽量覆盖各种场景。故障情况或异常情况下的场景测试,也是必不可少的。如何模拟故障呢?在FreeBSD 中, failpoints经常用来模拟故障。在golang,也有failpoint的实现,就是目前pingcap 公司的开源项目failpoint.下面介绍golang中的failpoint的实现。1.安装failpoint工具cd $GO...原创 2019-11-15 20:09:27 · 1762 阅读 · 0 评论 -
golang中mysql建立连接超时时间timeout 测试
本文测试连接mysql的超时时间。这里的“连接”是建立连接的意思。连接mysql的超时时间是通过参数timeout设置的。1.建立连接超时测试下面例子中,设置连接超时时间为5s。MySQL server IP是192.168.0.101,端口3306。每3s执行一次SQL。// simple.gopackage mainimport ( "database/s...原创 2019-10-27 21:46:51 · 5821 阅读 · 0 评论 -
Golang 空指针nil的方法和数据成员
golang中,有一个特殊的指针值nil.如何使用nil没有方法和成员变量呢?下面来看下具体例子。程序中,定义结构体类型Plane, 将Plane类型的指针作为函数的参数,然后传入nil作为实参。在函数中,使用nil访问Plane的方法。package mainimport ( "fmt")type Plane struct { Num int...原创 2019-10-17 22:49:40 · 3183 阅读 · 0 评论 -
MySQL 的连接时长控制--interactive_timeout和wait_timeout
在用MySQL客户端对数据库进行操作时,如果一段时间没有操作,再次操作时,常常会报如下错误:ERROR 2013 (HY000): Lost connection to MySQL server during queryERROR 2006 (HY000): MySQL server has gone awayNo connection. Trying to reconnect...这...原创 2019-10-13 17:37:38 · 13982 阅读 · 3 评论 -
查看MySQL 连接信息--连接空闲时间及正在执行的SQL
MySQL 客户端与MySQL server建立连接后,就可以执行SQL语句了。如何查看一个连接上是否正在执行SQL语句,或者连接是否处于空闲呢?下面我们做下测试。1.查看连接的空闲时间首先看下测试程序。代码中,每3s执行一条sql语句。//conn_idle_time.gopackage mainimport ( "database/sql" "...原创 2019-10-13 13:02:47 · 2447 阅读 · 0 评论