Go 語言入門很簡單--技巧和竅門(Tips and Tricks)
本節將隨著時間的推移而增長,但主要目標是分享一些有經驗的開發人員在一段時間內發現的技巧。希望這些技巧能讓新用戶更快地提高工作效率。
140個字符提示
[宇宙之一粟翻譯]:
leave your object oriented brain at home.?Embrace the interface.? @mikegehard
別想著面向對象了,擁抱接口吧。
Learn to do things the Go way, don’t try to force your language idioms into Go.? @DrNic
學習用 Go?語言的方式做事,不要試圖把你的語言習性強加給Go。
It’s better to over do it with using interfaces than use too few of them.? @evanphx
接口使用宜多不宜少。
Embrace the language: simplicity, concurrency, and composition.? @francesc
擁抱這門語言:簡單、并發和組合。
read all the awesome docs that they have on? golang.org .? @vbatts
閱讀他們在golang.org網站上的所有精彩文檔。
always use? gofmt .? @darkhelmetlive
多多使用 gofmt
read a lot of source code.? @DrNic
閱讀大量的源碼。
Learn and become familiar with tools and utilities, or create your own!?They are as vital to your success as knowing the language.? @coreyprak
學習并熟悉工具和實用程序,或創建自己的工具和實用程序!它們對您的成功與了解語言一樣重要
額外導入包的方法
還有其他幾種導入包的方法。我們將在以下示例中使用 fmt 包:
import format "fmt" ?: 創建? fmt 的別名.?然后在所有使用? fmt ?包內容的地方使用? format. ?而不是? fmt. 如 format.Println("Hello,World") ?。
import . "fmt" : 多了個點號 . ?,這種方式 允許直接訪問包的內容,無需在其前面加上 fmt ?。
import _ "fmt" ?- 如果未使用 fmt ?,則抑制與 fmt ? 相關的編譯器警告,如果有則執行初始化函數。 fmt ? 的其余部分無法訪問。
有關更多詳細信息,請參閱 此博客 文章。
goimports
Goimports 是一種更新 Go 導入行、添加缺失行和刪除未引用行的工具。
它的作用與 gofmt(插入式替換)相同,但除了代碼格式之外,還修復了導入。
代碼組織
Go是一種非常簡單的編程語言,但首先是開發人員最難的事情是如何組織代碼。由于許多原因,軌道變得流行,并且腳手架是其中之一。它給出了新的開發人員清晰的指示和地方,以便將其代碼和成語遵循。
在某種程度上,Go 通過為開發人員提供很棒的工具(如 go fmt)以及不會編譯未使用的變量或未使用的導入語句的嚴格編譯器來做同樣的事情。
自定義構造函數
我經常聽到的一個問題是我應該什么時候使用像 NewJob ? 這樣的自定義構造函數。我的答案是,在大多數情況下你不需要。但是,每當您需要在初始化時間設置值并且您有某種默認值時,它都是構造函數的好候選者。在上面的示例中,添加構造函數會產生很多意義,因此我們可以設置默認記錄器。
package mainimport ( "log" "os")type Job struct { Command string *log.Logger}func NewJob(command string) *Job { return &Job{command, log.New(os.Stderr, "Job: ", log.Ldate)}}func main() { NewJob("demo").Print("starting now...")}
重構包中的代碼
參見這篇關于 重構 Go 代碼 的博客文章,第一部分討論包組織。
集合
您可能希望找到一種方法來從集合中提取唯一值。用其他語言,您通常具有不允許重復的集數據結構。Go 沒有內置的,但它不太難以實現(由于缺乏泛型,你需要為大多數類型做到這一點,這可能是麻煩的)。
// UniqStr returns a copy if the passed slice with only unique string results.func UniqStr(col []string) []string { m := map[string]struct{}{} for _, v := range col { if _, ok := m[v]; !ok { m[v] = struct{}{} } } list := make([]string, len(m)) i := 0 for v := range m { list[i] = v i++ } return list}
我使用了一些有趣的技巧。首先,空結構體的映射:
m := map[string]struct{}{}
我們創建了一個映射,鍵是我們想要唯一的值,關聯的值并不重要,所以它可以是任何東西。例如:
m := map[string]bool{}
然而,我選擇了一個空結構,因為它會像布爾值一樣快,但不會分配那么多內存。
第二個技巧可以看得更清楚一點:
if _, ok := m[v]; !ok { m[v] = struct{}{}}
我們在這里所做的,只是檢查映射 m 中是否有與鍵 v 關聯的值,我們不關心值本身,但是如果我們知道我們沒有值,那么我們添加一個。
一旦我們有了一個帶有唯一鍵的映射,我們就可以將它們提取到一個新的字符串切片中并返回結果。
下面是這個函數的測試,如你所見,我使用了一個表測試,這是運行單元測試的慣用 Go 方式:
func TestUniqStr(t *testing.T) { data := []struct{ in, out []string }{ {[]string{}, []string{}}, {[]string{"", "", ""}, []string{""}}, {[]string{"a", "a"}, []string{"a"}}, {[]string{"a", "b", "a"}, []string{"a", "b"}}, {[]string{"a", "b", "a", "b"}, []string{"a", "b"}}, {[]string{"a", "b", "b", "a", "b"}, []string{"a", "b"}}, {[]string{"a", "a", "b", "b", "a", "b"}, []string{"a", "b"}}, {[]string{"a", "b", "c", "a", "b", "c"}, []string{"a", "b", "c"}}, } for _, exp := range data { res := UniqStr(exp.in) if !reflect.DeepEqual(res, exp.out) { t.Fatalf("%q didn't match %q\n", res, exp.out) } }}
依賴包管理
不幸的是,Go 沒有自帶依賴包管理系統。可能是因為它起源于 C 文化,包沒有版本化,也沒有解決顯式的版本依賴問題。
挑戰是,如果您的項目上有多個開發人員,則希望所有這些都在依賴項的同一版本上。您的依賴項也可能有自己的依賴性,并且您希望確保一切順利。當您使用不同版本的相同依賴項時,它會產生甚至欺騙者。這通常是 CI 環境中的情況。
Go 社區針對這些問題提出了許多不同的解決方案。但對我來說,沒有一個是真正好的,所以在 Splice 我們找到了最簡單的工作解決方案: https://github.com/pote/gpm
Gpm 是一個簡單的 bash 腳本,我們最終對其進行了 一些修改 ,以便我們可以將腳本放到每個 repo 中。 bash 腳本使用名為 Godeps 的自定義文件,其中列出了要安裝的軟件包。
當切換到不同的項目時,我們運行項目 gpm 腳本來下拉或設置每個包的正確版本。
在我們的 CI 環境中,我們在運行測試套件之前將 GOPATH 設置為項目特定的文件夾,因此項目之間不會共享包。
善用錯誤
錯誤是 Go 中非常重要的模式,起初,新開發人員對返回值和錯誤的函數數量感到驚訝。
Go 沒有您可能在其他編程語言中看到的異常概念。 Go 確實有一種叫做 panic ?的東西,但正如它的名字所暗示的那樣,它們真的很特別,不應該被拯救(也就是說,它們可以)。
首先,Go的錯誤處理似乎繁瑣和重復,但迅速成為我們思考方式的一部分。而不是創建泡起來且可能或可能不會處理或通過更高的異常,而是錯誤是響應的一部分,并且旨在由呼叫者處理。每當函數可能會生成錯誤時,其響應應包含錯誤參數。
Go 團隊的 Andrew Gerrand 寫了一篇關于錯誤的很棒的 博客文章 ,我強烈建議你閱讀它。
Effective Go section on errors
翻譯: http://www.golangbootcamp.com/book/tricks_and_tips#sec-using_errors
Go
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。