Go语言学习笔记
文章平均质量分 68
学习Go语言遇到的一些问题和收获
小僵尸打字员
以解决问题为驱动力
展开
-
Go语言框架中如何快速集成限流中间件
在我们的日常开发中, 常用的中间件有很多, 今天来讲一下怎么集成限流中间件, 它可以很好地用限制并发访问数来保护系统服务, 避免系统服务崩溃, 资源占用过大甚至服务器崩溃进而影响到其他应用!通常我们的服务会同时存在多个进程, 也就是负载来保证服务的性能和稳定性, 那么就需要走一个统一的限流, 这个时候就需要借助我们的老朋友-redis, 来进行分布式限流;这个就只适用于单个服务进程的限流, 比如个人搭的一些小网站之类的;上面的代码均摘自我开发的一个开源项目中。原创 2022-10-09 17:20:41 · 702 阅读 · 1 评论 -
Go语言框架中如何快速集成RabbitMq
在我们日常开发中, 消息队列是必不可少的一环, RabbitMq是一个实现了AMQP高级消息队列协议的消息队列服务, 也是我们比较常用的消息队列, 还可以实现延迟消费, 今天来说说怎么把它集成到我们的开发框架中;上面的代码均摘自我开发的一个开源项目中, 主要是一个Go的标准项目布局, 封装了一些常用的组件, 有兴趣的朋友可以了解一下, 新手极易上手;原创 2022-10-09 15:40:08 · 2092 阅读 · 3 评论 -
GO语言框架中如何快速集成日志模块
在我们的日常开发中, 日志模块永远是最基础且最重要的一个模块, 它可以有效的帮我们发现问题, 定位问题, 最后去解决问题;zap是一个可以在go项目中进行快速, 结构化且分级的日志记录包, git star数高达16.3k,Git 项目地址, 在各大公司项目中被广泛使用;...原创 2022-08-16 18:47:18 · 385 阅读 · 2 评论 -
Go函数并发情况的错误处理
最近遇到了一个很有意思的问题, 感觉值得写一篇博客来记录一下, 也在大家遇到这种问题的时候可以有个参考;下面这段代码大家都不陌生吧, 一个简单的多程处理, 大家可以看看有没有什么问题原创 2022-06-30 18:03:22 · 394 阅读 · 0 评论 -
Goroutine 最大数量的限制
前言最近有个朋友, 刚入职没多久就被组长叼了, 原因是他在业务场景中开Goroutine导致测试服务器资源占用过大, 其他服务都崩了…场景类似于监听区块链交易, 对每个区块进行轮询处理每笔交易, 他直接循环开Goroutine处理每笔交易, 数据大了goroutine开的太多导致资源占用过大, 导致了这场悲剧;工作中我们需要开Goroutine来提高代码处理的效率, 但也不能滥用, 需要对它进行一定限制, 保证资源占用在可控范围内, 所以我们需要对项目中Goroutine的数量进行限制, 用chann原创 2022-03-04 15:41:50 · 9834 阅读 · 0 评论 -
Go源码解读-sync.Map的实现
前言我有一个朋友, 最近困扰于map的线程安全问题, 每次都要单独定义个结构体加锁处理, 例如以下结构体type SafeMap struct { m map[string]interface{} mu sync.RWMutex}每次都要加锁解锁太麻烦, 问我有没有其他的实现方式这不巧了吗, 官方考虑到了这种情况已经实现了sync.Map 供使用,让我们看看它是怎么实现的正文存储结构体type Map struct { // 操作写map和miss计数器的时候操作 mu Mutex原创 2022-02-18 11:35:53 · 854 阅读 · 0 评论 -
Fly-小学妹都喜欢的Go后端项目
背景有个漂亮的小学妹要写毕设, 找我帮忙搭个架子, 于是…它来了它来了, 分享下自己写的Go后端框架, 封装了一些(db,socket等)常用的组件, 开箱即用, 纵享丝滑!任何问题, 建议或者需求都欢迎提 issues, 有问必回!github地址gitee地址项目结构参考 Go程序布局├── README.md├── config| ├── dev.json // 各环境配置文件| └── config.go // 配置初始化| └── mo原创 2021-12-14 17:53:16 · 1627 阅读 · 0 评论 -
记一次线上Go服务内存占用异常问题排查
背景最近线上有个服务内存异常增长, 默认服务启动实存应该是25M左右, 但是这个服务运行了一段时间实存达到了32GB的量级, 并且还在缓慢增长, QA重启之后内存就恢复到了初始水准, 需要我们定位一下内存异常的问题进行解决过程整吧那就, pprof整起来, 在main 函数增加三行代码import _ "net/http/pprof"func main() { go func() { _ = http.ListenAndServe("0.0.0.0:6060", nil) }()}原创 2021-11-10 09:56:28 · 1731 阅读 · 0 评论 -
瞄一眼clickhouse(附 go demo)
前言有个朋友业务需要存大量的流水数据, 还希望可以实时根据流水聚合统计, 需求计算的精度到小数点18位(Es和Doris就可以直接ps了), 正好可以看看很火的clickhouse不看不知道, 一看吓一跳, 查询速度是真快啊, 数据压缩也是香了一匹, 运维再也不怕磁盘报警了!简单操作一下因为我要测精度, 就不用官方示例了, 有兴趣的建议了解一下, 比较全搭建直接在 docker仓库 上找到clickhouse的镜像, 拉取就完事了// 拉取镜像docker pull yandex/click原创 2021-07-21 15:16:52 · 1480 阅读 · 7 评论 -
嵌套结构体导出excel的实现方式
// StructValueToSlice 结构体值转入slicefunc StructValueToSlice(val interface{}) (data []interface{}) { // 判断是否为指针 var t reflect.Type var v reflect.Value if reflect.ValueOf(val).Type().Kind() == reflect.Struct { v = reflect.ValueOf(val) t = reflect.TypeO原创 2020-08-09 23:08:50 · 756 阅读 · 0 评论 -
Docker私有仓库搭建&Go服务部署
前言最近有个朋友在写一个新的项目, 想用docker搭建一套测试服务, 问我有没有什么坑需要注意的…其实挺简单的, 也没啥坑, 注意一下时区问题和docker配置就好了大体流程搭建私有仓库docker pull registrydocker run -d -v /data/registry:/var/lib/registry -p 5000:5000 镜像Id这样启动确认没问题就可以了, 然后就是配置的事, docker在1.3之后交互默认使用https, 比如你的机器ip是127.0.0.原创 2020-06-14 19:14:56 · 486 阅读 · 0 评论 -
go 数据导出Excel&前台接收后端返回文件流并在浏览器提供下载
实现package mainimport ( "testing")import ( "github.com/tealeg/xlsx")func TestCreateExcel(t *testing.T) { var user = struct { Name string Age int }{} user.Name, user.Age = "飞起来", 11 // 生成一个新的文件 file := xlsx.NewFile() // 添加sheet页 sheet,原创 2020-05-19 09:17:33 · 7549 阅读 · 4 评论 -
gorm批量插入解决方案
我有一个朋友, 最近用gorm发现官方不支持批量插入, 看官方issue 2014年就有人提过这个问题了, 不过现在还不支持但是问题不大, 官方留出来一个执行原生SQL(db.Exec)的方法来解决这个问题, 而且官方现在在开发v2版本, 在v2版本中就会支持这个功能了但是生活还得继续, bug还是得继续写, 本来想在网上找一个公用方法来维持一下生活, 结果竟然没找见!都是指定单个结构...原创 2020-04-15 22:30:41 · 13498 阅读 · 0 评论 -
Go实现随机加盐密码认证
为什么要加密人们往往有使用同一密码的习惯, 为了防止数据库意外泄露/破坏和出于保护用户隐私的目的, 不应在数据库里存入用户密码明文实现代码package mainimport ( "fmt" "golang.org/x/crypto/bcrypt" "time")func main() { password := []byte("thisIsPassWord") now...原创 2020-03-23 23:41:49 · 3050 阅读 · 0 评论 -
go 发送http请求
写了一下go发送http请求常用的几种方法package mainimport ( "net/http" "io/ioutil" "fmt" "strings" "net/url" "bytes" "encoding/json")func main() { urls := "http://www.baidu.com/" var data = map[string]in...原创 2019-04-23 21:56:22 · 2512 阅读 · 4 评论 -
Go 和Python中的闭包实现及使用
闭包网上闭包的概念已经很多了, 在这就简单说一下体现: 在一个函数内部(外函数)返回另外一个函数(内函数) 内函数使用外函数的局部变量 外函数的返回值是内函数的引用 只要闭包还被使用,那么被闭包引用的变量会一直存在使用场景比如说 你有一个变量需要放到内存中, 然后只希望那个变量由你想要的方式去改变, 其他人不能去改变的时候就可以用到了实例我有一个方法需要判断...原创 2019-08-01 16:40:50 · 258 阅读 · 0 评论 -
go 切片排序以及转为带间隔符的字符串
前言Go 切片排序通过匿名函数来快速实现代码示例package mainimport ( "sort" "fmt" "strings")func main() { // 切片排序 intSlice := []int{ 1, 3, 4, 2, 55, } sort.Slice(intSlice, func(i, j int) bool { return i &g...原创 2019-07-29 12:03:36 · 1587 阅读 · 0 评论 -
go并发访问map的坑 fatal error: concurrent map read and map write
前言go 并发访问map是不安全的, 会出现未定义的错误导致程序退出…坑总得踩一踩才会知道例子先写一个错误的package mainimport "fmt"func test() map[string]interface{}{ taskList := []string{"a", "b"} result := make(map[string]interface{}) for _...原创 2019-06-27 13:34:26 · 4182 阅读 · 0 评论 -
go程阻塞
前言记录一下我自己常用的go程阻塞方法, 确认go程完成sync.WaitGroup主要是用来监听go完成package mainimport ( "fmt" "time" "sync")func a() { fmt.Println("a") time.Sleep(1 * time.Second)}func b() { fmt.Println("b") time...原创 2019-06-27 13:33:32 · 308 阅读 · 0 评论 -
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
前言巨难受, 今天开发的时候遇到的一个错, 百度了一下基本上都说是递归导致的内存超出限制的问题, 前前后后捋了三遍代码, 没发现逻辑问题, (手动愁人) 再此记录一下错误, 避免有人也遇到同样的问题问题原因最后还是根据错误提示找到了问题文件, 对照后发现是 同一个包下互相调用的问题, 这个问题我遇到过, 不是报这个错啊(手动流泪), 看了一下唯一的差别就是一方调用初始化的但是没用, 感觉跟...原创 2019-06-15 20:50:18 · 5707 阅读 · 0 评论 -
Go 接收未知大小文件并转为对应大小的byte字节流
前言场景是我的接口需要接受一个文件, 我需要把他转为 []byte 类型, 但是我不知道文件的大小, 用make创建的不能动态扩容, 导致如果我写死的话所有文件都会变成我写死的那个大小, 造成资源浪费解决方案// 接受文件file, _, _ = ctx.FormFile("file_stream")// 解析文件fil := make([][]byte, 0)var b int64......原创 2019-06-05 10:49:49 · 5749 阅读 · 4 评论 -
Python和Go 同时发送文件和formdata请求
前言用到这个主要是做图片上传, python的好写, go的找各种文档真的挺费劲的…Python# 获取字节流with open("/Users/xiaofei/Downloads/ywdhzxf.jpg", "rb") as f: res = f.read()print(res)# 发送请求resp = requests.post(url='http://127.0.0....原创 2019-05-28 10:51:47 · 1017 阅读 · 0 评论 -
go time常用方法
前言最近开发项目经常用到go的time包, 照python的略微麻烦一些, 特别是那个layout被无数人吐槽(包括我), 这里整理了一些常用的方法, 有需要的可以了解一下package mainimport ( "time" "fmt")func main() { // time函数 layout 2006-01-02 15:04:05 //生成时间 time.No...原创 2019-04-16 21:56:12 · 857 阅读 · 0 评论 -
Go的并发无法执行的坑
前言Go 语言本身支持并发, 只需要通过 Go来启动goroutine就可以了, 语法格式也很简单, 就直接在调用方法前加上go 关键字就可以了, 例如 go hello(x)遇到的问题Go 允许使用go 语句开启一个goroutine (线程)去执行这个函数, 很简单, 但是有一个新手需要注意的地方(比如我), 那就是函数运行时间和进程的运行时间, 因为go语句是开启一个新的, ...原创 2019-03-15 17:56:02 · 1698 阅读 · 0 评论 -
Grpc初体验
Grpc初体验前言因为最近工作涉及到了grpc, 但是不是很了解这个框架, 所以就看了一手 grpc官方文档, 克隆下来代码简单的了解一下概念定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。允许定义四种服务方法1 单项 RPC,即客户端发送一个请求给服务端,从服务端获取...原创 2019-03-14 19:11:46 · 392 阅读 · 0 评论 -
深度剖析Go语言数据结构
转载地址 : http://www.open-open.com/lib/view/open1390373069882.html当向一个新程序员解释Go语言时,我发现如果解释Go的数据是如何在内存中表示的,将有助于建立编写高效程序的良好直觉。基础类型让我们从一些简单的例子开始:深度剖析Go语言数据结构变量i是int类型,在内存中占用一个32位的存储单位。(上图拿32位系统来举例;对以上...转载 2018-11-06 10:36:48 · 635 阅读 · 0 评论 -
go语言基础数据结构学习---- 数组, 列表(list)和切片(slice)
go语言基础数据结构学习–> 数组, 列表(list)和切片(slice)go 语言中的 数组是类型相同的元素的集合, 列表是双链表的容器, 可以添加不同类型的数据 切片是对现有数组的引用, 比数组更方便灵活, 还可以追加数据package mainimport ( "container/list" "fmt")...原创 2018-11-03 18:17:55 · 11836 阅读 · 1 评论 -
go语言基础数据结构学习 ---- 字典(map)
go语言基础数据结构学习–> 字典(map)go 语言中的字典和python 中的字典特性差不多 相同: 键值对, 无序集合, 每个键都是唯一的, 对一个键多次赋值会更新当前键的值; 不同: go语言的字典里面的类型是定好的, 不可变更, python可以随意写类型. package main import "fmt" //字典和python是...原创 2018-11-01 17:04:57 · 1230 阅读 · 0 评论