日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

12个必不可少的Go软件包和库

發(fā)布時(shí)間:2024/3/26 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 12个必不可少的Go软件包和库 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Go是一種令人贊嘆的語(yǔ)言,具有很大的發(fā)展動(dòng)力,并且專注于簡(jiǎn)單性。 這種方法在其標(biāo)準(zhǔn)庫(kù)中很明顯,該庫(kù)提供了所有基本要素,但不多。

幸運(yùn)的是,Go擁有一個(gè)充滿活力的社區(qū),該社區(qū)創(chuàng)建并共享了許多第三方庫(kù)。 在本教程中,我將向您介紹Go的12個(gè)最佳軟件包和庫(kù)。 其中一些具有相對(duì)狹窄的范圍,可以添加到任何項(xiàng)目中,而另一些則是大型項(xiàng)目,您可以將其合并到大規(guī)模,大規(guī)模的分布式系統(tǒng)中。

太棒了

在深入探究庫(kù)本身之前,讓我向您介紹Awesome Go ,這是一個(gè)非常活躍且精心策劃的Go庫(kù)和其他資源列表。 您應(yīng)該不時(shí)訪問(wèn)并檢查新功能。

1. Golang-Set

Go具有數(shù)組,切片和地圖,但是沒(méi)有固定的數(shù)據(jù)結(jié)構(gòu)。 您可以使用布爾映射來(lái)模擬集合,但最好是具有正確的操作和語(yǔ)義的實(shí)際數(shù)據(jù)類型。 這是golang-set的來(lái)源。這是創(chuàng)建新集合,添加項(xiàng)目和測(cè)試成員資格的基本示例:

package mainimport ("fmt""github.com/deckarep/golang-set" )func main() {basicColors := mapset.NewSet()basicColors.Add("Red")basicColors.Add("Blue")basicColors.Add("Green")if basicColors.Contains("Green") {fmt.Println("Yay! 'Green' is a basic color")} else {fmt.Println("What a disappointment! 'Green' is not a basic color")}if basicColors.Contains("Yellow") {fmt.Println("Yay! 'Yellow' is a basic color")} else {fmt.Println("What a disappointment! 'Yellow' is not a basic color")} }Output:Yay! 'Green' is a basic color What a disappointment! 'Yellow' is not a basic color

請(qǐng)注意,程序包名稱為“ mapset”。 除了基礎(chǔ)知識(shí)外,您還執(zhí)行所有設(shè)置操作,例如并集,交集和差。 您還可以遍歷設(shè)置值:

package mainimport ("fmt""github.com/deckarep/golang-set" )func main() {basicColors := mapset.NewSet()basicColors.Add("Red")basicColors.Add("Blue")basicColors.Add("Green")otherColors := mapset.NewSetFromSlice([]interface{}{"Orange", "Yellow", "Indigo", "Violet"})rainbowColors := basicColors.Union(otherColors)for color := range rainbowColors.Iterator().C {fmt.Println(color)} }

2.顏色

讓我們繼續(xù)顏色主題。 在編寫命令行程序時(shí),使用顏色突出顯示重要消息或區(qū)分錯(cuò)誤,成功和警告很有用。

顏色包為您的程序添加一些顏色提供了一種簡(jiǎn)便的方法(請(qǐng)參閱我在那里做的事情?)。 它使用ANSII轉(zhuǎn)義碼,也支持Windows! 這是一個(gè)簡(jiǎn)單的示例:

package mainimport ("github.com/fatih/color" )func main() {color.Red("Roses are red")color.Blue("Violets are blue") }

顏色包支持將顏色與背景色,粗體或斜體等樣式混合,以及將顏色與非顏色輸出混合使用。

package mainimport ("github.com/fatih/color""fmt" )func main() {minion := color.New(color.FgBlack).Add(color.BgYellow).Add(color.Bold)minion.Println("Minion says: banana!!!!!!")m := minion.PrintlnFunc()m("I want another banana!!!!!")slantedRed := color.New(color.FgRed, color.BgWhite, color.Italic).SprintFunc()fmt.Println("I've made a huge", slantedRed("mistake")) }

彩色包裝還有其他有用的功能。 繼續(xù)探索更多。

3.現(xiàn)在

現(xiàn)在,這是一個(gè)非常簡(jiǎn)單的程序包,它為標(biāo)準(zhǔn)時(shí)間程序包提供了方便的包裝,并使在當(dāng)前時(shí)間周圍輕松處理各種日期和時(shí)間構(gòu)造成為可能。

例如,您可以獲取當(dāng)前分鐘的開(kāi)始時(shí)間或最接近當(dāng)前時(shí)間的星期日的結(jié)束時(shí)間。 這是使用“現(xiàn)在”的方法:

package mainimport ("github.com/jinzhu/now""fmt" )func main() {fmt.Println("All the beginnings...")fmt.Println(now.BeginningOfMinute())fmt.Println(now.BeginningOfHour())fmt.Println(now.BeginningOfDay())fmt.Println(now.BeginningOfWeek())fmt.Println(now.BeginningOfMonth())fmt.Println(now.BeginningOfQuarter())fmt.Println(now.BeginningOfYear())}Output:All the beginnings... 2017-06-04 16:59:00 -0700 PDT 2017-06-04 16:00:00 -0700 PDT 2017-06-04 00:00:00 -0700 PDT 2017-06-04 00:00:00 -0700 PDT 2017-06-01 00:00:00 -0700 PDT 2017-04-01 00:00:00 -0700 PDT 2016-12-31 23:00:00 -0800 PST

您還可以解析時(shí)間,甚至添加自己的格式(這將需要更新已知格式)。 Now類型嵌入了time.Time ,因此您可以直接在Now對(duì)象上使用所有time.Time方法。

4.

gen工具會(huì)為您生成代碼,特別是類型識(shí)別代碼,它試圖緩解Go中沒(méi)有模板或泛型的空白。

您用特殊注釋注釋類型,然后gen生成包含在項(xiàng)目中的源文件。 沒(méi)有運(yùn)行時(shí)魔術(shù)。 讓我們來(lái)看一個(gè)例子。 這是帶注釋的類型。

// +gen slice:"Where,Count,GroupBy[int]" type Person struct {Name stringAge int }

運(yùn)行g(shù)en (確保它在您的路徑中)會(huì)生成person_slice.go :

// Generated by: gen // TypeWriter: slice // Directive: +gen on Personpackage main// PersonSlice is a slice of type Person. Use it where you would use []Person. type PersonSlice []Person// Where returns a new PersonSlice whose elements return true for func. See: http://clipperhouse.github.io/gen/#Where func (rcv PersonSlice) Where(fn func(Person) bool) (result PersonSlice) {for _, v := range rcv {if fn(v) {result = append(result, v)}}return result }// Count gives the number elements of PersonSlice that return true for the passed func. See: http://clipperhouse.github.io/gen/#Count func (rcv PersonSlice) Count(fn func(Person) bool) (result int) {for _, v := range rcv {if fn(v) {result++}}return }// GroupByInt groups elements into a map keyed by int. See: http://clipperhouse.github.io/gen/#GroupBy func (rcv PersonSlice) GroupByInt(fn func(Person) int) map[int]PersonSlice {result := make(map[int]PersonSlice)for _, v := range rcv {key := fn(v)result[key] = append(result[key], v)}return result }

該代碼提供了類似于LINQ的方法來(lái)對(duì)PersonSlice類型進(jìn)行操作。 它很容易理解,并且有很好的文檔記錄。

使用方法如下。 在主要功能中,定義了PersonSlice 。 age()函數(shù)從其Person參數(shù)中選擇年齡字段。 生成的GroupByInt()函數(shù)采用age()函數(shù)并從按年齡分組的切片中返回人員(34是吉姆,但23既有簡(jiǎn)又有凱爾)。

package mainimport ("fmt" )// +gen slice:"Where,Count,GroupBy[int]" type Person struct {Name stringAge int }func age(p Person) int {return p.Age }func main() {people := PersonSlice {{"Jim", 34},{"Jane", 23},{"Kyle", 23},}groupedByAge := people.GroupByInt(age)fmt.Println(groupedByAge) }Output:map[34:[{Jim 34}] 23:[{Jane 23} {Kyle 23}]]

5. Gorm

Go以其斯巴達(dá)性格而聞名。 數(shù)據(jù)庫(kù)編程也不例外。 Go最受歡迎的數(shù)據(jù)庫(kù)庫(kù)是相當(dāng)?shù)讓拥摹?Gorm通過(guò)以下功能將對(duì)象關(guān)系映射世界帶到了Go:

  • 關(guān)聯(lián)(有一個(gè),有很多,屬于,很多對(duì)很多,多態(tài))
  • 回調(diào)(創(chuàng)建/保存/更新/刪除/查找之前/之后)
  • 預(yù)加載(急切加載)
  • 交易次數(shù)
  • 復(fù)合主鍵
  • SQL生成器
  • 自動(dòng)遷移
  • 記錄儀
  • 可擴(kuò)展,基于GORM回調(diào)編寫插件

但這并不能涵蓋所有內(nèi)容。 如果您來(lái)自Python,請(qǐng)不要指望SQLAlchemy魔術(shù)。 對(duì)于更多花哨的東西,您必須將其降至更低的水平。 這是一個(gè)如何將Gorm與sqlite一起使用的示例。 請(qǐng)注意Product結(jié)構(gòu)中的嵌入式gorm.Model 。

package mainimport ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/sqlite" )type Product struct {gorm.ModelCode stringPrice uint }func main() {db, err := gorm.Open("sqlite3", "test.db")if err != nil {panic("failed to connect database")}defer db.Close()// Migrate the schemadb.AutoMigrate(&Product{})// Createdb.Create(&Product{Code: "L1212", Price: 1000})// Readvar product Productdb.First(&product, 1) // find product with id 1db.First(&product, "code = ?", "L1212")// Update - update product's price to 2000db.Model(&product).Update("Price", 2000)// Delete - delete productdb.Delete(&product)

6.

使用關(guān)系數(shù)據(jù)庫(kù)時(shí),最重要的任務(wù)之一就是管理模式。 在某些組織中,修改數(shù)據(jù)庫(kù)架構(gòu)被認(rèn)為是“小小的”改變。 goose軟件包使您可以執(zhí)行模式更改,甚至在需要時(shí)進(jìn)行數(shù)據(jù)遷移。 您可以goose up goose down走來(lái)走去。 不過(guò)請(qǐng)注意您的數(shù)據(jù),并確保它不會(huì)丟失或損壞。

Goose通過(guò)對(duì)模式進(jìn)行版本控制并使用與每個(gè)模式相對(duì)應(yīng)的遷移文件來(lái)工作。 遷移文件可以是SQL命令或Go命令。 這是添加新表的SQL遷移文件的示例:

-- +goose Up CREATE TABLE person (id int NOT NULL,name text,age int,PRIMARY KEY(id) );-- +goose Down DROP TABLE person;

-- +goose up和-- +goose down注釋告訴goose如何升級(jí)或降級(jí)架構(gòu)。

7.滑翔

Glide是Go的軟件包管理器。 在單個(gè)GOPATH ,您可能有許多具有相互依賴的程序。 解決方案是讓每個(gè)程序管理其自己的程序包依賴關(guān)系供應(yīng)商目錄。 滑行可以幫助完成此任務(wù)。

以下是滑行的功能:

  • 支持版本控制包,包括語(yǔ)義版本2.0.0支持。
  • 支持別名包(例如,使用github forks)。
  • 無(wú)需修改導(dǎo)入語(yǔ)句。
  • 使用所有Go工具。
  • 支持Go支持的所有VCS工具(git,bzr,hg,svn)。
  • 支持自定義本地和全局插件。
  • 存儲(chǔ)庫(kù)緩存和數(shù)據(jù)緩存可提高性能。
  • 平整依賴性,解決版本差異并避免多次包含軟件包。
  • 按需或在版本控制系統(tǒng)中按需管理和安裝依賴項(xiàng)。

依賴項(xiàng)存儲(chǔ)在glide.yaml中 ,glide提供了幾個(gè)命令來(lái)管理依賴項(xiàng):

create, init Initialize a new project, creating a glide.yaml fileconfig-wizard, cw Wizard that makes optional suggestions to improve config in a glide.yaml file.get Install one or more packages into `vendor/` and add dependency to glide.yaml.remove, rm Remove a package from the glide.yaml file, and regenerate the lock file.import Import files from other dependency management systems.name Print the name of this project.novendor, nv List all non-vendor paths in a directory.rebuild Rebuild ('go build') the dependenciesinstall, i Install a project's dependenciesupdate, up Update a project's dependenciestree (Deprecated) Tree prints the dependencies of this project as a tree.list List prints all dependencies that the present code references.info Info prints information about this projectcache-clear, cc Clears the Glide cache.about Learn about Glidemirror Manage mirrorshelp, h Shows a list of commands or help for one command

8.銀杏

銀杏是一個(gè)BDD(行為驅(qū)動(dòng)開(kāi)發(fā))測(cè)試框架。 它使您能夠以類似于英語(yǔ)的語(yǔ)法編寫測(cè)試,并允許較少的技術(shù)人員檢查測(cè)試(及其輸出)并驗(yàn)證它們是否符合業(yè)務(wù)需求。

一些開(kāi)發(fā)人員也喜歡這種風(fēng)格的測(cè)試規(guī)范。 它與Go的內(nèi)置測(cè)試包集成在一起,通常與Gomega結(jié)合使用。 這是一個(gè)銀杏+ Gomega測(cè)試的例子:

actual, err := foo() Ω(err).Should(BeNil()) Ω(actual).ShouldNot(BeNil()) Ω(actual.result).Should(Equal(100))

9.

Etcd是可靠的分布式鍵值存儲(chǔ)。 服務(wù)器在Go中實(shí)現(xiàn),而Go客戶端通過(guò)gRPC與之交互。

它著重于以下方面:

  • 簡(jiǎn)單:定義明確,面向用戶的API(gRPC)。
  • 安全:具有可選客戶端證書身份驗(yàn)證的自動(dòng)TLS。
  • 快速:基準(zhǔn)10,000次寫入/秒。
  • 可靠:使用Raft正確分發(fā)。

這是連接到服務(wù)器,設(shè)置值并獲取它的一個(gè)示例,包括超時(shí)和清除。

func test_get() {cli, err := clientv3.New(clientv3.Config{Endpoints: endpoints,DialTimeout: dialTimeout,})if err != nil {log.Fatal(err)}defer cli.Close()_, err = cli.Put(context.TODO(), "foo", "bar")if err != nil {log.Fatal(err)}ctx, cancel := context.WithTimeout(context.Background(), requestTimeout)resp, err := cli.Get(ctx, "foo")cancel()if err != nil {log.Fatal(err)}for _, ev := range resp.Kvs {fmt.Printf("%s : %s\n", ev.Key, ev.Value)}// Output: foo : bar }

10. NSQ

NSQ是一個(gè)很棒的分布式隊(duì)列。 我已經(jīng)成功地將其用作大型分布式系統(tǒng)的主要構(gòu)建塊。 以下是其一些功能:

  • 支持無(wú)SPOF的分布式拓?fù)洹?
  • 水平可擴(kuò)展(沒(méi)有代理,可以無(wú)縫地將更多節(jié)點(diǎn)添加到集群)。
  • 基于低延遲推送的消息傳遞(性能)。
  • 組合負(fù)載平衡和多播樣式的消息路由。
  • 在流(高吞吐量)和面向工作(低吞吐量)的工作負(fù)載下都可以使用Excel。
  • 主要在內(nèi)存中(超出高水位標(biāo)記的消息透明地保存在磁盤上)。
  • 供消費(fèi)者用來(lái)查找生產(chǎn)者的運(yùn)行時(shí)發(fā)現(xiàn)服務(wù)(nsqlookupd)。
  • 傳輸層安全性(TLS)。
  • 數(shù)據(jù)格式不可知。
  • 很少有依賴項(xiàng)(易于部署)和合理,有界的默認(rèn)配置。
  • 支持任何語(yǔ)言的客戶端庫(kù)的簡(jiǎn)單TCP協(xié)議。
  • 用于統(tǒng)計(jì)信息,管理操作和生產(chǎn)者的HTTP接口(無(wú)需發(fā)布客戶端庫(kù))。
  • 與statsd集成以進(jìn)行實(shí)時(shí)檢測(cè)。
  • 強(qiáng)大的群集管理界面(nsqadmin)。

這是將消息發(fā)布到NSQ的方法(避免了錯(cuò)誤處理):

package mainimport ("github.com/bitly/go-nsq" )func main() {config := nsq.NewConfig()p, _ := nsq.NewProducer("127.0.0.1:4150", config)p.Publish("topic", []byte("message"))p.Stop() }

這里是如何消費(fèi):

package mainimport ("sync""fmt""github.com/bitly/go-nsq" )func main() {wg := &sync.WaitGroup{}wg.Add(1)config := nsq.NewConfig()q, _ := nsq.NewConsumer("topic", "channel", config)handler := nsq.HandlerFunc(func(message *nsq.Message) error {fmt.Printf("Got a message: %v", message)wg.Done()return nil})q.AddHandler(handler)q.ConnectToNSQD("127.0.0.1:4150")wg.Wait() }

11.碼頭工人

Docker現(xiàn)在是家喻戶曉的名字(如果您的家人大多是DevOps人)。 您可能不知道Docker是在Go中實(shí)現(xiàn)的。 您通常不會(huì)在代碼中使用Docker,但這是一個(gè)重要的項(xiàng)目,應(yīng)該被認(rèn)為是一個(gè)非常成功和流行的Go項(xiàng)目。

12. Kubernetes

Kubernetes是面向云原生應(yīng)用程序的開(kāi)源容器編排平臺(tái)。 這是Go中實(shí)現(xiàn)的另一個(gè)怪物分布式系統(tǒng)。 我最近寫了一本書,叫做《 掌握Kubernetes》 ,其中詳細(xì)介紹了Kubernetes的最高級(jí)方面。 從Go開(kāi)發(fā)人員的角度來(lái)看,Kubernetes非常靈活,您可以通過(guò)插件對(duì)其進(jìn)行擴(kuò)展和自定義。

結(jié)論

Go是一門很棒的語(yǔ)言。 它的設(shè)計(jì)理念是成為一種簡(jiǎn)單易懂的語(yǔ)言。 它的標(biāo)準(zhǔn)庫(kù)不如Python之類的其他語(yǔ)言那么全面。

Go社區(qū)得到了加強(qiáng),您可以在程序中使用許多高質(zhì)量的庫(kù)。 在本文中,我介紹了12個(gè)庫(kù)。 我鼓勵(lì)您在進(jìn)入并從頭實(shí)現(xiàn)所有內(nèi)容之前,先尋找其他庫(kù)。

翻譯自: https://code.tutsplus.com/tutorials/12-indispensable-go-packages-and-libraries--cms-29008

總結(jié)

以上是生活随笔為你收集整理的12个必不可少的Go软件包和库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。