教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go中配置文件读取的几种方式

Go中配置文件读取的几种方式

发布时间:2022-01-01   编辑:jiaochengji.com
教程集为您提供Go中配置文件读取的几种方式等资源,欢迎您收藏本站,我们将为您提供最新的Go中配置文件读取的几种方式资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

日常开发中读取配置文件包含以下几种格式:

<ul><li>json 格式字符串</li><li>K=V 键值对</li><li>xml 文件</li><li>yml 格式文件</li><li>toml 格式文件</li></ul>

前面两种书写简单,解析过程也比较简单。xml形式书写比较累赘,yml是树形结构,为简化配置而生,toml是一种有着自己语法规则的配置文件格式,我们一一来看使用方式,各位看官自行比较哪种更加实用。

<h4>1.读取json格式的文件</h4> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"encoding/json"</span> <span class="token string">"fmt"</span> <span class="token string">"io/ioutil"</span> <span class="token string">"log"</span> <span class="token string">"sync"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> Configs <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span>json<span class="token punctuation">.</span>RawMessage <span class="token keyword">var</span> configPath <span class="token builtin">string</span> <span class="token operator">=</span> <span class="token string">"c:/test.json"</span> <span class="token keyword">type</span> MainConfig <span class="token keyword">struct</span> <span class="token punctuation">{</span> Port <span class="token builtin">string</span> <span class="token string">`json:"port"`</span> Address <span class="token builtin">string</span> <span class="token string">`json:"address"`</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> conf <span class="token operator">*</span>MainConfig <span class="token keyword">var</span> confs Configs <span class="token keyword">var</span> instanceOnce sync<span class="token punctuation">.</span>Once <span class="token comment">//从配置文件中载入json字符串</span> <span class="token keyword">func</span> <span class="token function">LoadConfig</span><span class="token punctuation">(</span>path <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>Configs<span class="token punctuation">,</span> <span class="token operator">*</span>MainConfig<span class="token punctuation">)</span> <span class="token punctuation">{</span> buf<span class="token punctuation">,</span> err <span class="token operator">:=</span> ioutil<span class="token punctuation">.</span><span class="token function">ReadFile</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Panicln</span><span class="token punctuation">(</span><span class="token string">"load config conf failed: "</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span> mainConfig <span class="token operator">:=</span> <span class="token operator">&</span>MainConfig<span class="token punctuation">{</span><span class="token punctuation">}</span> err <span class="token operator">=</span> json<span class="token punctuation">.</span><span class="token function">Unmarshal</span><span class="token punctuation">(</span>buf<span class="token punctuation">,</span> mainConfig<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Panicln</span><span class="token punctuation">(</span><span class="token string">"decode config file failed:"</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span> allConfigs <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span>Configs<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> err <span class="token operator">=</span> json<span class="token punctuation">.</span><span class="token function">Unmarshal</span><span class="token punctuation">(</span>buf<span class="token punctuation">,</span> <span class="token operator">&</span>allConfigs<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Panicln</span><span class="token punctuation">(</span><span class="token string">"decode config file failed:"</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> allConfigs<span class="token punctuation">,</span> mainConfig <span class="token punctuation">}</span> <span class="token comment">//初始化 可以运行多次</span> <span class="token keyword">func</span> <span class="token function">SetConfig</span><span class="token punctuation">(</span>path <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> allConfigs<span class="token punctuation">,</span> mainConfig <span class="token operator">:=</span> <span class="token function">LoadConfig</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span> configPath <span class="token operator">=</span> path conf <span class="token operator">=</span> mainConfig confs <span class="token operator">=</span> allConfigs <span class="token punctuation">}</span> <span class="token comment">// 初始化,只能运行一次</span> <span class="token keyword">func</span> <span class="token function">Init</span><span class="token punctuation">(</span>path <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token operator">*</span>MainConfig <span class="token punctuation">{</span> <span class="token keyword">if</span> conf <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token operator">&&</span> path <span class="token operator">!=</span> configPath <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"the config is already initialized, oldPath=%s, path=%s"</span><span class="token punctuation">,</span> configPath<span class="token punctuation">,</span> path<span class="token punctuation">)</span> <span class="token punctuation">}</span> instanceOnce<span class="token punctuation">.</span><span class="token function">Do</span><span class="token punctuation">(</span><span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> allConfigs<span class="token punctuation">,</span> mainConfig <span class="token operator">:=</span> <span class="token function">LoadConfig</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span> configPath <span class="token operator">=</span> path conf <span class="token operator">=</span> mainConfig confs <span class="token operator">=</span> allConfigs <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">return</span> conf <span class="token punctuation">}</span> <span class="token comment">//初始化配置文件 为 struct 格式</span> <span class="token keyword">func</span> <span class="token function">Instance</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span>MainConfig <span class="token punctuation">{</span> <span class="token keyword">if</span> conf <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token function">Init</span><span class="token punctuation">(</span>configPath<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> conf <span class="token punctuation">}</span> <span class="token comment">//初始化配置文件 为 map格式</span> <span class="token keyword">func</span> <span class="token function">AllConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span> Configs <span class="token punctuation">{</span> <span class="token keyword">if</span> conf <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token function">Init</span><span class="token punctuation">(</span>configPath<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> confs <span class="token punctuation">}</span> <span class="token comment">//获取配置文件路径</span> <span class="token keyword">func</span> <span class="token function">ConfigPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> configPath <span class="token punctuation">}</span> <span class="token comment">//根据key获取对应的值,如果值为struct,则继续反序列化</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>cfg Configs<span class="token punctuation">)</span> <span class="token function">GetConfig</span><span class="token punctuation">(</span>key <span class="token builtin">string</span><span class="token punctuation">,</span> config <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">{</span> c<span class="token punctuation">,</span> ok <span class="token operator">:=</span> cfg<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token keyword">if</span> ok <span class="token punctuation">{</span> <span class="token keyword">return</span> json<span class="token punctuation">.</span><span class="token function">Unmarshal</span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> config<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> fmt<span class="token punctuation">.</span><span class="token function">Errorf</span><span class="token punctuation">(</span><span class="token string">"fail to get cfg with key: %s"</span><span class="token punctuation">,</span> key<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> path <span class="token operator">:=</span> <span class="token function">ConfigPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"path: "</span><span class="token punctuation">,</span>path<span class="token punctuation">)</span> <span class="token function">Init</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span> value <span class="token operator">:=</span> confs<span class="token punctuation">[</span><span class="token string">"port"</span><span class="token punctuation">]</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

json格式文件内容:

<pre><code class="lang-json hljs"><span class="token punctuation">{</span> <span class="token string">"port"</span><span class="token punctuation">:</span> <span class="token string">"7788"</span><span class="token punctuation">,</span> <span class="token string">"address"</span><span class="token punctuation">:</span> <span class="token string">"47.95.34.2"</span> <span class="token punctuation">}</span> </code></pre>

运行结果:

<pre><code>path: c:/test.json "7788" </code></pre> <h4>
2. 读取key=value类型的配置文件</h4> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"bufio"</span> <span class="token string">"io"</span> <span class="token string">"os"</span> <span class="token string">"strings"</span> <span class="token punctuation">)</span> <span class="token comment">//读取key=value类型的配置文件</span> <span class="token keyword">func</span> <span class="token function">InitConfig</span><span class="token punctuation">(</span>path <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token punctuation">{</span> config <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> f<span class="token punctuation">,</span> err <span class="token operator">:=</span> os<span class="token punctuation">.</span><span class="token function">Open</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span> <span class="token keyword">defer</span> f<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token function">panic</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">}</span> r <span class="token operator">:=</span> bufio<span class="token punctuation">.</span><span class="token function">NewReader</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> b<span class="token punctuation">,</span> <span class="token boolean">_</span><span class="token punctuation">,</span> err <span class="token operator">:=</span> r<span class="token punctuation">.</span><span class="token function">ReadLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> err <span class="token operator">==</span> io<span class="token punctuation">.</span>EOF <span class="token punctuation">{</span> <span class="token keyword">break</span> <span class="token punctuation">}</span> <span class="token function">panic</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">}</span> s <span class="token operator">:=</span> strings<span class="token punctuation">.</span><span class="token function">TrimSpace</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">)</span> index <span class="token operator">:=</span> strings<span class="token punctuation">.</span><span class="token function">Index</span><span class="token punctuation">(</span>s<span class="token punctuation">,</span> <span class="token string">"="</span><span class="token punctuation">)</span> <span class="token keyword">if</span> index <span class="token operator"><</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token keyword">continue</span> <span class="token punctuation">}</span> key <span class="token operator">:=</span> strings<span class="token punctuation">.</span><span class="token function">TrimSpace</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token punctuation">:</span>index<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token keyword">continue</span> <span class="token punctuation">}</span> value <span class="token operator">:=</span> strings<span class="token punctuation">.</span><span class="token function">TrimSpace</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>index<span class="token operator"> </span><span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token keyword">continue</span> <span class="token punctuation">}</span> config<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">=</span> value <span class="token punctuation">}</span> <span class="token keyword">return</span> config <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> config <span class="token operator">:=</span> <span class="token function">InitConfig</span><span class="token punctuation">(</span><span class="token string">"c:/1.txt"</span><span class="token punctuation">)</span> ip <span class="token operator">:=</span> config<span class="token punctuation">[</span><span class="token string">"ip"</span><span class="token punctuation">]</span> port <span class="token operator">:=</span> config<span class="token punctuation">[</span><span class="token string">"port"</span><span class="token punctuation">]</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"ip="</span><span class="token punctuation">,</span><span class="token function">string</span><span class="token punctuation">(</span>ip<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token string">" port="</span><span class="token punctuation">,</span><span class="token function">string</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

配置文件类容:

<pre><code>ip=127.0.0.1 port=3344 </code></pre>

运行结果:

<pre><code>ip=127.0.0.1 port=3344 </code></pre> <h4>
3. 读取yml格式文件</h4>

Java中SpringBoot支持使用yml格式的配置文件作为替代properties文件的一种方式。跟properties文件相比,好处就是层级目录,相同的前缀都在该前缀下,前缀只用写一次即可。Go也支持yml文件解析,只是麻烦的程度真的是,,,不想写!

我们先定义一个yml文件:

<pre><code class="lang-yml hljs"><span class="token key atrule">port</span><span class="token punctuation">:</span> <span class="token number">8080</span> <span class="token key atrule">ip</span><span class="token punctuation">:</span> 127.0.0.1 <span class="token key atrule">host</span><span class="token punctuation">:</span> www.baidu.com <span class="token key atrule">spring</span><span class="token punctuation">:</span> <span class="token key atrule">redis</span><span class="token punctuation">:</span> <span class="token key atrule">host</span><span class="token punctuation">:</span> redis.dns.baidu.com <span class="token key atrule">port</span><span class="token punctuation">:</span> <span class="token number">6379</span> <span class="token key atrule">dataBase</span><span class="token punctuation">:</span> <span class="token number">0</span> <span class="token key atrule">timeout</span><span class="token punctuation">:</span> <span class="token number">2000</span> </code></pre>

解析代码如下:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> utils <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"gopkg.in/yaml.v2"</span> <span class="token string">"io/ioutil"</span> <span class="token punctuation">)</span> <span class="token comment">//解析yml文件</span> <span class="token keyword">type</span> BaseInfo <span class="token keyword">struct</span> <span class="token punctuation">{</span> Port <span class="token builtin">string</span> <span class="token string">`yaml:"port"`</span> Ip <span class="token builtin">string</span> <span class="token string">`yaml:"ip"`</span> Host <span class="token builtin">string</span> <span class="token string">`yaml:"host"`</span> Spring RedisEntity <span class="token string">`yaml:"spring"`</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> RedisEntity <span class="token keyword">struct</span> <span class="token punctuation">{</span> Redis RedisData <span class="token string">`yaml:"redis"`</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> RedisData <span class="token keyword">struct</span> <span class="token punctuation">{</span> Host <span class="token builtin">string</span> <span class="token string">`yaml:"host"`</span> Port <span class="token builtin">string</span> <span class="token string">`yaml:"port"`</span> DataBase <span class="token builtin">string</span> <span class="token string">`yaml:"dataBase"`</span> Timeout <span class="token builtin">string</span> <span class="token string">`yaml:"timeout"`</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>c <span class="token operator">*</span>BaseInfo<span class="token punctuation">)</span> <span class="token function">GetConf</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span>BaseInfo <span class="token punctuation">{</span> yamlFile<span class="token punctuation">,</span> err <span class="token operator">:=</span> ioutil<span class="token punctuation">.</span><span class="token function">ReadFile</span><span class="token punctuation">(</span><span class="token string">"c:/1.yml"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> err <span class="token operator">=</span> yaml<span class="token punctuation">.</span><span class="token function">Unmarshal</span><span class="token punctuation">(</span>yamlFile<span class="token punctuation">,</span> c<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> c <span class="token punctuation">}</span> </code></pre>

解释一下:以上yml文件中是有三层目录结构,所以需要定义三个struct,每个struct分别包含每一层的字段。这样说你应该就能明白如何解析。

运行一下test方法来验证上面程序:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"goProject/src/utils"</span> <span class="token string">"testing"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">Test</span><span class="token punctuation">(</span>t <span class="token operator">*</span>testing<span class="token punctuation">.</span>T<span class="token punctuation">)</span> <span class="token punctuation">{</span> info <span class="token operator">:=</span> utils<span class="token punctuation">.</span>BaseInfo<span class="token punctuation">{</span><span class="token punctuation">}</span> conf <span class="token operator">:=</span> info<span class="token punctuation">.</span><span class="token function">GetConf</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>conf<span class="token punctuation">.</span>Host<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

可以看到将yml中的树形结构解析为<code>BaseInfo</code>对象。

<h4>
4. 读取toml格式文件</h4>

仿佛我感觉这个比读取yml文件更为痛苦,因为在写toml文件的时候,还有一定的语法规则,仿佛在告诉你别停,继续学习。

TOML 的全称是Tom’s Obvious, Minimal Language,因为它的作者是 GitHub联合创始人Tom Preston-Werner 。 TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表的结构,从而可以被多种语言解析。

举个例子:

<pre><code class="lang-toml hljs">port=8080 [user] name="xiaoming" age=14 sex=1 [database] servers=["127.0.0.1","127.0.0.2","127.0.0.3"] connection_max=5000 enabled=true [servers] # 你可以依照你的意愿缩进。使用空格或Tab。TOML不会在意。 [servers.a] ip="34.23.1.4" port=6379 [servers.b] ip="34.23.1.6" port=9921 #嵌套 [nest] data=[["n1","n2"],[1,2]] # 在数组里换行没有关系。 names = [ "li", "wang" ] </code></pre>

下面来解释一下toml格式的书写规范。

首先:TOML 是大小写敏感的。

常见的语法规则:

<ol><li>

注释

使用 # 表示注释。

</li><li>

字符串

</li></ol>

字符串以<code>""</code>包裹,里面的字符必须是 UTF-8 格式。引号、反斜杠和控制字符(U 0000 到 U 001F)需要转义。

常用的转义序列:

<pre><code>\b - backspace (U 0008) \t - tab (U 0009) \n - linefeed (U 000A) \f - form feed (U 000C) \r - carriage return (U 000D) \" - quote (U 0022) \/ - slash (U 002F) \\ - backslash (U 005C) \uXXXX - unicode (U XXXX) </code></pre> <ol start="3"><li>

布尔值

true

false

</li><li>

日期

使用ISO8601格式日期:

<pre><code>2019-05-03T22:44:26Z </code></pre> </li><li>

数组

数组使用方括号包裹。空格会被忽略。元素使用逗号分隔。注意,不允许混用数据类型。

<pre><code>[ 1, 2, 3 ] [ "red", "yellow", "green" ] [ [ 1, 2 ], [3, 4, 5] ] [ [ 1, 2 ], ["a", "b", "c"] ] # 这是可以的。 [ 1, 2.0 ] # 注意:这是不行的。 </code></pre> </li><li>

数值类型

数值类型严格区分整数和浮点数。这两个不是一种类型。

</li><li>

字典对象

多个kv集合在一起组成字典对象。字典对象的名字用<code>[]</code>包含起来,单独作为一行。

解释一下这种格式对应的json格式:

<pre><code>[servers.a] ip="34.23.1.4" port=6379 { "servers": { "a": { "ip": "34.23.1.4","port":6379}}} </code></pre>

我们写一个小程序来解析上面的toml文件:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> utils <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"github.com/BurntSushi/toml"</span> <span class="token string">"io/ioutil"</span> <span class="token string">"os"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> BaseData <span class="token keyword">struct</span> <span class="token punctuation">{</span> Db DataBase <span class="token string">`toml:"dataBase"`</span> Se Servers <span class="token string">`toml:"servers"`</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> DataBase <span class="token keyword">struct</span> <span class="token punctuation">{</span> Servers <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token string">`toml:"servers"`</span> ConnectionMax <span class="token builtin">int</span> <span class="token string">`toml:"connection_max"`</span> Enabled <span class="token builtin">bool</span> <span class="token string">`toml:"enabled"`</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Servers <span class="token keyword">struct</span> <span class="token punctuation">{</span> A ServerEn <span class="token string">`toml:"a"`</span> B ServerEn <span class="token string">`toml:"b"`</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> ServerEn <span class="token keyword">struct</span> <span class="token punctuation">{</span> IP <span class="token builtin">string</span> <span class="token string">`toml:"ip"`</span> Port <span class="token builtin">int</span> <span class="token string">`toml:"port"`</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">ReadConf</span><span class="token punctuation">(</span>fname <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>BaseData<span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> <span class="token punctuation">(</span> fp <span class="token operator">*</span>os<span class="token punctuation">.</span>File fcontent <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">byte</span> <span class="token punctuation">)</span> p <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>BaseData<span class="token punctuation">)</span> <span class="token keyword">if</span> fp<span class="token punctuation">,</span> err <span class="token operator">=</span> os<span class="token punctuation">.</span><span class="token function">Open</span><span class="token punctuation">(</span>fname<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"open error "</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> fcontent<span class="token punctuation">,</span> err <span class="token operator">=</span> ioutil<span class="token punctuation">.</span><span class="token function">ReadAll</span><span class="token punctuation">(</span>fp<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"ReadAll error "</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> err <span class="token operator">=</span> toml<span class="token punctuation">.</span><span class="token function">Unmarshal</span><span class="token punctuation">(</span>fcontent<span class="token punctuation">,</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"toml.Unmarshal error "</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> </code></pre>

注意看我定义的对象,也是逐层解析。

测试类:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"goProject/src/utils"</span> <span class="token string">"testing"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">Test</span><span class="token punctuation">(</span>t <span class="token operator">*</span>testing<span class="token punctuation">.</span>T<span class="token punctuation">)</span> <span class="token punctuation">{</span> p<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> utils<span class="token punctuation">.</span><span class="token function">ReadConf</span><span class="token punctuation">(</span><span class="token string">"c:/1.toml"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> </li></ol> 到此这篇关于“Go中配置文件读取的几种方式”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang基础学习-动态获取配置文件(viper)
如何读取yaml,json,ini等配置文件【Golang 入门系列九】
Go之开发小功能集合(viper获取配置信息,test编写测试单元,用户目录获取,JWT安全校验,字符串去重,Swag...
Go语言从入门到精通 -【web项目实战篇】- 读取配置文件
dubbo-go 的开发、设计与功能介绍
golang读取配置文件
golang开源配置管理组件-go-archaius介绍
Go语言爱好者周刊:第 78 期 — 这道关于 goroutine 的题
go语言快速读取配置文件并声明环境变量
golang几种常用配置文件使用方法总结(yaml、toml、json、xml、ini)

[关闭]
~ ~