go
文章平均质量分 66
随风奔跑尿飞扬
在梦想的道路上越摔越疼~
有提供工作机会老板请发邮件到 1403539044@qq.com
展开
-
字符串与数字转换的方式对比
可以看到, ascii值计算的方式效率最高。所以在明确传入参数的格式情况下, 用这种方式是最优的。这是一种将字符转换为int64的方式, 优点是可以将多种格式(比如二进制)的字符串转换成int64。源码, 发现它为了兼容多种进制格式的转换,进行多次计算,与字符串判断,所以效率最低。与ParseInt(s, 10, 0)行为一致, 返回int。而我们直接转换的方式快的原因其实是舍弃了完整的逻辑判断。假设我们要将以下字符转换为数字。计算的方式, 并且逻辑更完善。必须确定字符串为可转换的格式。原创 2024-02-28 11:49:58 · 458 阅读 · 0 评论 -
golang中的字符串拼接
在可预知拼接结果长度的情况下, 使用这样的方式来预分配内存是最合适的。其他情况下, 使用buffer都是可以的。原创 2024-01-11 15:05:51 · 1024 阅读 · 1 评论 -
几个有趣的go服务框架
开篇先吐槽几句~我个人有一些习惯, 比如在服务设计时会考虑的比较长远,会考虑到到未来的扩展等等…然后程序设计的抽象成度就会比较高,各个模块之间解耦,但这样往往就会带来程序的复杂度提升。这其实在一些公司里面是不被喜欢的, 因为这可能会延长开发周期(主要的), 增加开发成本, 以及其他同学接手项目是的学习成本。interface多了确实对一个初接手项目的同学不太友好,找起来对应的实现真的是太麻烦了, 大家应该都有这个感觉吧?原创 2024-01-04 17:03:50 · 1281 阅读 · 0 评论 -
golang中的切片传递
golang中的切片传递当前有一个函数和一个结构体定义type s struct { A int}func testFunc(l []s) { fmt.Printf("in testFunc: %p\n",l)}#####测试 1我们首先传递一个切片,并打印他的内存地址func TestA(t *testing.T) { xs := s{A: 10} xs1 := s{A: 20} l := []s{xs,xs1} fmt.Printf("%p\n",l) testFu原创 2021-07-05 13:41:07 · 1571 阅读 · 2 评论 -
golang中cache组件的使用之groupcache(三)
本篇主要解析groupcache源码中的关键部分, lru的定义以及如何做到同一个key只加载一次。缓存填充以及加载抑制的实现上篇有提到load函数的实现, 缓存填充的逻辑也体现在这里。groupcache尽量避免从源中获取数据,当本地数据缺失时会先从peer中获取,peer中命中则直接填充到本地,未命中才会从源中加载,这正是缓存填充的实现逻辑。而加载抑制,避免重复加载的功能是依靠 singleflight包实现的。这个包中主要有两个结构体:call用来存放获取结果(val)和错误(err),原创 2021-06-09 10:36:43 · 228 阅读 · 3 评论 -
golang中cache组件的使用之groupcache(二)
本篇主要解析groupcache源码。groupcache使用一个map类型的全局变量 groups存储所有的缓存组。初始化创建group时, 会添加一个冲突锁。作者预留了初始化函数callInitPeerServer,但是并为做实现。mu.Lock()defer mu.Unlock()initPeerServerOnce.Do(callInitPeerServer)使用 singleflight.Group保证同一key只获取一次,共享结果。这个函数后面解析。name 缓存组的名字ge原创 2021-06-09 09:56:20 · 314 阅读 · 0 评论 -
golang中cache组件的使用之groupcache(一)
golang中cache组件有很多, 比如groupcache、bigcache等。 本文介绍groupcache的使用。groupcache简介groupcache是memcache的作者开源的一个项目,在许多情况下,它是memcached的替代品。对比memcache,相似处:按键选择哪个对等体负责该键不同处:不需要运行单独的一组服务器,从而大大减少了部署/配置的痛苦。Groupcache是一个客户端库,也是一个服务器。它连接到自己的对等点,形成分布式缓存。可以与存储服务集成,不需要原创 2021-06-08 17:26:40 · 821 阅读 · 0 评论 -
golang中对于docker sdk的使用
本文涉及到使用golang docker sdk 进行 pull、exec、push、import等常见操作的教程,对官方文档缺失的示例进行了补充。docker sdk 官方文档:https://docs.docker.com/engine/api/sdk/examples/docker client 初始化docker client 有多种初始化方法, 本文使用从env中读取的方式。client, _ := client.NewClientWithOpts(client.FromEnv, clie原创 2021-04-21 19:50:03 · 2447 阅读 · 0 评论 -
使用go调用faiss
最近偶然发现了一个go调用faiss的封装库, 尝试后可以成功调用。 安装稍微麻烦,具体如下:安装faissgit clone https://github.com/facebookresearch/faiss.git因为封装库使用的是过往版本的faiss,需要checkout到对应的版本git checkout v1.6.3克隆好项目后,进行编译,参考https://github.com/facebookresearch/faiss/blob/v1.6.3/INSTALL.md我需要使用c原创 2020-11-25 14:44:56 · 1378 阅读 · 3 评论 -
gin跨域问题解决
跨域的核验是通过header中的数个字段判断的, 通过添加中间件的方式,为请求添加header信息,来解决跨域问题。首先编写一个中间件函数。func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method //fmt.Println(method) c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Cont原创 2020-07-06 18:31:02 · 728 阅读 · 1 评论