golang
皿小草
这个作者很懒,什么都没留下…
展开
-
golang jsoniter extension 处理动态字段
jsoniter 包提供了比较完善的定制能力,通过例子可以感受一下扩展性。后续大家可以根据业务需求发掘更多的能力。原创 2023-04-05 15:40:48 · 601 阅读 · 0 评论 -
golang 实现 pdf 转高清晰度 jpeg
golang 实现 pdf 转高清晰度 jpeg原创 2022-10-07 22:09:20 · 1384 阅读 · 1 评论 -
golang 压缩算法 gzip/lz4 对比
golang 压缩算法对比原创 2022-06-26 23:22:31 · 2459 阅读 · 0 评论 -
http status code 404 使用陷阱
背景最近遇到一个问题,业务逻辑里面需要检查资源是否存在。一般来说,如果返回码是 404, 就可以认为资源不存在,然后做出一些动作但是,这个 404 不一定能反映真实情况依赖链路由于我们的 API 服务一般会部署在各种负载均衡或者网关之后,传输链路可能是这样的Created with Raphaël 2.3.0UserCloudflareGatewayAPI service由于依赖链路过长,只要有一个环节异常,Cloudflare 与 Gateway 其实都有可能存在改写 status code原创 2021-11-19 22:36:14 · 6852 阅读 · 0 评论 -
golang 实现 middleware(非 web 项目)
背景在开发中,如果需要封装一些组件,但是不想通过 before&after 这类切面来操作,就需要有 middleware 的支撑。其实middleware 的设计非常简单,但是网上很多都是讲 web 的,好像没有非 web 项目的,这里就写一个吧middleware与 before&after 这种场景不太一样,middleware 希望知道每个操作前后带来的变化,“视野”会更完整下面是 middleware 的流程demo:package mainimport ( "原创 2021-06-14 17:53:53 · 448 阅读 · 0 评论 -
golang protobuf 枚举值 json 解析
现有 protobuf 数据结构enum Phase { Pending = 1; Running = 0;}message Status { Phase status = 1;}实际生成代码,对应的类型type Phase int32const ( Phase_Pending Phase = 0 Phase_Running Phase = 1}但我们希望解析的数据如下{ "status":"Pending"}常规的 encoding/js原创 2021-06-03 00:44:14 · 2267 阅读 · 0 评论 -
golang timer 性能消耗
由于 golang 的 timer 是高精度定时器,所以在使用 timer 的时候,需要注意精度与性能的平衡package mainimport ( "time")func main() { ticker := time.NewTicker(1 * time.Millisecond) i := 0 for range ticker.C { i++ }}...原创 2021-05-04 20:17:08 · 1313 阅读 · 0 评论 -
json log自动展开嵌套字段(expand nested fields)
背景目前日志系统基本是走json log,一般公有云的log管理页面,都会有自动展开json log的功能。在开发过程中,本地看json形式的日志有点麻烦,可读性不高。举个例子,有一行日志是这样的{"level":"info","ts":1602161606.829082,"caller":"zap_test/main.go:44","msg":"embed","a":{"b":"bbb"},"json-str":"{\"Name\":\"a\",\"Age\":2}","stack":"/opt/g原创 2020-10-08 23:02:50 · 484 阅读 · 0 评论 -
适用cloudfunction/lambda的场景
cloudfunction和lambda分别是gcp和aws的serverless产品,因为两者都使用过,就写一下使用感想。serverless是什么serverless是公有云厂商提供的一种faas产品,开发者只需要提供函数function,就可以使得这个函数拥有对外服务的能力。gcp/aws/tencent/ali cloud都有提供对应的解决方案。cloudfunction和lambda使用上有差异,下面主要讨论cloudfunctioncloudfunction目前支持的数据源有:http/原创 2020-10-06 19:58:45 · 861 阅读 · 0 评论 -
minio存储之纠删码(Erasure Code)
纠删码的原理介绍可以参考:https://www.jianshu.com/p/4abf65ad03af一般上我们如果要保证数据高可用,主流的有两种策略:多副本纠删码副本(Replication)策略:副本,实打实的复制,常见的是三副本,意味着现实世界有三份一样的数据。代价稍高,偏计算类的场景基本都会用该策略,比如虚拟机VM、数据库。如果一个副本挂了,马上切到另外一个,漂移时间非常短。n副本存储效率永远是1/n1/n1/n。纠删码(Erasure Code)策略:纠删码,会把数据进行切分,原创 2020-07-30 23:39:57 · 4625 阅读 · 0 评论 -
MKL blas golang 对比 gonum
这里对比的对象主要是gonum的gonum.org/v1/gonum/floats包,这个包做科学运算还是比较快的,里面直接调汇编代码,比go写的原生计算代码要高效一些。首先,需要安装mkl,下载地址然后安装gosl 这个包 github.com/cpmech/goslblas里面,第一层是vector与vector的操作,验证一个点乘算子package mainimport ( "fmt" "github.com/cpmech/gosl/la/mkl" "gonum.org/v1/gon原创 2020-06-08 20:55:51 · 1317 阅读 · 0 评论 -
golang context 适用场景与源码导读
以cancelContext 为例先看使用package mainimport ( "context" "fmt" "time")func main() { back := context.Background() // 占位 child1, cancel1 := context.WithCancel(back) child1_1, _ := context.WithCancel(child1) child1_2, cancel1_2 := context.WithCanc原创 2020-05-29 00:59:27 · 271 阅读 · 0 评论 -
golang调用paddle的infer c api
百度的paddlepaddle有go版本的推理接口,通过cgo调用paddle c的推理库,在实际的api服务中,用go做推理服务器是有优势的。开发环境ubuntu 18.04paddle 1.7.1cuda 10.0cudnn7go 1.12python 3.7编译paddlepaddle gpu版本的c库paddle默认提供的是c++版本的推理库,参考 https://www...原创 2020-04-04 23:05:41 · 2135 阅读 · 1 评论 -
golang gc优化
目录gc 原理对象分配在堆还是栈?怎么评价gc结果好坏?有用的技巧?gc 原理可以参考几篇文章golang gc原理,比较容易讲清楚三色标记https://making.pusher.com/golangs-real-time-gc-in-theory-and-practice/比较详细的gc过程 golang垃圾回收浅析回顾一下基本的问题:3. gc回收什么内存?目标是回收堆...原创 2020-03-30 00:42:27 · 1503 阅读 · 0 评论 -
golang 子数组最大乘积
leetcode题目152输入 [2,3,-2,4] 返回 6输入 [-2,0,-1] 返回 0题目分析: 动态规划中等难度的题目,最大乘积具有后无效性由于乘法具有负负得正的特性,所以需要记录当前最大与当前最小值,这样可以确保遇到负数的时候及时翻转结果。记数组为a,最大乘积为imax,上一个最大乘积为preMax, 上一个最小乘积为preMin, 状态转移方程imax[i]=max...原创 2020-03-29 19:06:27 · 274 阅读 · 0 评论 -
golang etcd选主实验
分布式部署应用的时候,有时候希望由一个master角色去处理一些特殊的业务,这个时候就要用到选主。不同于分布式锁,选主是为了选出一个在短时间内有固定角色的节点。而分布式锁一般用于多个进程实时竞争资源的场景,而且一般是上锁完要尽快释放的,在时间上体现为一把锁可以快速在工作节点中飘逸。github.com/coreos/etcd/clientv3 的客户端可以提供选主的功能,单元测试有选主以及分布式...原创 2020-03-28 00:57:53 · 1876 阅读 · 0 评论 -
推荐系统:ann算法之ngt
在推荐或者搜索场景中,高质量的召回都是很有必要的,有时候ann搜索算法(Approximate Nearest Neighbor)可以帮助我们实现这一个功能ngt是yahoo日本团队基于graph和tree做的的ann搜索工具,地址:https://github.com/yahoojapan/NGT它实现了onng/pnng的算法,对应的论文onng: https://arxiv.org/a...原创 2020-03-22 22:54:18 · 2925 阅读 · 0 评论 -
golang tcp握手/挥手实验、CLOSE_WAIT优化
书本上常说的三次握手,四次挥手下图是其它博文摘录的golang 的tcp编程是比较简单的,但是如果抓包,会发现很多情况下(尤其是显式的复杂网络环境,很难复现四次挥手的报文)实验一 复现三次握手四次挥手tcp serverpackage mainimport ( "fmt" "io" "net")func main() { addr, err := net.Resol...原创 2020-03-15 16:22:16 · 2380 阅读 · 0 评论 -
golang二叉树翻转(递归与非递归实现)
二叉树翻转树的初始化可以粗暴一些。如果要看一棵比较简单的树的结构,可以用json包序列化打印出来看非递归实现package mainimport ( "encoding/json" "fmt" "github.com/eapache/queue")type Node struct { Key int Left *Node Right *Node}func...原创 2020-03-11 23:19:04 · 458 阅读 · 0 评论 -
golang有向无环图(dag)以及判断是否有环
有向无环图邻接表实现package mainimport ( "fmt" "github.com/eapache/queue")// 邻接表type Vertex struct { Key string Parents []*Vertex Children []*Vertex Value interface{}}type DAG struct {...原创 2020-03-07 22:03:28 · 5488 阅读 · 0 评论 -
golang 比较容易理解的快速排序
我用过的排序两种,冒泡,时间复杂度O(n^2)快速排序,平均时间复杂度O(nlogn)基础定义可以参考百度百科简单来说,就是分而治之大体思路:找到一个基准(pivot),然后把小于基准的分为一组,等于基准的分为一组,大于基准的分为一组不考虑空间利用率,最容易理解版本package mainimport "fmt"func main() { array := []int{9...原创 2020-03-07 21:38:08 · 433 阅读 · 0 评论 -
ML调度服务-argo源码入门
先讨论一下算法工作流的调度服务,工作流,简单来说是完成一件事的工作流程像这样的就是一个典型的工作流一般来说,工作流是一个有向无环图(DAG)算法工作流也是一个DAG,里面的一个点,就是一个step,目前开发的工作流,有简单到一个step就可以完成的,也有数十个step组成的。每个step,都会有对应的输入,也会有对应的输出,然后构成一个完整的算法pipeline。竞品airflow传送...原创 2020-02-11 22:47:57 · 4684 阅读 · 1 评论 -
搭建生产级别的k8s集群,需要注意哪些?
笔者2019下半年需要一个有namespace管理员权限的k8s集群,虽然公司已经有几个大的k8s集群,但是对方部门不肯给namespace内的管理员权限,现在有一个问题...原创 2020-02-11 16:25:33 · 796 阅读 · 0 评论 -
gin url树
在看gin源码的时候,发现其组织router的时候,使用到了Radix tree结构,关于Radix tree的介绍,请参考wiki Radix tree,Radix tree是Trie树的存储空间优化版本。方便快速匹配url。gin路由其实采用了https://github.com/julienschmidt/httprouter 这个项目的路由,gin是一个非常精致的framework,代码量不原创 2017-05-21 17:10:06 · 1271 阅读 · 0 评论 -
golang mgo 使用
golang使用mongodb,目前比较多人用的是mgo((pronounced as mango)github地址 官网 文档直接上官方example的代码Example首先是要获得模块go get gopkg.in/mgo.v2下一步(这里假设你已经会搭建go的环境和了解go的库配置)package mainimport ( "fmt" "log"原创 2017-04-15 18:47:06 · 9423 阅读 · 0 评论 -
golang slice index out of range错误
slice原创 2017-02-24 18:17:03 · 12936 阅读 · 0 评论 -
golang 字符串比较是否相等
golang字符串比较的三种常见方法fmt.Println("go"=="go")fmt.Println("GO"=="go")fmt.Println(strings.Compare("GO","go"))fmt.Println(strings.Compare("go","go"))fmt.Println(strings.EqualFold("GO","go"))输出truefalse-1原创 2017-03-01 16:17:47 · 84444 阅读 · 3 评论 -
golang web相关开源项目
花时间了解一下guthub的golang web相关开源项目,在此总结一下,方便以后查找beego,最初接触的web framework,文档齐全,可以在知乎上了解一下大牛对beego的评价,linkgorilla,提供各种golang组件,用过其websocket库做消息服务器,500+的fork,mux库也很不错,linkgin-gonic,web framework,据说是用了都说好的,原创 2017-02-22 23:11:03 · 3031 阅读 · 0 评论 -
golang 静态文件隐藏下载地址
由于静态文件服务器对对所有请求都是透明的,我想把一部分重要文件对部分特权用户开放下载。即下载前,先验证用户权限,权限满足再开放下载(同时隐藏下载的地址)原理请看Golang. What to use? http.ServeFile(..) or http.FileServer(..)?普通用法http.HandleFunc("/static2/", func(w http.ResponseWrite原创 2017-02-28 18:06:42 · 1074 阅读 · 0 评论 -
golang Bitmap/Bloom/Cuckoo Filter
bitmap和bloom filter都可以对大量数据(通常是超过10亿条)构造集合,当要判断一个新的元素是否在这个大数据集合里面,两种方式都可以准确判断出“新元素不在这个集合”,但是“新元素在这个集合”的判断可能不准,在可以接受误判的系统中,bitmap和bloom filter都可以作为“神器”使用bitmapbitmap算法原理可以wiki一下,个人感觉它就是一个map[uint32]b...原创 2019-04-12 23:32:01 · 1186 阅读 · 0 评论 -
kubernetes 带状态程序部署-以mysql为例
背景k8s 在部署带状态的程序相对来说比较麻烦,一个高可用的程序,应该可以在每一个node上跑,所以在程序的开发阶段就应该要考虑到部署阶段带来的问题,可以降低程序容器化配置信息尽量写入DB,那么程序起来的时候直接从DB加载,无论从提高部署效率或者运营的角度来说,入库都是最好的选择,更新配置之后,replace pod就ok无法入库的大文件配置,通过k8s的pv pvc来处理,参考小文件配...原创 2019-04-12 23:32:48 · 805 阅读 · 0 评论 -
k8s crd(custom resources definitions)
相关资料关于CRD(custom resources definition)的concept,可以参考官方文档:https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#custom-resources其中有提到两个比较重要的概念:声明式(declarative)API和命令式(i...原创 2019-04-12 23:35:03 · 1844 阅读 · 0 评论 -
golang重写time包默认时间的json格式
背景之前遇到一个需求,有一个字段属性是time.Time,需要的时间格式跟golang time包默认的格式不一样,要求是yyyy/mm/dd hh:mm:ss的格式golang time.Time默认json输出time包有一个默认的json格式,参考如下例子package mainimport ( "encoding/json" "fmt" "time")type Pe...原创 2019-04-13 19:54:40 · 5181 阅读 · 0 评论 -
三步实现一个golang web framework
背景一般来说,对于入门某一门语言的web开发,都会从框架入手,但是,当你的使用场景越来月复杂的时候,框架本身会制约你的实现,这个时候,你需要自己实现一个框架才能满足你的需要。框架并不神秘,跟着笔者三步实现一个最基本的golang框架。所有代码都在github,由于考虑到三方库的api稳定性问题,启用了vendor,代码可以直接跑。首先,这里说的web framework是指一个非常精简的框架,...原创 2019-04-14 11:06:10 · 824 阅读 · 0 评论 -
seastar与go的http性能差异
golang的coroutine好用,但是coroutine本身切换是需要有代价的,主要体现在内存栈的上下文切换。之前看过一个C++的go风格的库,叫libgo, 根据其github主页的benchmark,协程切换速率是要优于go的。但是这篇文章并非要和libgo比较,由于笔者之前接触过scylladb,对seastar这个c++框架念念不忘,下面就来对比一下两者差异OS:Ubuntu 18....原创 2019-05-18 23:08:56 · 3225 阅读 · 0 评论 -
介绍一个golang struct 校验工具【qvalid】
这个库是去年写的,主要用于结构体的校验。比如字符串长度、数值大小、oneof,以及字符串的一些常见属性(email/url/ip)等。项目的地址:https://github.com/miaomiao3/qvalid因为不想用一些现成但很臃肿的库如govalidator,就自己写了一个,写的时候希望语法尽可能精简,借用了mongodb的一些约束,比如lt/lte gt/gte概念,来约束字符...原创 2019-05-19 15:00:20 · 946 阅读 · 0 评论 -
golang 用反射reflect操作结构体
背景需要遍历结构体的所有field对于exported的field, 动态set这个field的value对于unexported的field, 通过强行取址的方法来获取该值(tricky?)思路下面的代码实现了从一个strct ptr对一个包外结构体进行取值的操作,这种场合在笔者需要用到反射的场合中出现比较多simpleStrtuctField 函数接受一个结构体指针,因为最后希...原创 2019-06-02 17:18:27 · 2577 阅读 · 0 评论 -
Go | golang 1.8 is released
Go | golang 1.8 is released翻译 2017-02-19 00:34:08 · 488 阅读 · 0 评论