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

继续阅读...
232013
 

在写命令行程序(工具、server)时,对命令参数进行解析是常见的需求。各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。如果命令行参数纯粹自己写代码解析,对于比较复杂的,还是挺费劲的。在go标准库中提供了一个包:flag,方便进行命令行解析。 注:区分几个概念 1)命令行参数(或参数):是指运行程序提供的参数 2)已定义命令行参数:是指程序中通过flag.Xxx等这种形式定义了的参数 3)非flag(non-flag)命令行参数(或保留的命令行参数):后文解释 一、flag包概述 flag包实现了命令行参数的解析。 定义flags有两种方式: 1)flag.Xxx(),其中Xxx可以是Int、String等;返回一个相应类型的指针,如: 2)flag.XxxVar(),将fl

继续阅读...
222013
 

Go’s interfaces—static, checked at compile time, dynamic when asked for—are, for me, the most exciting part of Go from a language design point of view. If I could export one feature of Go into other languages, it would be interfaces. 《Go Data Structures: Interfaces》—- Russ Cox 可见interface是go中很重要的一个特性。 在网上有人问:Go语言中接口到底有啥好处,能否举例说明?于是,我考虑以

继续阅读...
292013
 

原本不打算介绍GOPATH,然而,总是有初学者问一些关于GOPATH的问题,因此在这里再介绍一下GOPATH GOPATH环境变量用于指定这样一些目录:除$GOROOT之外的包含Go项目源代码和二进制文件的目录。go install和go 工具会用到GOPATH:作为编译后二进制的存放目的地和import包时的搜索路径。 GOPATH是一个路径列表,也就是可以同时指定多个目录。多个目录在Mac和Linux下通过”:”分割;Windows下通过”;”分割。注意,大部分情况下会是第一个路径优先,比如:查找包 对于有些情况,比如,在GOPATH所在的路径之外执行go install会怎么样,可以自己试验一下。 个人建议GOPATH中别设置多个路径,甚

继续阅读...
272013
 

一、AES简介 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,这个标准用来替代原先的DES。AES加密数据块分组长度必须为128bit,密钥长度可以是128bit、192bit、256bit中的任意一个。 AES也是对称加密算法。关于该算法的更多信息可以参考 http://baike.baidu.com/view/2310288.htm 二、Go AES加密解密 学会了DES加密后,AES加密相当简单。除了第一步,将crypto/des包换为crypto/aes外,其他几乎一样。当然,需要注意的是密钥长度和iv的长度。 DES中blocksize是8byte,AES中则是16byte(128bit)。 AES包中,使用

继续阅读...
232013
 

接着RSA加密解密,我们继续来看看DES的加密解密 一、DES简介 DES(Data Encryption Standard)是对称加密算法,也就是加密和解密用相同的密钥。其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。 DES加密,涉及到加密模式

继续阅读...