gin框架中如何实现流式下载
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 团队中之前的文件下载做得比较复杂,因为担心量太大,是后台做异步的下载,最终生成文件,传送文件到CDN服务器,最后再告诉用户下载链接。 其实在查询接口中就可以实
阅读全文
【解决一个小问题】proto文件中的enum,去掉长长的重复的enum名字
摘要:在proto中定义的enum,通常类型名字都会带上enum的前缀,很丑陋,如何去掉呢? enum DataSourceType{ NotUse = 0; MySQL = 1; ElasticSearch = 2; } 生成后的代码如下: const ( DataSourceType_NotUse D
阅读全文
用golang开发系统软件的总结
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 2024-10-31 增加主题:tinyGo 项目的介绍和思路 2024-05-17 增加主题:指导编译器生成cpu cache友好的代码 2024-03-2
阅读全文
【小测试】读取*.proto文件,再读取service中method的注释
摘要:想要在proto3中定义service,及其service的method。然后在method后面加上特殊注释,通过这个特殊注释来动态生成代码。 下面是测试代码: import ( "github.com/golang/protobuf/protoc-gen-go/descriptor" "githu
阅读全文
写好海量后台服务最重要的是意识
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 刚入行不久的我曾有一个想法:假设几个超牛的架构师,带着一群会编程的蓝领工人,熟练了严苛的开发规范后,是不是也能写出复杂的厉害的软件? 我想说的是:起码在海量后
阅读全文
【一个经典BUG】gin框架中,异步协程使用context导致取不到数据
摘要:bug的内容大致如下: func httpHandle(c *gin.Context) { go func(ctx Context){ v := ctx.Value("xxx") // 这里取不到值,导致后续发生panic }(c) } 1.发生panic是随机的; 2.问题的原因是:当协程开始使用
阅读全文
【记录一个问题】gin框架中,ShouldBindUri()函数依赖特定版本编译器,更换库的版本号后导致panic
摘要:panic发生在这一行: uriBindErr = c.ShouldBindUri(methodLastInParam.Interface()) 导致panic的堆栈信息如下: err=reflect: call of reflect.Value.Interface on zero Value st
阅读全文
【小优化】golang中取两个字符串的公共前缀的长度
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 在VM的merge部分的代码中发现这样一个函数: func commonPrefixLen(a, b []byte) int { i := 0 if len(
阅读全文
玩一玩golang汇编
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 因为只是玩一玩,所以走的路线是:用C写代码,把C编译成AT&T格式汇编,把AT&T格式转换成plan9格式,在golang中调用plan9汇编。 c代码 函数
阅读全文
【小测试】golang中数组边界检查的开销大约是1.87%~3.12%
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 对比C/C++, golang等类型安全的语言会在数组访问的代码前,通过编译器加入边界检查的代码。 当发生越界的时候,引发panic,而不是实际发生越界导致的
阅读全文
【小实验】golang中的字节对齐
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 使用golang来调用SIMD指令,发现程序崩溃了: __m128i xx = _mm_load_si128((const __m128i_u *)p); g
阅读全文
一个神奇的golang技巧:扩大heap内存来降低gc频率
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 具体的文章请看:https://web.archive.org/web/20210929130001/https://blog.twitch.tv/en/2019/04/1
阅读全文
如何计算一个uint64类型的二进制值的尾部有多少个0
摘要:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 正文 这实在是一个很简单的问题,用代码可以表示如下: func CountBit0(x uint64) int{ cnt := 0 for i:=0; i<64; i++{
阅读全文
【小实验】golang的if比较中的string/[]byte转换会被编译器优化
摘要:之前做了实验,[]byte类型使用string()进行转换的时候,会产生拷贝。see: 【小测试】golang中使用string()来转换[]byte数组产生了拷贝 不过今天又有了新的认识。请先看下面的benchmark测试: // goos: windows // goarch: amd64 //
阅读全文
【学到了】golang的[]byte可以append string类型的数据
摘要:上代码: func Test_use_string(t *testing.T){ arr := make([]byte,0, 100) arr = append(arr, "abcd"...) t.Logf("%+v", arr) } 看越多开源代码,越觉得自己其实不会写golang.
阅读全文
golang: 学会几个语法上的新写法
摘要:看了VictoriaMetrics,学会了几个新写法,记录下来: 1. 数组拷贝 以前: arr := make([]byte, 0, len(oldArr) arr = append(arr, oldArr...) 现在: arr := append([]byte{}, oldArr...) 2.
阅读全文
【小测试】golang中使用string()来转换[]byte数组产生了拷贝
摘要:下方是benchmark的数据差异: import ( "reflect" "unsafe" ) // NoAllocString convert []byte to string func NoAllocString(buf []byte) string { return *(*string)(u
阅读全文
介绍一个golang库:zstd
摘要:zstd是facebook开源的一个C语言的压缩库。 从官方提供的压测数据看,它的压缩速度与众所周知的以快著称的snappy的压缩速度几乎持平,但是压缩率上比老牌的gzip还要高。 再看看zstd吊打gzip这张图: 最快每秒压缩512MB 最高达到4倍压缩率 跑得快,拉得多,我们这种搞网络数据运输
阅读全文
介绍一个golang库:fastcache
摘要:学习VictoriaMetrics源码的时候发现,VictoriaMetrics的缓存部分,使用了同一产品下的fastcache。下面分享阅读fastcache源码的的结论: 1.官方介绍 fastcache是一个用go语言实现的,很快的,线程安全的,内存缓存的,用于大量对象缓存的组件。 它的特点是
阅读全文
【记录一个问题】go1.17中,把代码文件放在main.go的同级目录,导致无法编译
摘要:写了类似目录结构的代码: myproxy - main.go - server.go 编译的时候总是出现main.go中找不到类型定义。但是用goland却可以直接执行。 最后调整了目录结构后解决: myproxy - main.go - internal - server.go 猜测是go1.17
阅读全文