实例化Stucts和Arrays不会创建新的引用

时间:2016-05-22 20:42:02

标签: go

我正在尝试将简单的降价文件转换为json,降价看起来像这样:

"

我无法理解在 func main()中重构以下所需的内容:

"

上面的代码输出:

#TITLE 1
- Line 1
- Line 2
- Line 3

#TITLE 2
- Line 1
- Line 2
- Line 3
<!-- blank line -->

当我希望输出时:

    type Section struct {
        Category string
        Lines    []string
    }

    file, _ := os.Open("./src/basicmarkdown/basicmarkdown.md")

    defer file.Close()

    rgxRoot, _ := regexp.Compile("^#[^#]")
    rgxBehaviour, _ := regexp.Compile("^-[ ]?.*")

    scanner := bufio.NewScanner(file)

    ruleArr := []*Section{}
    rule := &Section{}

    for scanner.Scan() {

        linetext := scanner.Text()

        // If it's a blank line
        if rgxRoot.MatchString(linetext) {
            rule := &Section{}
            rule.Category = linetext
        }

        if rgxBehaviour.MatchString(linetext) {
            rule.Lines = append(rule.Lines, linetext)
        }

        if len(strings.TrimSpace(linetext)) == 0 {
            ruleArr = append(ruleArr, rule)
        }

    }

    jsonSection, _ := json.MarshalIndent(ruleArr, "", "\t")
    fmt.Println(string(jsonSection))

肯定有些事情是错误的。请原谅问题的详细程度,当你是一个菜鸟时,如果没有一个例子,很难解释。提前谢谢。

1 个答案:

答案 0 :(得分:2)

for循环中,仔细查看此部分:

// If it's a blank line
if rgxRoot.MatchString(linetext) {
    rule := &Section{} // Notice the `:=`
    rule.Category = linetext
}

当您可能希望重用已在rule循环之外创建的变量时,您基本上在if的范围内创建了一个新的for变量。

因此,请尝试将其更改为:

// If it's a blank line
if rgxRoot.MatchString(linetext) {
    rule = &Section{} // Notice the `=`
    rule.Category = linetext
}