开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情
为了程序的解耦合,通常把一些常用的或者是固定的配置信息独立出来,这样也方便了程序的修改,比如一些数据库的配置信息,开发环境的设置等都需要在配置文件中进行设置,那么我们的程序如何加载配置文件中的信息呢?我们可以很快想到文件的操作知识,第一步要做的就是将文件读取到内存中,将读取出的内容放到提前声明的结构体对象中,然后就可以在需要的地方填充使用配置信息了,这个具体代码是如何实现的呢?下面我们来使用go来简单举例一下:
常用的配置文件格式有xml、ini、toml、json、properties等,根据需要使用,本案例使用xml进行举例:
<servers version="1">
<server>
<serverName>Shanghai_VPN</serverName>
<serverIP>127.0.0.1</serverIP>
</server>
<server>
<serverName>Beijing_VPN</serverName>
<serverIP>127.0.0.2</serverIP>
</server>
</servers>
已经有了配置文件,那么该如何解析呢,go中用来解析xml文件的方法是xml包下的ummarshal,这个方法可以将接收到的xml文件数据流内的数据存放到指定的结构体或者其他类型的数据结构中,通常会选择存放到struct中,因为struct应有和xml相同的树状结构,完成代码如下:
type Recurlyservers stuct{
XMLName xml.Name `xml:"servers"`
Version string `xml:"version,attr"`
Svs []server `xml:"server"`
Description string `xml:",innerxml"`
}type server struct {
XMLName xml.Name `xml:"server"`
ServerName string `xml:"serverName"`
ServerIP string `xml:"serverIP"`
}
func main() {
file, err := os.Open("servers.xml") // For read access.
if err != nil {
fmt.Printf("error: %v", err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Printf("error: %v", err)
return
}
v := Recurlyservers{}
err = xml.Unmarshal(data, &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println(v)
}
需要注意的是,需要在结构体后声明正确的tag,这就是反射的一种应用。Go也有类似java中public、private的访问限制,只不过go是使用大小写体现的,结构体内的成员变量或者成员方法只有在大写时才对其他包是可见的,因此要将数据存入结构体字段时,结构体内的字段必须是大写的,否则xml包内的成员“看不见”结构体的字段,而要将数据存入正确的字段中,是需要名字一致的,所以使用到tag来标注该字段在xml包中要匹配的数据块名叫什么。