GO 依赖比较好的库(包)或资源

手册相关

学习相关

推荐文章

实用相关

1.更新 Goland debugger 工具

// https://www.jianshu.com/p/21c9110bfae3
go get -u -v github.com/derekparker/delve/cmd/dlv

2.xorm 操作数据库

Golang名库 xorm讲解

go get github.com/go-xorm/xorm
go get github.com/go-sql-driver/mysql

3. gorm 操作数据库

go get -u github.com/jinzhu/gorm
go get github.com/go-sql-driver/mysql

4. gopkg.in/fatih/set.v0

https://gopkg.in/fatih/set.v0
包集提供通用集数据结构的线程安全和非线程安全实现。 在线程安全集中,安全性包含一组中的所有操作。 多个集合的操作是一致的,因为所使用的每个集合的元素在操作的开始和结束之间的恰好一个时间点是有效的。

go get gopkg.in/fatih/set.v0

5. go vet

go vet vet工具可以帮我们静态分析我们的源码存在的各种问题,例如多余的代码,提前return的逻辑,struct的tag是否符合标准等。

go get golang.org/x/tools/cmd/vet

使用如下:

go vet .

6. russross/blackfriday

第三方库russross/blackfriday用于在golang中使用markdown语法。
markdown: 是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。
Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例如LaTeX,Docbook。Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。
test.md:

示例代码:

func main() {
    fileread, _ := ioutil.ReadFile("extra/blackfriday转换markdown/test.md")
    //转换Markdown语法,如将"#"转换为"<h1></h1>"
    subHtml := blackfriday.MarkdownCommon(fileread)
    subHtmlStr := string(subHtml)
    fmt.Println(subHtmlStr)
}

输出:

<h2>一、russross/blackfriday包</h2>

封装:

func SwitchMarkdownToHtml(content string) template.HTML {
    markdown := blackfriday.MarkdownCommon([]byte(content))

    //获取到html文档
    doc, _ := goquery.NewDocumentFromReader(bytes.NewReader(markdown))
    /**
    对document进程查询,选择器和css的语法一样
    第一个参数:i是查询到的第几个元素
    第二个参数:selection就是查询到的元素
     */
    doc.Find("code").Each(func(i int, selection *goquery.Selection) {
        light, _ := syntaxhighlight.AsHTML([]byte(selection.Text()))
        selection.SetHtml(string(light))
        fmt.Println(selection.Html())
        fmt.Println("light:", string(light))
        fmt.Println("\n\n\n")
    })
    htmlString, _ := doc.Html()
    return template.HTML(htmlString)
}

7. PuerkitoBio/goquery包

做过 Web 开发的,应该都用过或听过 jQuery,它提供了方便的操作 DOM 的 API。使用 Go 语言做服务器端开发,有时候需要解析 HTML 文件,比如抓取网站内容、写一个爬虫等。这时候如果有一个类似 jQuery 的库可以使用,操作 DOM 会很方便,而且,上手也会很快。PuerkitoBio/goquery 这个库就实现了类似 jQuery 的功能,让你能方便的使用 Go 语言操作 HTML 文档。
该库提供的类型很少,但方法却很多,我们不可能一个个方法讲解。这里通过模拟几个使用场景来讲解该库的使用。

7.1 Document

Document 代表一个将要被操作的 HTML 文档,不过,和 jQuery 不同,它装载的是 DOM 文档的一部分。

type Document struct {
    *Selection
    Url *url.URL
    rootNode *html.Node // 文档的根节点
}

因为 Document 中内嵌了一个 Selection 类型,因此,Document 可以直接使用 Selection 类型的方法。提供有五种方法获取一个 Document 实例。

7.2 Selection

Selection 代表符合特定条件的节点集合。

type Selection struct {
    Nodes []*html.Node
    document *Document
    prevSel *Selection
}

一般地,得到了 Document 实例后,通过 Dcoument.Find 方法获取一个 Selection 实例,然后像 jQuery 一样使用链式语法和方法操作它。
Selection 类型提供的方法可以分为如下几大类

  • 类似函数的位置操作
  • 扩大 Selection 集合(增加选择的节点)
  • 过滤方法,减少节点集合
  • 循环遍历选择的节点
  • 修改文档
  • 检测或获取节点属性值
  • 查询或显示一个节点的身份
  • 在文档树之间来回跳转(常用的查找节点方法)

7.3. 基本用法:

1、创建文档

d,e := goquery.NewDocumentFromReader(reader io.Reader)
d,e := goquery.NewDocument(url string)

2、查找内容

ele.Find("#title") //根据id查找
ele.Find(".title") //根据class查找
ele.Find("h2").Find("a") //链式调用

3、获取内容

ele.Html()
ele.Text()

4、获取属性

ele.Attr(“href”)
ele.AttrOr(“href”, “”)

5、遍历

ele.Find(“.item”).Each(func(index int, ele *goquery.Selection){
})

示例:

func main() {
    doc, err := goquery.NewDocument("http://studygolang.com/topics")
    if err != nil {
        log.Fatal(err)
    }

    doc.Find(".topic").Each(func(i int, contentSelection *goquery.Selection) {
        title := contentSelection.Find(".title a").Text()
        //Find(".title a")与Find(".title").Find("a")一样
        fmt.Println("第", i+1, "个帖子的标题:", title)
        //ret,_ := contentSelection.Html()
        //fmt.Printf("\n\n\n%v", ret)
        //fmt.Println(contentSelection.Text())
    })
    //最终输出为 html 文档:
    //new, err := doc.Html()
}

其中Find中的输入字符串是CSS selector,其语法风格参照 http://www.w3school.com.cn/cssref/css_selectors.asp 。如:

语法 表述
#firstname 选择 id="firstname" 的所有元素。
* 选择所有元素。
p 选择所有 <p> 元素。
div,p 选择所有 <div> 元素和所有 <p> 元素。
div p 选择 <div> 元素内部的所有 <p> 元素。
div>p 选择父元素为 <div> 元素的所有 <p> 元素。
div+p 选择紧接在 <div> 元素之后的所有 <p> 元素。
[target] 选择带有 target 属性所有元素。
[target=_blank] 选择 target="_blank" 的所有元素。
a[src*=”abc”] 选择其 src 属性中包含 “abc” 子串的每个 <a> 元素。
a[src$=”.pdf”] 选择其 src 属性以 “.pdf” 结尾的所有 <a> 元素。

8. sourcegraph/syntaxhighlight包

syntaxhighlight包提供代码的语法高亮显示。 它目前使用独立于语言的词法分析器,并在JavaScript,Java,Ruby,Python,Go和C上表现出色。主要的AsHTML(src []byte) ([]byte, error)函数,输出就是HTML与google-code-prettify相同的CSS类,因此任何样式表也应该适用于此包。

func main() {
   src := []byte(`
/* hello, world! */
var a = 3;

// b is a cool function
function b() {
  return 7;
}`)
   highlighted, err := syntaxhighlight.AsHTML(src)
   if err != nil {
      fmt.Println(err)
      os.Exit(1)
   }
   fmt.Println(string(highlighted))
}

输出

<span class="com">/* hello, world! */</span>
<span class="kwd">var</span> <span class="pln">a</span> <span class="pun">=</span> <span class="dec">3</span><span class="pun">;</span>
<span class="com">// b is a cool function</span>
<span class="kwd">function</span> <span class="pln">b</span><span class="pun">(</span><span class="pun">)</span> <span class="pun">{</span>
  <span class="kwd">return</span> <span class="dec">7</span><span class="pun">;</span>
<span class="pun">}</span>

通过如下规则就行的转换

var DefaultHTMLConfig = HTMLConfig{
    String:        "str",
    Keyword:       "kwd",
    Comment:       "com",
    Type:          "typ",
    Literal:       "lit",
    Punctuation:   "pun",
    Plaintext:     "pln",
    Tag:           "tag",
    HTMLTag:       "htm",
    HTMLAttrName:  "atn",
    HTMLAttrValue: "atv",
    Decimal:       "dec",
    Whitespace:    "",
}

9. logrus 日志系统

安装

go get -u github.com/sirupsen/logrus

基于 logrus 的自定义日志处理

package main

import (
    "os"

    log "github.com/Sirupsen/logrus"
)

func init() {
    // 日志格式化为 JSON 而不是默认的 ASCII
    log.SetFormatter(&log.JSONFormatter{})

    // 输出 stdout 而不是默认的 stderr,也可以是一个文件
    log.SetOutput(os.Stdout)

    // 只记录严重或以上警告
    log.SetLevel(log.WarnLevel)
}

func main() {
    log.WithFields(log.Fields{
        "animal": "walrus",
        "size":   10,
    }).Info("A group of walrus emerges from the ocean")

    log.WithFields(log.Fields{
        "omg":    true,
        "number": 122,
    }).Warn("The group's number increased tremendously!")

    log.WithFields(log.Fields{
        "omg":    true,
        "number": 100,
    }).Fatal("The ice breaks!")

    // 通过日志语句重用字段
    // logrus.Entry 返回自 WithFields()
    contextLogger := log.WithFields(log.Fields{
        "common": "this is a common field",
        "other":  "I also should be logged always",
    })

    contextLogger.Info("I'll be logged with common and other field")
    contextLogger.Info("Me too")
}
讨论数量: 0

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!