小白刚刚开始学习编程,学习【GO语言 从入门到进阶挑战】,在此记录第一个小程序的调试。书中字符集应用的章节,有一个举例:读取ini文件中的健值,小白照葫芦画瓢在LiteIDE中,敲入代码,随便找到了一个ini文件进行读取,代码如下:
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
//函数中第一个参数为文件名称,第二个参数为段名,如[database],第三个参数段中对应的键,如 “user=root”,其中user为键,root为值
func getValue(filename, expectionSection, expectKey string) string {
//读取文件
file, err := os.Open(filename)
if err != nil {
return "123"
}
defer file.Close()
//读取行文本
reader := bufio.NewReader(file) //使用读取器读取文件
var sectionName string //当前读取的段的名字
returnstring := "back" //返回字段的名字
// i := 1
for {
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 == expectionSection { //读取健值
pair := strings.Split(linestr, "=")
if len(pair) == 2 {
key := strings.TrimSpace(pair[0])
if key == expectKey {
returnstring = strings.TrimSpace(pair[1])
}
}
}
}
return returnstring
}
func main() {
fmt.Println(getValue("db.ini", "DataBase", "pwd"))
}
问题:执行结果总是为空
调试过程:1)发现执行过程中未进入“读取健值”的else if语句,即未获取到正确的段名 2)在读取段时,sectionName获取时,len(linestr)值不正确 3)挨个打出linestr的ASCII码,发现除正确的字符外,还包括了237、187等ASCII码 4)查看ini文件的编码格式,为utf-8-BOM 5)将ini文件的编码格式变为utf-8 ,重新编译执行,功能正确