182013
 

在《Go加密解密之RSA》中,说到了RSA密钥的生成问题,例子中的密钥,是通过openssl生成的。其实,通过那篇文章,可以很容易的反向,用Go生成openssl那样的密钥保存在文件中。该番外篇就是做这事。 一、加解密流程 首先回顾一下上篇文章加解密流程: 1、读取密钥(可以写死在一个变量中保存,也可以从一个外部文件读取) 2、通过encoding/pem中的Decode函数解析到block类型中 3、通过crypto/x509中相应的Parse方法得到密钥(即crypto/rsa包中的PrivateKey和PublicKey) 根据这个流程,我们可以很容易的反过来生成密钥,保存到文件中。 二、生成密钥并编码保存到文件中 首先,我们需要生成密钥,在crypto/rsa包中有一个函数: fun

继续阅读...
182013
 

安全总是很重要的,各个语言对于通用的加密算法都会有实现。前段时间,用Go实现了RSA和DES的加密解密,在这分享一下。(对于RSA和DES加密算法本身,请查阅相关资料) 在PHP中,很多功能经常是一个函数解决;而Go中的却不是。本文会通过PHP加密,Go解密;Go加密,PHP解密来学习Go的RSA和DES相关的API。 该文讨论Go RSA加密解密。所有操作在linux下完成。 一、概要 这是一个非对称加密算法,一般通过公钥加密,私钥解密。 在加解密过程中,使用openssl生产密钥。执行如下操作: 1)创建私钥: openssl genrsa -out private.pem 1024 //密钥长度,1024觉得不够安全的话可以用2048,但是代价也相应增大 2)创建公钥: openssl

继续阅读...
042013
 

一、简介 cmd/dist是生成Go distribution的引导工具。它负责构建C程序(像Go编译器)和初始化Go工具的拷贝(即go_bootstrap)。 dist本身是用C语言写的。所有和C库,甚至和C标准库的交互,都通过一个系统相关的文件封装起来,以方便移植,如:plan9.c、unix.c和windows.c等。通过这个可移植层提供功能,供其他文件使用。在这个可移植层中,为了避免和现有函数混淆,相同功能的函数带有前缀:x。例如:xprintf是printf的可移植版本。 到目前为止,dist中大部分普通数据类型是字符串或字符串数组。然而,dist中使用两个命名的数据结构:Buf和Vec,保存它们拥有的所有数据,而不是使用char*和char**。Buf相当于Go中的[]byte,

继续阅读...
012013
 

安装Go语言,建议通过源码安装。通过源码安装Go,一般只需要安装一个GCC编译器就可以了。(Windows下是安装MinGW)。该文分析通过源码安装Go语言的过程。 一、分析安装脚本 在《探究Go中各个目录的功能》一文中提到了几个脚本,以及它们的作用。现在来分析这些脚本都做了些什么。(以linux下为例,Windows对应的脚本类似) 1、all.bash 说明: 1)set -e 当脚本中某个命令返回非零退出状态时,脚本退出 2)if语句 是要求all.bash必须在make.bash所在的目录运行(也就是$GOROOT/src) 3)OLDPATH=”$PATH” 保存当前PATH 4)执行make.bash并传递–no-banner参数 5)执行ru

继续阅读...
十二 272012
 

下载Go源码后,根目录结构如下: |– AUTHORS — 文件,官方 Go语言作者列表 |– CONTRIBUTORS — 文件,第三方贡献者列表 |– LICENSE — 文件,Go语言发布授权协议 |– PATENTS — 文件,专利 |– README — 文件,README文件,大家懂的。提一下,经常有人说:Go官网打不开啊,怎么办?其实,在README中说到了这个。该文件还提到,如果通过二进制安装,需要设置GOROOT环境变量;如果你将Go放在了/usr/local/go中,则可以不设置该环境变量(Windows下是C:\go)。当然,建议不管什么时候都设置GO

继续阅读...
十二 202012
 

据我所知,目前大部分人都会将main包直接放在src根目录,运行时使用 go run xxx.go 这种方式。当然如果需要生成可执行文件,就通过go build在当前目录生成一个可执行文件。LiteIDE也是这么做的(已经和作者提建议了)。 然而,将main包直接放在src根目录,不能用go install 安装成标准的 src pkg bin这样的结构。如果一个项目中有多个server呢?你这样就没法弄了,得分开成几个项目;然而这几个server之间可能有不少需要共享的东西,这样可能又得增加GOPATH。 另外,虽然main包文件直接在src根目录下可以通过go build生成可执行文件,但默认是生成在当前目录下的(可能污染源码),而不会生成到bin目录(除非自己参数指定)。实际上官方都建

继续阅读...
十二 142012
 

在JSON还未像现在这么广泛使用时,XML的使用相当广泛。XML作为一种数据交换和信息传递的格式,使用还是很广泛的,现在很多开放平台接口,基本会支持XML格式。Go语言中提供了处理XML的标准库。下面我们一起来学习它。 一、encoding/xml包概述 该包实现了一个简单的XML 1.0 解析器(支持XML命名空间) 二、类型和函数 在看类型和函数之前,先看一下变量和常量 Header常量:由于Marshal生成的xml并不会生成XML标准头部,所以,定义了一个标准头常量 HTMLAutoClose变量:一些应该自动闭合的HTML标签。很明显,这是用来处理html的。这样的标签如:br、hr等 HTMLEntity变量:标准HTML字符实体的映射转换。(实体名=>实体编号) 可见,两

继续阅读...
十二 122012
 

说明:作为一门静态语言,似乎支持调试是必须的,而且,Go初学者喜欢问的问题也是:大家都用什么IDE?怎么调试? 其实,Go是为多核和并发而生,真正的项目,你用单步调试,原本没问题的,可能会调出有问题。更好的调试方式是跟PHP这种语言一样,用打印的方式(日志或print)。 当然,简单的小程序,如果单步调试,可以看到一些内部的运行机理,对于学习还是挺有好处的。下面介绍一下用GDB调试Go程序:(目前IDE支持调试Go程序,用的也是GDB。要求GDB 7.1以上) 以下内容来自雨痕的《Go语言学习笔记》(下载Go资源): 默认情况下,编译过的二进制文件已经包含了 DWARFv3 调试信息,只要 GDB7.1 以上版本都可以进行调试。 在OSX下,如无法执行调试指令,可尝试用sudo方式执行gdb

继续阅读...
十二 072012
 

1、map数据类型初始化 两种方式:map[string]string{}或make(map[string]string) 2、未初始化的map是nil,它与一个空map基本等价,只是nil的map不允许往里面添加值。(A nil map is equivalent to an empty map except that no elements may be added) 因此,map是nil时,取值是不会报错的(取不到而已),但增加值会报错。 其实,还有一个区别,delete一个nil map会panic,但是delete 空map是一个空操作(并不会panic)(这个区别在最新的Go tips中已经没有了,即:delete一个nil map也不会panic) 3、通过fmt打印map时,

继续阅读...
十二 052012
 

项目目录结构如何组织,一般语言都是没有规定。但Go语言这方面做了规定,这样可以保持一致性 1、一般的,一个Go项目在GOPATH下,会有如下三个目录: 其中,bin存放编译后的可执行文件;pkg存放编译后的包文件;src存放项目源文件。一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可。 对于pkg目录,曾经有人问:我把Go中的包放入pkg下面,怎么不行啊?他直接把Go包的源文件放入了pkg中。这显然是不对的。pkg中的文件是Go编译生成的,而不是手动放进去的。(一般文件后缀.a) 对于src目录,存放源文件,Go中源文件以包(package)的形式组织。通常,新建一个包就在src目录中新建一个文件夹。 2、举例说明 比如:我新建一个

继续阅读...