062015
 

做过 Web 开发的,应该都用过或听过 jQuery,它提供了方便的操作 DOM 的 API。使用 Go 语言做服务器端开发,有时候需要解析 HTML 文件,比如抓取网站内容、写一个爬虫等。这时候如果有一个类似 jQuery 的库可以使用,操作 DOM 会很方便,而且,上手也会很快。github.com/PuerkitoBio/goquery 这个库就实现了类似 jQuery 的功能,让你能方便的使用 Go 语言操作 HTML 文档。 1 概述 Go 实现了类似 jQuery 的功能,包括链式操作语法、操作和查询 HTML 文档。它基于 Go net/html 包和 CSS 选择器库 cascadia。由于 net/html 解析器返回的是 DOM 节点,而不是完整的 DOM 树,因此,jQ

继续阅读...
032014
 

工作中碰到这样一个问题: 有一个文本文件,有上亿行数据,每行数据是 unsigned int。现在需要将其中可能重复的数只保留一个,同时和另外一个或多个这样的文件进行排重(即和它们做差集)。要求尽可能快的筛选出来。 开始实现比较简单粗暴,将数据直接通过 LOAD DATA INFILE 导入 MySQL 表中,然后多表之间做 LEFT JOIN。数据不是特别大,比如几千万,且就要排重的文件不多时,比如一个,速度还可以接受。然而,当数据上亿,且有多个文件需要排重时,性能急剧下降,必须进行优化。而这,正是 Bitmap 的应用场景。 1、Bitmap 概念 Bitmap 是一个十分有用的数据结构。所谓的 Bit-map 就是用一个 bit 位来标记某个元素对应的 Value,而 Key 即是该元

继续阅读...
132014
 

热爱Go语言,一直使用着、关注着。那么如何获取Go最新动态,使用它最新的特性能? 1、获取最新动态 获取Go语言的最新动态有以下几种方法。 1.1 最直接最原始的方式 —— 官方源码库(hg clone https://code.google.com/p/go/),即 tip。关注Go开发者们提交代码的注释、代码diff。 1.2 关注 golang-dev 讨论组。Go开发者会在这上面讨论Go语言的开发 1.3 关注 issues,以及代码review 1.4 通过 Go dashboard 了解 Go 某个版本的 issues 解决情况(链接最后修改为相应版本即可) 1.5 Go官方网站对应的 tip 版 1.6 关注国内 Go 社区的一些信息 2、使用最新特性 在新版本还未发布时,可能

继续阅读...
132014
 
Go语言:安装多版本

在开发或者自己学习Go的过程中,可能会对比不同版本Go语言的特性、性能等,特别是可能想提前用上tip版本的一些特性,这个时候,系统中可能需要多个Go版本。那么该如何处理这个问题呢? 一般地,我觉得有两种处理方法。 1、目录改名法 比如 Go 版本(go1.3)安装在 /usr/local/go 目录中,并配置了 GOROOT(GOROOT=/usr/local/go)和 PATH (PATH=$PATH:$GOROOT/bin),这时,我们想安装一个Go1.2版本,比如放在了 /usr/local/go1.2 中。 通常,我们都在使用 Go1.3,但某个时候,我们想使用 Go1.2,这个时候,可以将 /usr/local/go 改名为 /usr/local/go1.3,同时将 /usr/lo

继续阅读...
222014
 

1、cron 表达式的基本格式 用过 linux 的应该对 cron 有所了解。linux 中可以通过 crontab -e 来配置定时任务。不过,linux 中的 cron 只能精确到分钟。而我们这里要讨论的 Go 实现的 cron 可以精确到秒,除了这点比较大的区别外,cron 表达式的基本语法是类似的。(如果使用过 Java 中的 Quartz,对 cron 表达式应该比较了解,而且它和这里我们将要讨论的 Go 版 cron 很像,也都精确到秒) cron(计划任务),顾名思义,按照约定的时间,定时的执行特定的任务(job)。cron 表达式 表达了这种约定。 cron 表达式代表了一个时间集合,使用 6 个空格分隔的字段表示。 字段名 是否必须 允许的值 允许的特定字符 秒(Seco

继续阅读...
082014
 

在公司内部,经常会有域名是需要绑定host才能访问的,如果是通过浏览器访问,我们会修改本机的hosts文件;然而,如果是要通过程序访问这样的域名,我们是否依然必须绑定host呢?答案当然是否定的,而且,依赖本地绑定的host,程序到其他机器部署,也必须在那台机器绑定host,如果机器很多呢? 本文示例: IP:192.168.1.102,也就是说需要访问这台机器上的资源 域名:www.studygolang.com,nginx 配置的虚拟主机 url path:/testhost.txt,内容是:Welcome to studygolang.com 需求:需要请求服务器上的 testhost.txt 资源 1、Linux Shell的解决方案 Linux下的curl程序可以绑定host,因此

继续阅读...
312013
 
汇编和Plan9汇编

最近在研究 Go 的源代码(阅读后的代码注释放在了github上:http://github.com/polaris1119/go_src_comment),由于不少底层代码是用汇编写的,而且是 Plan9 的汇编,因此重新看了一些汇编和 Plan9 汇编的知识。在这里做一个总结、备忘。 一、资源 1、指令查询: http://68k.hax.com/ 2、命令查询 http://plan9.bell-labs.com/magic/man2html/1/8a 3、LEA 和 MOV LEA:操作地址; MOV:操作数据 如: LEAQ 8(SP), SI // argv 把 8(SP)地址放入 SI 寄存器中 MOVQ 0(SP), DI // argc 把0(SP)内容放入 DI 寄存器中

继续阅读...
282013
 

期待已久的Go1.1终于快发布了。官方已经放出了Go1.1的改动介绍。想看详细信息的可以直接查看原文:Introduction to Go 1.1 这里就主要改动做下介绍 一、语言的改动 1、整数除以0问题 Go1.0x中,整数除以常量0会抛出运行时 panic, Go1.1改成了编译不通过,即 编译时 错误,这样可以早发现问题。主意,是常量0,而不是变量。 2、方法可以作为值 我们知道,在Go中func是一等公民,可以到处使用,比如作为函数参数、赋值给变量。但是方法(Method)却不行,也就是带有receiver的函数不是一等公民。 Go1.1将方法提升为一等公民了。这样,方法可以作为函数参数、赋值给变量等。 3、一直被视为bug的必须”return”问题 在Go

继续阅读...
282013
 

在golang标准库中,有那么一类包,它们用于处理go项目目录结构、源码、语法、基本操作等。一般程序中可能用不到这些包,但在go工具链源码中用到了,之所以学习这些标准库,是为了更好的看go工具链的源码。首先我们来看收集go包信息的库:go/build 一、build包概述 该包文档中首先介绍了Go Path。如果对该部分还不清楚,可以看下文档的说明;或者官方其他文档;或者看 Go项目的目录结构。 如果你看过go源码,应该见到过类似这样的包注释:+build ignore。这是编译约束条件(Build Constraints),可以理解为条件编译。关于这部分的更多内容,稍后详细介绍。 二、类型和函数 1、ToolDir变量 该变量的值是go工具链的路径。6g/6l之类的工具,就在这个路径下 2

继续阅读...