
第二部分定义了若何选择一个构造体及其字段。有多种办法可以做到这一点。我们可以经由过程它的偏移(光标地位)、构造名称,单行(仅指定字段)或一系列行来定义它。最后,我们老是须要获得肇端行号。例如鄙人面的例子中,你可以看到一个例子,我们用它的名字来选择构造体,然后提取肇端行号,以便我们可以选择精确的字段:
而编辑器最好应用 字节偏移量 。例如下面你可以看到我们的光标刚好在“Port”字段名称之后,大年夜那边我们可以很轻易地获得肇端行号:
config设备中的 第三 部分实际上是一个到我们的 structtagpackage的 一对一的映射。它根本上许可我们在攫取字段后将设备传递给structtag包。如你所知,structtag包许可我们解析一个struct标签并在各个部分进行修改。然则,它不会覆写或更新构造体的域值。
我们该若何获得设备呢? 我们只需应用flag包,然后为设备中的每个字段创建一个标记,然后给他们赋值。举个例子:
- flagFile := flag.String("file", "", "Filename to be parsed")
- cfg := &config{
- file: *flagFile,
- }
我们对 设备中的每个字段 履行雷同操作。相干完全的列表请查看gomodifytag的当前master分支上的 flag 定义。
一旦我们有了设备,我们就可以做一些根本的验证了:
- func main() {
- cfg := config{ ... }
- err := cfg.validate()
- if err != nil {
- log.Fatalln(err)
- }
- // continue parsing
- }
- // validate validates whether the config is valid or not
- func (c *config) validate() error {
- if c.file == "" {
- return errors.New("no file is passed")
- }
- if c.line == "" && c.offset == 0 && c.structName == "" {
- return errors.New("-line, -offset or -struct is not passed")
- }
- if c.line != "" && c.offset != 0 ||
- c.line != "" && c.structName != "" ||
- c.offset != 0 && c.structName !=
推荐阅读
前人有云,“一言既出,驷马难追”,可见对说出口的话,是多么看重。可是,人总有说错话的时刻啊!为懂得决“手滑”的懊末路,微信在5.3.1.16版本中上线了“微信撤回”的>>>详细阅读
本文标题:用Go语言编写一门工具的终极指南
地址:http://www.17bianji.com/lsqh/38247.html
1/2 1