猿问

有没有清除此Go代码的方法?

我刚刚开始学习Go,并且已经制作了一个函数,该函数使用包含一些元数据的标头解析markdown文件(这些文件是博客文章)。


这是一个例子:


---

Some title goes here

19 September 2012

---

This is some content, read it.

我已经编写了此函数,该函数可以工作,但是我觉得它很冗长和混乱,我看过各种字符串包,但是我对Go不够了解,并且它是了解我应该成为的最佳实践。如果我能得到一些技巧来清理此问题,我将不胜感激。(另外,我知道我不应该忽略该错误)。


type Post struct {

    Title string

    Date string

    Body string

}

func loadPost(title string) *Post {

    filename := title + ".md"

    file, _ := ioutil.ReadFile("posts/" + filename)

    fileString := string(file)

    str := strings.Split(fileString, "---")

    meta := strings.Split(str[1], "\n")

    title = meta[1]

    date := meta[2]

    body := str[2]

    return &Post{Title: title, Date: date, Body: body}

}


猛跑小猪
浏览 167回答 3
3回答

蓝山帝景

我同意这还不错。我将添加其他一些想法。正如Thomas所展示的,您不需要中间变量title日期和body。尝试一下return &Post{     Title: meta[1],     Date: meta[2],     Body: body,}的确可以省略字段名称,但是有时候我喜欢它们使代码保持自我记录。(我认为兽医也喜欢它们。)我忙于字符串和字节片,但可能比我应该做的更多。由于您是一口气读取文件,因此您不必担心这一点。将所有内容转换为一个大字符串,然后将其切成薄片是一种便捷的操作方式,只需记住,如果保留字符串的任何部分,则会将其固定在内存中。如果您的文件很大,或者您有很多文件,而最终只保留了其中大多数文件的元数据,那么这可能不是解决之道。每个文件只有一个博客条目?如果是这样,我想我会提出托马斯建议的一种变体。验证前一个字节是---(或文件已损坏),然后使用strings.Index(fileString [3:],“ ---”)。当段数未知时,分割更合适。在您的情况下,您只是在元之后寻找单个分隔符。索引将在搜索元数据并完成之后找到它,而无需遍历整个身体。(无论如何,如果主体包含字符串“ ---”怎么办?)最后,有些人为此使用正则表达式。我还没有准备好使用正则表达式,但是无论如何,这是另一种方法。
随时随地看视频慕课网APP

相关分类

Go
我要回答