首先,我建议阅读这个相关问题:How to handle configuration in Go
接下来,我真的会考虑以另一种格式存储您的配置。因为你提出的不是标准。它接近 Java's property file format (.properties),但即使是属性文件也可能包含 Unicode 序列,因此您的代码不是有效的 .properties 格式解析器,因为它根本不处理 Unicode 序列。
相反,我建议使用JSON,这样您就可以轻松地使用 Go 或任何其他语言对其进行解析,并且有许多工具可以编辑 JSON 文本,而且它仍然对人类友好。
使用 JSON 格式,将其解码为 map 只是一个函数调用:json.Unmarshal()。它可能看起来像这样:
text := `{"Var1":"Value1", "Var2":"Value2", "Var3":"Value3"}`
var m map[string]string
if err := json.Unmarshal([]byte(text), &m); err != nil {
fmt.Println("Invalid config file:", err)
return
}
fmt.Println(m)
输出(在Go Playground上试试):
map[Var1:Value1 Var2:Value2 Var3:Value3]
json 包将为您处理格式化和转义,因此您不必担心这些。它还将为您检测和报告错误。 JSON 更灵活,您的配置可能包含数字、文本、数组等。所有这些都是“免费”的,因为您选择了 JSON 格式。
另一种流行的配置格式是YAML,但 Go 标准库不包含 YAML 解析器。请参阅 Go 实现 github.com/go-yaml/yaml。
如果您不想更改格式,那么我会使用您发布的代码,因为它完全按照您的要求执行:逐行处理输入,并解析 name = value 对从每一行。 它以一种清晰明了的方式做到了。为此目的使用 CSV 或任何其他阅读器是不好的,因为它们隐藏了引擎盖下的内容(它们有意且正确地隐藏了格式特定的细节和转换)。 CSV 阅读器是 CSV 阅读器首先;即使您更改了制表符/逗号符号:它将解释某些转义序列,并且可能会为您提供与您在纯文本编辑器中看到的不同的数据。从您的角度来看,这是一种无意的行为,但是,您的输入 不是 CSV 格式,但您要求读者将其解释为 CSV!
我要为您的解决方案添加的一项改进是使用bufio.Scanner。它可用于逐行读取输入,并处理不同样式的换行符序列。它可能看起来像这样:
text := `Var1=Value1
Var2=Value2
Var3=Value3`
scanner := bufio.NewScanner(strings.NewReader(text))
m := map[string]string{}
for scanner.Scan() {
parts := strings.Split(scanner.Text(), "=")
if len(parts) == 2 {
m[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
}
}
if err := scanner.Err(); err != nil {
fmt.Println("Error encountered:", err)
}
fmt.Println(m)
输出是一样的。在Go Playground 上试试吧。
使用bufio.Scanner 有另一个优势:bufio.NewScanner() 接受io.Reader,即“所有事物都是字节源”的通用接口。这意味着如果您的配置存储在一个文件中,您甚至不必将所有配置读入内存,您只需打开该文件,例如使用os.Open(),它返回一个值*os.File,它也实现io.Reader,所以你可以直接将*os.File值传递给bufio.NewScanner()(所以bufio.Scanner将从文件中读取,而不是从in -内存缓冲区,如上例所示)。