数据查询用Slice还是Map

    如果有一些不重复的数据需要记录,并且用来查询某一数据是否存在,可以有两种做法: 1、存在slice中,每次查询时遍历slice,如果查到数据则退出遍历,时间复杂度是O(n)。 2、存在一个集合中,golang中可以使用map的key来保存,每次直接判断该数据是否存在,时间复杂度是O(1)。 从时间复杂度上面来看,使用map是有明显优势的,但是如果数据量较小,O(1)可能并没有O(n)的速度快,那么应该如何选择呢? 下面写了一个性能测试: package main import ( "testing" ) var s []int var m map[int]struct{}

    Golang JSON

    博客有段时间没更新了,最近刚刚换了工作,入坑了区块链。 最近帮同事解决了一个修改Ethereum项目中struct结构,但是序列化结果不变的问题,其中涉及了go generate和json序列化等知识,今天决定先整理一下json序列化的部分,以后有时间再总结go generate。 我使用的go版本 go version go1.11.1 windows/amd64 一个简单的例子 package main import ( "encoding/json" "fmt" "time" ) type Data struct { Id i

    逆波兰表示法的Golang实现

    最近在看程杰写的《大话数据结构》,之前也看过他写的《大话设计模式》,虽然书中好多段子都很“尬”,但是整体风格还是很合我的胃口的。 今天看到第四章,在介绍栈的时候提到了逆波兰表示法,这个算法好像上学的时候在POJ 上面做过。算法我也好久没碰了,今天用Golang实现一下,就当练练手吧。 代码很简单,我写了比较详细的注释,那就直接看代码吧: package main import ( "bufio" "bytes" "fmt" "os" "strconv" ) type node struct {

    Golang Sprintf 源码分析

    昨天晚上在地铁上,看了一篇公众号推送的文章—— 深度 | 从Go高性能日志库zap看如何实现高性能Go组件。 文章里提到了日志库使用fmt.Sprintf带来的性能问题。我之前也写过一个基于fmt.Sprintf的日志小轮子,当时也没有太关注这个方法的具体实现,今天有空,就稍微深入的研究一下源码吧。 我使用的go版本 go version go1.10.3 windows/amd64 一个简单的例子 package main import ( "os" "log" "runtime/pprof" "time" &