JAVA程序员GO语言如何入坑
一、简单说下GO语言
本社畜是一个JAVA出身的开发工程师,因机缘巧合需要对GO语言进行一些开发,记录一下供后人入坑
GO语言:
1、面向过程,类似于C和C++,但是因为自身具备垃圾回收机制,比C和C++还是要方便一些,没有public private这些关键字,暴露外部方法的方式是通过方法首字母大写,同一个package下面是不可以有同名的方法的,即使是两个不同的go file;
2、开发工具比较简陋,我是用eclipse集成GO开发插件来开发,用起来很多难用的地方,比如在调试的时候有一些类型是看不到值的,比如byte,代码提示也很差,基本没有很有用的提示,在eclipse上好像还不能auto build,所以每次都要自己手动build。
3、GO写出来的代码很简练,如果import的包没被使用或者定义的变量没有使用,是不可以编译通过的,所以代码冗余特别小;
4、定义变量比较方便,其他语言往往需要先要声明变量的类型或者使用var声明一个通用类型,GO可以直接用[变量:=]的形式声明一个变量;
5、在windows编译出来是一个exe可执行文件,不具备跨平台性;
6、相对比较小众,出问题比较难找到帮助
以上都是个人在实战过程中积累的经历,不对之处欢迎指正
二、eclispe下搭建GO开发和调试环境
网上还是有不少如何搭建GO开发环境的文章,可以根据自身实际情况参考,可以通过eclipse自带的maketplace安装是比较便捷的,但我这边连不上,所以只能离线安装:
-
下载插件 ,去GitHub上下载goeclispse插件goclipse.github.io-master.zip,参考地址:https://codeload.github.com/GoClipse/goclipse.github.io/zip/master;
-
在eclipse里引入插件 ,help->install new software->add->local,找到解压后的goclipse.github.io-master\releases\local-repo目录,然后引入即可。
-
**配置GO环境,**这一步相当于要配置JAVA里面的jdk,先下载GO安装包,参考地址:
http://yiyang.jb51.net:81/201410/tools/go_win64(jb51.net).rar;
安装完成后在eclipse里preferences->GO配置GO安装环境,首先要配置GO安装目录,如图:
然后还需要下载三个工具文件,gocode.exe,godoc.exe,godef.exe,这三个文件可以自行上github下载源文件然后编译,也可以直接使用我上传的资源:
https://download.csdn.net/download/chenxiaoshuai/12810329
下载三个工具文件后,继续在eclipse里面配置,gofmt.exe是bin目录下已经有的,无需另外下载,如图:
开发一个简单的GO程序
准备就绪已经我们先写一个简单的GO程序试试,在eclipse里新建一个GO工程,注意目录结构和入口类,具体语法请前往
https://www.runoob.com/go/go-tutorial.html
如图:
右键编译工程编译成功后,即可RUN这个main方法了,需要注意两点:
1、eclispe不能auto build GO工程,所以每次都要手工build;
2、要选择GO开发环境,不然可能无法build工程
GO程序进行调试
eclispe默认情况下无法调试GO程序,需要另外下载一个工具gdb或者gdb64.exe,一个在32位系统使用,一个在64位系统使用,参考地址:
gdb64.exe
gdb.exe(未验证32位操作系统)
然后需要配置debug的参数,右键工程选择debug configuration,进行配置,如图:
个人感觉GO语言的debug不是特别好用,比如byte数组是看不到具体的值的,如图:
通过go语言实现AES加密
在现在互联网高度发达的情况,大部分语言只要入门以后,通过网络搜索去实现常见的功能都是相对比较简单的,下面介绍下在GO语言如何实现AES128/PKCS5Padding/CBC模式的加密,不多说,直接贴代码。
1、依赖
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/sha1"
"encoding/base64"
)
2、PKCSpadding
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
/**
PKCS5包装
*/
func PKCS5Padding(cipherText []byte, blockSize int) []byte {
padding := blockSize - len(cipherText)%blockSize
padText := bytes.Repeat([]byte{byte(padding)}, padding)
return append(cipherText, padText...)
}
3、进行加密,IV是偏移向量,key是aes的秘钥
func Encrypt(secretKey []byte, plaintext []byte) string {
key:=[]byte("1234567890123456")
iv:=[]byte("1234567890123456") //deriveKeyAndIv(secretKey)
block, err := aes.NewCipher(key)
if err != nil {
return "error"
}
encrypt := cipher.NewCBCEncrypter(block, iv)
var source []byte = PKCS5Padding(plaintext, 16)
var dst []byte = make([]byte, len(source))
encrypt.CryptBlocks(dst, source)
base64_result := base64.StdEncoding.EncodeToString(dst)
return base64_result
}
通过go语言实现HTTPS/HTTP POST XML
1、依赖
"io/ioutil"
"net/http"
"strings"
2、发送POST请求,可以支持HTTP和绕过证书的HTTPS
//这是post请求
func doPost(url string, s string, appKey string, timestamp string, nonce string, hmac string) string {
tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} //如果需要测试自签名的证书 这里需要设置跳过证书检测 否则编译报错
client := &http.Client{Transport: tr}
//增加header选项
reqest, err := http.NewRequest("POST", url, strings.NewReader(s))
reqest.Header.Add("Content-Type", "application/xml")
reqest.Header.Add("header1", appKey)
reqest.Header.Add("header2", timestamp)
reqest.Header.Add("header3", nonce)
reqest.Header.Add("header4", hmac)
resp, err := client.Do(reqest)
if err != nil {
fmt.Println("err:", err)
} else {
defer resp.Body.Close()
body, er := ioutil.ReadAll(resp.Body)
if er != nil {
fmt.Println("err:", er)
} else {
fmt.Println(string(body))
return string(body)
}
}
return "ERROR"
}
总结(废话)
任何一门成熟的语言都有自己特色,GO语言也不例外,多研究下说不定有以后能自己写个XX语言出来。