![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
comin2014
学无止境!
展开
-
推荐一个golang压缩、解压库unarr
golang 解压 压缩 zip 7z原创 2022-12-10 15:12:56 · 589 阅读 · 1 评论 -
Golang利用反射设置结构体中的项, Json数据源
项目中遇到涉及到动态修改配置的需求, 动态设置的数据项有多种类型, 基础类型 int/string都有reflect的原生支持, 如果遇到其他类型的时候如何处理?我这里想到的是: 其他类型统一使用json反序列,然后利用反射设置.正确运行代码如下:package mainimport "fmt"import "encoding/json"import "reflect"type Settings struct { A int B [][]int}func main(原创 2021-12-27 17:16:41 · 381 阅读 · 0 评论 -
MongoDB Golang 示例代码
包含 增删改查,索引设置,事务,max,cout等的使用 和 压力测试其中事务需要有 replica set集群支持完整代码如下:package mainimport ( "context" "flag" "fmt" "go.mongodb.org/mongo-driver/bson" "log" "math/rand" "sync" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-dr原创 2021-11-19 11:29:31 · 750 阅读 · 0 评论 -
MongoDB max 获取最大值 (Golang)
mongoDB里某个集合,获取某个字段最大值,有两种办法,一个是用sort,另一个是用聚合(Aggregate),下面是代码演示:sort:func initIDEx() { clientOptions := options.Client().ApplyURI("mongodb://localhost:27017") client, err := mongo.Connect(context.TODO(),clientOptions) if err != nil { return原创 2021-11-17 15:51:34 · 4146 阅读 · 0 评论 -
Fork Go 开源库后的使用问题
因为GO不支持相对路径导入,导致Fork开源库后出现分支和master不是很兼容的问题,见前一篇博客,GO 导入(import)相对路径(Relative Path)的问题库的内部引用需要全部修改,例如源库为 github.com/someone/M, 其中有内部package P1/P2,在内部引用时,必须使用全路径引用,即 “github.com/someone/M/P1”,而fork之后我的分支需要对所有这些import进行修改,->"github.com/myrepo/P1",这样会导致之原创 2021-11-02 11:48:59 · 297 阅读 · 0 评论 -
GO 导入(import)相对路径(Relative Path)的问题
1、问题的产生: 在github上fork一个开源项目之后,想要修改部分代码后供公司项目使用。发现需要修改源项目中的所有内部import,例如开源模块 M中存在P1、P2等package, 其中P2 import P1的import路径为 “github.com/someone/M/P1”,而我fork的分支里则是需要import 自己修改后的"github.com/myself/M/P1",与此类似,整个开源项目里很多这种地方都需要修改。所以引出了对相对路径导入的思考,有没有什么办...原创 2021-11-01 17:24:28 · 7497 阅读 · 0 评论 -
实测 ——Mysql 通过预处理(Prepare)提升性能
经过本人实测,采用预处理,性能提升大约接近10%。关于预处理的介绍,网上资料很多,总体关心优点有如下:预处理优点预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行); 绑定参数减少了服务器带宽,只需发送查询的参数,而不是整个语句; 预处理语句针对SQL 注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。测试代码:package mainimport ( _ "github.com/go-sql-driver/mysql" "fmt" ".原创 2021-10-28 17:06:40 · 657 阅读 · 0 评论 -
分享一个GO 辅助命令行
额外开启一个协程,循环获取输入,然后解析输入之后通过注册的cmdmap找到对应的callback进行调用。要注意协程安全!!要注意协程安全!!要注意协程安全!!命令与参数之间用空格分隔,如:完整代码如下:package ctlimport ( "bufio" "errors" "os" "strings")type cmdinfo struct { cmd string desc string fn func(str string)}.原创 2021-10-27 10:38:13 · 122 阅读 · 0 评论 -
Redis 管道(pipeline)运用
Redis在进行大批量操作时,为了提高运行效率,往往会采用pipe,今天实测对比了一下管道的运行效率,还是挺惊人的.package mainimport ( "flag" "fmt" "github.com/go-redis/redis/v8" "context" "time")func main() { var pipucot int = 1 flag.IntVar(&pipucot, "pc", 1000, "pip批量处理个数") flag.Parse()原创 2021-10-21 11:21:01 · 141 阅读 · 0 评论 -
ZooKeeper 实战(GO)
1、安装和基础操作1、下载地址Apache ZooKeeper2、解压后进入目录:tar -zxvf apache-zookeeper-3.7.0-bin.tar.gzcd apache-zookeeper-3.7.0-bin3、配置 拷贝一份conf/zoo_sample.cfg,命名为zoo_1.cfg 单实例情况下,配置不用做修改4、启动 bin/zkServer.sh start conf/zoo...原创 2021-10-20 15:03:36 · 43626 阅读 · 0 评论 -
GO Excel 转 JSON (完整代码)
package mainimport ( "fmt" "github.com/xuri/excelize/v2" "io/ioutil" "os" "path/filepath")func init() {}// 配置文件目录var configPath string = "../../Configs"var outjsonPath string = "./json/"func getFileList(path string) []string { var all_f.原创 2021-09-18 10:18:59 · 1337 阅读 · 0 评论 -
GO exec.Command使用
func main() { cmd := exec.Command( "cmd.exe", "/C", "test.bat") // 设置工作目录,Dir可行,Path还不知道干啥的 //cmd.Path = "" cmd.Dir = "E:/test/" // 执行cmd方式一: start wait //err := cmd.Start() //if err != nil { // fmt.Println("err:", err.Error()) //} //cmd.Wai..原创 2021-09-17 16:48:19 · 3217 阅读 · 0 评论 -
GO使用io.Copy复制文件
func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } defer src.Close() dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644) if err != nil { return } defer dst.Clos.原创 2021-09-17 14:25:02 · 1041 阅读 · 0 评论 -
Go panic: interface conversion 接口转“父类”失败
普通的 interface 转 struct 很简单:接口对象后面加上 .(StryctType) 即可.但是复杂一点的,如接口IA的对象a是组合了Stuct A(实现了接口IA)的的Struct AA或者Struct AAA时,想通过接口转“父类”,就麻烦了, 如下:package mainimport ( "fmt" //"reflect")type IA interface { Fun()}type A struct {}func (slf *A) AFu原创 2021-08-05 14:07:45 · 1654 阅读 · 0 评论 -
GO list 修改元素值
// insertValue is a convenience wrapper for insert(&Element{Value: v}, at).func (l *List) insertValue(v interface{}, at *Element) *Element { return l.insert(&Element{Value: v}, at)}通过看底层代码发现,list中存储的是insert的元素的拷贝, 所以想修改元素值,只能在insert的时候插入.原创 2021-08-03 18:21:46 · 693 阅读 · 0 评论 -
MySQL Redis一致性方案 推荐go-mysql/canal
在项目初期时, 为解决Mysql和Redis的数据同步问题, 选择了阿里开源的Canal方案, 然后压力测试时, 解决了Redis并发写入的问题后, 随之而来的瓶颈出现在了Canal client消费速度, 本机测试大约1.3w/s, 不光如此, 使用阿里的Canal还存在一些弊端:外部程序, 资料不够详尽, 社区交流效率低下, JAVA源码(我不熟悉)且臃肿(大致瞥了一眼)等等因素, 导致遇到问题不好解决, 目前开发测试阶段遇到问题也没有得到即时答复.排查问题困难重重.然后经过一番思索和查阅,原创 2021-07-09 16:39:39 · 2032 阅读 · 15 评论 -
Redis的key竞争问题 一个简单的解决方案
项目正采用阿里的canal开源项目作为mysql和redis的数据一致性方案, 当Canal client从Canal Server消费数据时, canal保证了时序, 但是在client端写入Redis时, 发现单连接顺序执行的效率不够, 会影响整体消费速率.首先想到的是加锁的方案, 单机情况, 对一个key进行redis写入操作时, 先获取key的锁, 然后执行, 多个redis连接协程同时执行时,这样也无法完全避免时序问题,还需要加时间戳, 分布式的情况下,更麻烦, 通常还要考虑第三方工具..原创 2021-08-04 00:44:20 · 124 阅读 · 0 评论 -
大量连接时使用 使用epoll管理 or golang 多协程
最近开发了一个针对游戏服务器框架测压机器人, 当大量的机器人连接建立时, 通常的做法是给每个机器人配置一个网络read协程, 但是当机器人数量比较高时, 协程的竞争还是很明显的, 正好无意中看到一个百万级连接服务器的文章,学习了一下epoll对conn io的管理, 自己鼓捣了一下,写了个测试工程, 现将代码分享一下, 有兴趣的可以参考参考注:限Linuxepoller.gopackage mainimport ( "log" "net" "reflect" "sync" "golang原创 2021-06-24 18:43:06 · 387 阅读 · 0 评论 -
简易磁盘写入速度测试工具(GO)
最近遇到一个MySQL数据写入异常的问题, 由于之前踩过磁盘IO速度的坑, 所以这次也优先排查磁盘写入速度是否有问题, 废话少说, 上代码:package mainimport ( "os" "log" "time")var filename = "test.txt"func write() { // 1K s := "123456789012345678901234567890123456789012345678901234567890123456789012345678901原创 2021-06-18 11:51:21 · 932 阅读 · 0 评论 -
MySQL5.7性能测试 单表多少行
关于Mysql单表最大行数建议,网上众说纷纭,有说500W的, 有说2000W的, 为了搞清楚Mysql单库单表的实际性能情况, 纸上得来终觉浅,我最终进行了一次测试.测试环境: 16核, 16G, SSD, Windows10, Mysql5.7, 单库单表, 语言以及驱动:golang, gormmysql主要配置如下(因为同时还在作开发机使用,所以配置的不是很专业):log-bin=mysql-binbinlog-format=ROWinnodb_autoinc_lock_mode=2in原创 2021-08-04 00:50:52 · 489 阅读 · 0 评论 -
跨平台 go 编译控制
在Windows下开发, 有时候会用到一些系统库, 因此会用到syscall, 比如最近项目中需要设置Windows控制台窗口标题, 在开发时也考虑到了跨平台的情况, 还特意在代码中加了 if runtime.GOOS != "windows" { //// }但时到Linux下编译不过, syscall仅支持Windows.自然而然想到了go的编译控制:在文件头加入如下标签://+build windows然后编译的时候添加tag参数go build -tags="windows"原创 2021-06-04 15:30:15 · 330 阅读 · 0 评论 -
golang 分布式框架Origin学习笔记
最近项目的后端需求是全球同服的,在使用语言方面确定了为golang之后,了解了一下当前的一些goalng游戏服务器框架,终于在leaf/pitaya/ 等众多框架中选择了 Origin, 主要是因为它是分布式框架,微服务架构,比较匹配做全球同服需求下的功能模块分离。 各个框架对比图待补充目前基本已经上手,现在总结归纳一下一些需要注意和记住的点:1、服务的安装2、rpc的使用细节3、Origin核心思想这个得从config说起,config/cluster.json,这个是目前版本origin(作者原创 2021-04-20 10:28:33 · 3525 阅读 · 0 评论