标签: Go语言

Go二分查找sort.Search

之前对Go sort包的印象一直是只能做排序,毕竟包名就叫sort嘛。后来在一次刷leetcode的时候,发现官方题解做二分搜索的时候用了sort包里的Search函数,惊讶sort包还封装了二分查找功能。于是看了下sort.Search的源码,发现源码其实也写的很简单,就是一个普通的二分: 12345678910111213141516func Search(n int, f func(int)

Elasticsearch sum和group by(aggregation)的集成

Elasticsearch的API是RESTful风格的,传入json风格的DSL就可以进行很多种操作。然而DSL的语法和格式实在是有些太过复杂,对于新手来说难以快速掌握,所以有时候会用ES的SQL接口写一些SQL来进行查询。然而ES对SQL的支持并不是很完备,所以学习一点DSL的语法还是有必要的。简单的一些查询和插入方法在网上很容易搜到,但是一些比较高级的操作和他们的组合操作就有可能搜不到了。比

Go单个字节(byte)转字符串(string)的一点坑

最近遇到一个小问题,由于某个api只支持写入string,而我生成的压缩后的数据都是一个字节的byte,所以不得不将byte转成string。于是写出了如下的代码: 1s := string(b) // b is byte 这样只要b在00000000 到11111111之间,编译是不会报任何问题的,随便写了几个ut也没有问题,于是提交了代码。等到部署后发现,数据量比预估的大了很多,于是仔细rev

用etcd做服务发现(service discovery)

什么是服务发现服务发现其实有两层含义,第一层是实例发现,第二层是端口发现。如果有两个服务A和B,两个服务都是分布式系统,在某个时刻服务A作为客户端要请求服务B,那么这时从服务A中的某个实例(instance)Ai就要访问服务B中的某个实例Bi,那么Ai找到一个合适的Bi就是服务发现的第一层含义,即实例发现。Ai找到合适的Bi后其实还没完事,Ai需要知道Bi响应这个请求的应用程序,也就是说需要知道B

Go语言slice前置插入(prepend)的坑

最近在工作中遇到一个需求,抽象为数据结构的问题就是:对于一个只记录了前向节点的链表,把其中所有节点的值转化为一个数组,数组需要保持原链表中各个值的顺序。也就是一个链表节点的数据结构长这样: 1234type ListNode struct { Val int Prev *ListNode} 需要向前遍历这个链表,用一个slice记录其每个节点的值,并且保持值在链表中

Go的奇特之处2--Go语言的slice

Go语言中的slice,你可以将它简单地看作一个动态数组。动态数组在很多语言中都有实现,比如C++中的vector<>,Java中的Array<>,Python中的[]。那为什么要说Go语言的slice奇怪?首先来回顾一下slice的基本知识: slice由三部分组成:首地址、长度len、容量cap 那么,根据slice的这些特性,slice有啥奇特的呢?首先,举个例子

Go的奇特之处1--Go语言的作用域

作用域是指一个变量或函数在代码中能够有效地使用这个名称的范围。这个概念可能是老生常谈,在所有语言中都有这个概念,但是Go语言的作用域比较奇特。为了行文方便,我把由一对花括号{ }框起来的区域叫做句法块(其实这是在Go语言圣经上看到的概念)。在一个句法块内定义的变量或函数在这个句法块外是不能被调用的,你可以在一个句法块外定义一个相同名称的变量或函数,但那不同于句法块内的变量和函数,相当于生成了另外一