Base64编码—电子邮件的基础编码格式
Base64编码是常见的对8bit字节码的编码方式之一。
Base64编码可以使用64个可打印字符来表示二进制数据,电子邮件就是使用这种编码。
Go语言标准库自带了Base64编码算法。示例如下:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
//发送消息的内容
message := "ni hao a "
//进行Base64编码
encodeMessage := base64.StdEncoding.EncodeToString([]byte(message))
//打印编码后的内容
fmt.Println(encodeMessage)
//解码消息
data, err := base64.StdEncoding.DecodeString(encodeMessage)
//出错处理
if err != nil {
fmt.Println(err)
} else {
fmt.Println(string(data))
}
}
输出:
从INI配置文件中查询需要的值
INI文件格式是一种古老的配置文件格式。一些操作系统、虚幻游戏引擎、GIT版本管理都在使用INI文件格式。
- INI文件由多行文本组成,整个配置由"[]“拆分为多个“段”。每个段中又以”="分割为键和值。
- 文件格式如下
[setion]
key1=value1
key2=value2
…
文件内容示例:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
[remote “origin”]
url = https://github.com/davyxu/cellnet
fetch = +refs/heads/:refs/remotes/origin/
[branch “master”]
remote = origin
merge = refs/heads/master
从INI文件中取值的函数
熟悉了INI文件格式之后,开始准备读取INI文件,并从文件中获取需要的数据。下面我们创建一个 example.ini 文件,并将从 GIT 版本管理配置文件中截取的一部分内容复制到该文件中。
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
//根据文件名,段名,键名获取ini的值
func getValue(filename, expectSection, expectKey string) string {
//打开文件
file, err := os.Open(filename)
//文件找不到,返回空
if err != nil {
return ""
}
//在函数结束时,关闭文件
defer file.Close()
/*defer是延迟执行函数,defer并不会在这一行执行,而是延迟在任何一个
getValue()函数的返回点,也就是函数退出的地方,调用file.Close()函数后,打开的文件
就会被关闭并释放系统资源*/
//使用读取器来读取文件
reader := bufio.NewReader(file)
//当前读取的段的名字
var sectionName string
for {
//读取文件的一行,从文件中读取,直到碰到"\n"
linestr, err := reader.ReadString('\n')
if err != nil {
break
}
//切掉行两边的空白字符
linestr = strings.TrimSpace(linestr)
//忽略空行
if linestr == "" {
continue
}
//忽略注释
if linestr[0] == ';' {
continue
}
//读取段和键值
//行首和尾巴分别是方括号的,说明是段标记的起止符
if linestr[0] == '[' && linestr[len(linestr)-1] == ']' {
//将段名取出
sectionName = linestr[1 : len(linestr)-1]
//这个段是希望读取的
} else if sectionName == expectSection {
//切开等号分割的键值对
//string.Spit()函数会返回字符串切片,类型为[]string.
//因此被分割后,string.Split()函数返回的字符串切片有2个元素
pair := strings.Split(linestr, "=")
//保证切开只有1个等号分割的简直情况
if len(pair) == 2 {
//去掉键的多余空白符
key := strings.TrimSpace(pair[0])
if key == expectKey {
//返回去掉空白字符的值
return strings.TrimSpace(pair[1])
}
}
}
}
return ""
}
func main() {
fmt.Println(getValue("example.ini", "remote \"origin\"", "fetch"))
}
输出结果: