我刚刚开始学习Go,并且已经制作了一个函数,该函数使用包含一些元数据的标头解析markdown文件(这些文件是博客文章)。这是一个例子:---Some title goes here19 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}}
3 回答
蓝山帝景
TA贡献1843条经验 获得超7个赞
我同意这还不错。我将添加其他一些想法。
正如Thomas所展示的,您不需要中间变量title日期和body。尝试一下
return &Post{ Title: meta[1], Date: meta[2], Body: body,}
的确可以省略字段名称,但是有时候我喜欢它们使代码保持自我记录。(我认为兽医也喜欢它们。)
我忙于字符串和字节片,但可能比我应该做的更多。由于您是一口气读取文件,因此您不必担心这一点。将所有内容转换为一个大字符串,然后将其切成薄片是一种便捷的操作方式,只需记住,如果保留字符串的任何部分,则会将其固定在内存中。如果您的文件很大,或者您有很多文件,而最终只保留了其中大多数文件的元数据,那么这可能不是解决之道。
每个文件只有一个博客条目?如果是这样,我想我会提出托马斯建议的一种变体。验证前一个字节是---(或文件已损坏),然后使用strings.Index(fileString [3:],“ ---”)。当段数未知时,分割更合适。在您的情况下,您只是在元之后寻找单个分隔符。索引将在搜索元数据并完成之后找到它,而无需遍历整个身体。(无论如何,如果主体包含字符串“ ---”怎么办?)
最后,有些人为此使用正则表达式。我还没有准备好使用正则表达式,但是无论如何,这是另一种方法。
- 3 回答
- 0 关注
- 166 浏览
添加回答
举报
0/150
提交
取消