gin框架httprouter路由原理

一、前缀树和基数树(radix tree)的区别:trie又叫前缀树,是一个多叉树,广泛应用于字符串搜索,每个树节点存储一个字符,从根节点到任意一个叶子结点串起来就是一个字符串;radix tree是优化之后的前缀树,对空间进一步压缩。下图左侧是字符串 sex,seed,sleep,son 四个字段串的Trie数据结构表示. 可用看到sleep这个字符串需要5个节点表示. 其实e后面只跟一个p, 也就是只有一个子节点, 是完全可以和父节点压缩合并的. 右侧是优化后的数据结构, 节省了空间,同时也...阅读全文

简书 2020-12-22 16:33:07 Root_808c

Golang加载yaml类型配置文件问题

具体为什么使用yaml类型作为配置文件,有没有更好的配置文件类型,不是这篇研究的主旨。这边主要是介绍在使用yaml.v2 和 viper 两种方式加载yaml类型时候遇到的问题介绍 不关注过程的朋友可以直接跳转到最后查看结果说明 配置文件介绍 demo 程序路径 | demo | - config | - - config.yaml | - service | - - config.go config.yaml 配置文件 $ cat config/config.yaml dsn: bamboo:...阅读全文

简书 2020-12-22 16:32:52 全栈运维

动图展示 10 大 Git 命令

image.png 作者:Lydia Hallie https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1 git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道这些 git 命令执行的究竟是什么任务吗?如果你还有些分不清楚,那千万不能错过这篇文章。在本文中,熟知 JavaScript、TypeScript、GraphQL、...阅读全文

简书 2020-12-22 16:32:51 wwmin_

Golang:国内 go get 无法下载的问题

设置使用国内七牛云的 go module 镜像:golang 1.13版本以及以后的版本可以直接执行:go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct然后再次使用 go get 下载命令即可下载。除了七牛云,还可以使用阿里云的 golang 国内镜像。设置方法go env -w GO111MODULE=ongo env -w GOPROXY=https://mirrors.aliyun.com/goproxy/...阅读全文

简书 2020-12-22 16:32:45 ukernel

golang sync .pool

Go 是一个自动垃圾回收的编程语言,它的算法我们后续会讲到,主要就是采用三色并发标记算法标记对象并回收。我们可以不用考虑为golang来节省什么,但是我们如果想将程序做到优秀我们就不得不考虑减少它gc的次数,毕竟,Go 的自动垃圾回收机制还是有一个 STW(stop-the-world,程序暂停)的时间,而且,大量地创建在堆上的对象,也会影响垃圾回收标记的时间 所以,一般我们做性能优化的时候,会采用对象池的方式,把不用的对象回收起来,避免被垃圾回收掉,这样使用的时候就不必在堆上重新创建了 按照惯...阅读全文

简书 2020-12-22 16:32:44 Stevennnmmm

使用Delve进行Golang代码的调试

追踪代码中的错误可能是一件非常头疼的事情。这在高度依赖goroutine的Golang代码调试中更加的突出。有一个趁手的 debug 工具就显得非常的重要。我们先来看看 Go 官方的debug tool文档写的啥。GDB does not understand Go programs well. The stack management, threading, and runtime contain aspects that differ enough from the execution mo...阅读全文

简书 2020-12-22 09:32:40 youyouxia263

[go语言]-slice实现的使用和基本原理

[toc] Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 摘要 本文主要回顾一下Slice实现的使用和基本原理 Slice数据结构 源码包中 src/runtime/slice.go:slice 定义了Slice的数据结构: array指针指向底层数组,len表示切片长度,cap表示底层数组容量。 type slice struct { array unsafe.Pointer ...阅读全文

简书 2020-12-22 06:32:55 Yangsc_o

为什么都不用 switch 而使用 if/ else 来做条件判断?

请用5秒钟的时间查看下面的代码是否存在bug。 图片 image.gif ​ 推荐阅读:switch case 支持的数据类型。 OK,熟练的程序猿应该已经发现Bug所在了,在第8行和第10行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了,而最为关键的问题是,这个Bug系统不会报错! 缺点一 语法正确,逻辑错误 这就是第一个理由为什么程序猿很少使用switch来做条件判断,对于新手来说忘记写break实在是再普通不过了,就算是老猿忘记写也是时有发生的事情,而这个...阅读全文

简书 2020-12-22 06:32:53 乐学小乐

Fabric 1.4 vs Fabric 2.0链码操作详解

Hyperledger Fabric 2.0最近已经发布,其中最引人关注的一点是 链码操作。官方文档虽然对此提供了详细的说明,但本文将通过与 Hyperledger Fabric前一个版本中链码操作的对比,来帮助你更好的 理解新版本中链码操作的不同之处以及幕后的一些技术细节。 Hyperledger Fabric区块链开发教程: [Node.js] [Golang] 1、链码操作:Fabric 1.4 vs Fabric 2.0 我们将首先快速介绍在HF 1.4和HF 2.0中的整个链码操作过程...阅读全文

简书 2020-12-22 06:32:51 小蜗牛爬楼梯

golang中的数组和slice

数组是一个顺序存储的定长序列,可通过序号直接访问,但是长度固定,不灵活 数组 声明&定义 var a [2]int 默认情况下,数组中的元素会被初始化为相应元素的0值,如int类型中初始化为0,bool为false var a [3]int = []int{1,2,3} b := [...]int{1,2} //定义并初始化 c := [...]int{99: -1} //定义一个100个元素的数组(0-99),99号元素赋值为 -1,其他元素为 0 d := [3]int{12} //定义一个...阅读全文

简书 2020-12-22 06:32:39 小刀田田

TiDB源码学习笔记:启动TiDB

作者:院长,神州数码云基地开发工程师,目前专注于TiDB源码研究。 TiDB源码研究系列第一篇,简述TiDB的核心架构,从tidb-server/mian.go开始,探索启动TiDB的方法。 最近因为一些任务,开始入门学习TiDB源码,作为一名刚刚接触数据库底层的孩子来说,这个过程并不容易,好在TiDB的官方文档提供了源码阅读系列文章,能够让我们比较快速的入门,但是内容比较简单,即使依靠着官方文档去学习源码,对于我这种完全新入门的还是有那么亿点点的难度,所以为了帮助那些和我一样,看源码看的眼花撩...阅读全文

简书 2020-12-22 06:32:38 神州数码云基地

深入浅出 一文带你了解Gin 生命周期

Gin 是一个用 Go (Golang) 编写的 web 框架,由于出色的性能优势而被广泛使用,这里我们就来分析下 Gin 的请求生命周期1 Gin 目录结构先来了解下其目录结构:.├──binding依据HTTP请求Accept解析响应数据格式│ ├──binding.go│ ├──binding_nomsgpack.go│ ├──default_validator.go│ ├──form.go│ ├──form_mapping.go│ ├──header.go│ ├──json.go│ ├─...阅读全文

简书 2020-12-22 06:32:37 程序员日常填坑

golang标准库学习使用Tx事物时遇到的坑

学习使用Tx事物时遇到的坑 下面代码就是先删除demo表中的一个记录,然后在demo2中插入一个记录,分别在删除时和插入时对结果做了判断,如果实行失败则tx.Rollback()回滚,成功才tx.Commit()。但是在执行代码时却发现如果在删除时失败,执行tx.Rollback()时没有使用return语句停止程序,则下面的insert语句会保留一个ID(不知道怎么描述比较好),当再次执行执行删除时,如果删除成功,顺序往下执行insert操作时,比较原本id是7,则插入时就变成了8。 下面的代...阅读全文

简书 2020-12-22 06:32:37 韩小禹

记一次 Go 服务内存泄漏问题调查

原文地址:https://github.com/x1nchen/bl...记录下这个问题是因为这不同于传统典型的 Go 服务内存泄漏。8月15日前后,钉钉监控告警群不定时出现服务机器内存占用超 80%告警,一开始以为是 Prometheus exporter 堆积造成的,准备下掉 Prometheusexporter 的集成代码,后来觉 得这个堆积速度太快了点,不到一天就吃掉6GB,十分夸张,所以有空的时候用 gops 快照了 一下,内存情况如下图(pprof) /app/bin # gops ...阅读全文

Segmentfault 2020-12-25 23:32:33 .container .car 等

如何校验 email 地址以提高邮件送达率

背景在发送 email 的时候,如果邮件收件人是一个不存在的 email 账号、或者收件人账号存在问题、收件箱无法接收 email, 那么 email server 就会将该无法接收的信息响应回来, 这种情况称之为 bounce email,对应的衡量指标是 bounce 率。bounce email 是影响邮件送达率(email delivery rate)的一个重要因素。根据 Sendgrid 统计结果, bounce 率在 5% 以上,送达率为71%;但如果 bounce 率在2%或以下,...阅读全文

Segmentfault 2020-12-27 11:13:50 lryong

​grafana 的主体架构是如何设计的?

​grafana 的主体架构是如何设计的? grafana 是非常强大的可视化项目,它最早从 kibana 生成出来,渐渐也已经形成了自己的生态了。研究完 grafana 生态之后,只有一句话:可视化,grafana 就够了。 这篇就想了解下它的主体架构是如何设计的。如果你对 grafana 有兴趣,不妨让这篇成为入门读物。 # 入口代码 grafana 的最外层就是一个 build.go,它并不是真正的入口,它只是用来编译生成 grafana-server 工具的。 ...阅读全文

Go语言中文网 2020-12-21 17:51:27 jianfengye110

记一次redis集群异常.(error) CLUSTERDOWN The cluster is down

事故描述之前使用docker-compose在测试服务器上搭建了一个redis测试集群.运行了很久时间都没有异常.无奈机房有次事故,服务器被无故重启了.然后重启redis集群也没有任何异常,但是get,set等方法就出现标题中的错误.下面是错误信息:127.0.0.1:6378> set ceshi 123 (error) CLUSTERDOWN Hash slot not served127.0.0.1:6378> get ceshi (error) CLUSTERDOWN The clust...阅读全文

Segmentfault 2020-12-25 09:32:32 吃馍夹菜

regexp 正则包

正则对象 正则使用都是通过创建对应的正则对象,调用对象方法所实现。 type Regexp struct { // 内含隐藏或非导出字段 } 新建正则对象 func Print(title string, data ...interface{}) { if len(data) == 1 { fmt.Printf("%s: %v \n", title, data[0]) return } for i, v := range data { fmt.Printf("%s(%d): %v \n", ti...阅读全文

简书 2020-12-21 10:34:49 直立猿