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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何写 go 代码 (How to Write Go Code 翻译)

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何写 go 代码 (How to Write Go Code 翻译) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1. 寫在前面的話
  • 2. 介紹
  • 3. 代碼組織
    • 3.1. 工作區
    • 3.2. GOPATH 環境變量
    • 3.3. Package 路徑
    • 3.4. 第一個 GO 程序
    • 3.5. 第一個 GO 庫
    • 3.6. Package name
  • 4. 測試
  • 5. 遠程 package
  • 6. 下一步
  • 7. 獲取幫助

寫在前面的話

本文為Go官方網站 How to Write Go Code 這篇文章的翻譯,
水平有限, 有些地方不好翻譯的地方會用意譯的方法, 關于代碼示例的路徑等方面可能也會有些不一樣.

介紹

本文演示如何開發一個簡單的 go package, 以及 go tool 的使用方法,
即獲取, 編譯, 安裝 go package 的標準方法和命令.

go tool 需要你安裝一定的標準來組織代碼. 請仔細閱讀本文.
它介紹了用來構建和運行 Go 程序的最簡單方法.

介紹本文的視頻參照: https://www.youtube.com/watch?v=XCsL89YtqCs (需要FQ!!!)

代碼組織

工作區

go tool 是設計用來和公共倉庫的開源代碼一起工作的.
即使你不需要發布你的代碼, go tool 的工作模型也同樣適用于你.

Go 代碼必須保存在 工作區 中, 工作區 就是一個特定的目錄結構, 根目錄下有如下3個目錄:

  • src 目錄: 存放 go 源碼文件, 按 package 來組織 (一個 package 一個文件夾)
  • pkg 目錄: 存放 package 對象
  • bin 目錄: 存放可執行文件

go tool 編譯 src 下的文件, 并將編譯好的二進制文件分別放入 pkg 或者 bin 文件夾中.
src 目錄可以包含多個 VC 倉庫(比如 Git 或 Mercurial), 用來管理代碼的開發.

下面是一個目錄結構的示例:

├── bin # 這里存放 可執行命令 ├── pkg # 這里存放 package 對象 │ └── darwin_amd64 │ ├── github.com │ └── go-files └── src├── github.com│ └── golang│ └── example│ ├── .git│ ├── hello # 可執行命令的代碼│ ├── outyet # 可執行命令的代碼│ └── stringutil # package 代碼└── go-files├── .git├── hello # 可執行命令的代碼└── stringutil # package 代碼

這里補充說明一下:
src 目錄下:

  • github.com/golang/example 是 github 上的代碼倉庫
  • go-files 是本地的代碼倉庫

src 目錄可以包含多個代碼倉庫, 可以包含多個命令的源碼, 也可以包含多個 package 的源碼.
大多數的 Go 程序員會將他們所有的 Go 源碼和依賴關系保存在同一個工作區中.

可執行命令 和 庫 是分別從不同的 package 的代碼編譯出來的, 稍后會討論.

GOPATH 環境變量

GOPATH 環境變量定義了你的 工作區 的位置. 這是你開發 Go 代碼時唯一需要設置的環境變量.

開始開發時, 創建 工作區 的文件夾, 并設置對應的 GOPATH 環境變量.
你的 工作區 可以是任意文件夾, 本文中使用的路徑是 $HOME/go
注意 不要把 GOPATH 設置為 go 的安裝路徑.

$ mkdir $HOME/go $ export GOPATH=$HOME/go

為了方便編譯出的命令的執行, 將上面的 bin 目錄加入到 PATH:

$ export PATH=$PATH:$GOPATH/bin

Package 路徑

標準庫中的 package 只要使用短路徑即可, 比如 "fmt", "net/http".
對于自己的 package, 必須選一個基本的路徑以防止以后和標準庫, 或者其他第三方的庫產生沖突.

如果你的代碼保存在某個代碼倉庫, 那么就可以使用那個代碼倉庫的根目錄作為你的 package 的基本路徑.
比如, 你有個 github 的賬戶在 github.com/user, 就可以使用 github.com/user 作為你的基本路徑.

注意 在能夠正確編譯代碼之前, 你并不需要發布你的代碼到遠程的代碼倉庫.
但是如果有一天你會發布代碼的話, 好好組織代碼結構是個好習慣.
實際上, 你可以使用任意的路徑名稱, 只要它在 go 標準庫和龐大的 go 生態系統中是唯一的.

我們使用 src/go-files 作為基本路徑, 然后在工作區中創建文件夾來保存代碼

$ mkdir -p $GOPATH/src/go-files

第一個 GO 程序

為了編譯和運行一個簡單的 GO 程序, 首先要確定 package 路徑(這里使用 go-files/hello),
并且在工作區中創建對應 package 文件夾.

$ mkdir $GOPATH/src/go-files/hello

下一步, 在上面文件夾中創建 hello.go 文件, 文件內容如下:

package mainimport "fmt"func main() {fmt.Printf("Hello, world.\n") }

然后, 可以通過 go tool 來編譯和安裝上面的 hello 程序.

$ go install go-files/hello

你可以在任何路徑下運行上述命令, go tool 會根據 GOPATH 環境變量來從工作區中查找 go-files/hello package.

如果在 package 所在文件夾中運行 go install, 也可以省略 package 路徑.

$ cd $GOPATH/src/go-files/hello $ go install

上面的命令編譯了 hello 命令, 并產生了此命令的二進制可執行文件.
然后將二進制文件 hello 安裝到了 工作區 的 bin 文件夾下(Windows 下是 hello.exe)
在我們的例子中, 就是 $GOPATH/bin/hello, 即 $HOME/go/bin/hello

go tool 只有在出錯時才會輸出信息, 如果上面的 go 命令沒有輸出就說明執行成功了.
然后, 就可以在命令行中運行這個命令了.

$ $GOPATH/bin/hello

或者, 如果你將 $GOPATH/bin 加入到 PATH 中了的話, 也可以執行執行 hello 命令.

$ hello

如果你使用了代碼版本管理工具, 這時就可以初始化你的倉庫, 添加文件, 并 commit 你的第一個改變.
這個步驟是可選的, 寫 go 代碼并不強制要求使用代碼版本管理工具.

$ cd $GOPATH/src/go-files/hello $ git init $ git add hello.go $ git commit -m "initial commit"

發布這個倉庫, 使之成為讀者的練習倉庫.

第一個 GO 庫

讓我們來寫一個庫, 并將之用于上面的 hello 程序中.
同樣, 首先確定 package 路徑 (這里使用 go-files/stringutil), 并創建對應的文件夾.

$ mkdir $GOPATH/src/go-files/stringutil

接著, 創建文件 reverse.go, 內容如下:

// Package stringutil contains utility functions for working with strings.package stringutil// Reverse returns its argument string reversed rune-wise left to right.func Reverse(s string) string {r := []rune(s)for i, j := 0, len(r)-1; i < len(r) / 2; i, j = i+1, j-1 {r[i], r[j] = r[j], r[i]}return string(r)}

用 go build 來編譯此 package

$ go build go-files/stringutil

或者在 package 的目錄下, 直接運行 go build

$ cd $GOPATH/src/go-files/stringutil $ go build

上面的命令不會產生輸出文件, 為了生成輸出文件, 必須使用 go install 命令, 它會在 pkg 文件夾下生成 package 對象.
stringutil package 編譯成功之后, 修改之前的 hello.go 文件:

package mainimport ("fmt""go-files/stringutil" )func main() {fmt.Printf(stringutil.Reverse("!oG ,olleH")) }

無論用 go tool 安裝 package 對象還是 二進制文件, 它都會安裝所有的依賴關系.
所以當你安裝 hello 程序時,

$ go install go-files/hello

stringutil package 也會被自動安裝.

運行新的 hello 程序, 可以看到如下輸出:

$ hello Hello, Go!

經過上面的步驟, 你的 工作區應該像下面這樣:

bin/hello # command executable pkg/darwin_amd64/ # this will reflect your OS and architecturego-files/stringutil.a # package object src/go-files/hello/hello.go # command sourcestringutil/reverse.go # package source

注意 go install 將 stringutil.a 放進了 pkg/darwin_amd64 文件夾下 和 代碼對應的目錄中.
以后, go tool 就可以找到這個 package, 從而判斷是否需要重新編譯.
darwin_amd64 是表示當前使用的系統, 它的目的是為了區分交叉編譯出的其他平臺的 package.

Go 編譯出的二進制文件都是靜態鏈接的, 所以上面的 bin/hello 在執行時并不需要 darwin_amd64/go-files/stringutil.a 文件.

Package name

go 代碼的第一行必須是:

package name

這里的 name 作為 package 的默認名稱, 讓其他 package import 的時候用.(同個 package 中的所有文件必須使用相同的 name)
Go 的習慣是: package name 是 import path 中最后一部分.
也就是說, 如果一個 package 被引用時寫成 "crypto/rot13", 那么這個 package 的 name 就是 rot13

編譯為可執行文件的代碼的 package name 必須是 main
一個二進制文件所關聯的多個 package 的 name 不一定要唯一, 只要 pakage 的 import path 是唯一的就行.
也就是上面的 crypto/rot13 必須唯一, 但是可以有 another-crypto/rot13.

Go 的命名規則可以參考: http://golang.org/doc/effective_go.html#names

測試

Go 中包含一個輕量級的測試框架, 由 go test 命令和 testing package 組成.

測試文件的名稱以 _test.go 結尾, 其中包含格式如 func TestXXXX(t *testing.T) 的函數.
測試框架會執行每個這樣的函數, 如果函數中調用了 t.Error 或者 t.Fail, 就認為測試失敗.

給上面的 package stringutil 增加測試文件, 路徑: $GOPATH/src/go-files/stringutil/reverse_test.go, 內容如下:

package stringutilimport "testing"func TestReverse(t *testing.T) {cases := []struct {in, want string}{{"Hello, world", "dlrow ,olleH"},{"Hello, 世界", "界世 ,olleH"},{"", ""},}for _, c := range cases {got := Reverse(c.in)if got != c.want {t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)}} }

執行測試的方法如下:

$ go test go-files/stringutil

或者進入到 package stringutil 的目錄中后, 直接運行:

$ go test

通過 go help test 或者 http://golang.org/pkg/testing/ 來進一步 GO 的測試框架.

遠程 package

Go 的 import path 可以描述如何從版本管理系統(Git 或者 Mercurial) 中獲取 package 的源碼.
go tool 可以利用這個特性來自動獲取遠程倉庫的代碼.
比如, 下面的例子中使用的代碼同時也保存在 github 上(http://github.com/golang/example).

如果你在代碼中 import 了上面這個遠程的 package, 那么 go get 命令會自動 獲取, 編譯, 安裝這個 package.

$ go get github.com/golang/example/hello $ hello Hello, Go examples!

如果本地沒有指定 import 的 package, go get 命令會把這個 package 下載到 GOPATH 中定義的第一個工作區中.
(如果遠程 package 不存在的話, go get 相當于 go install)

上面的 go get 命令執行之后, 文件夾結構大致如下:

├── bin │ └── hello ├── pkg │ └── darwin_amd64 │ ├── github.com │ │ └── golang │ │ └── example │ │ └── stringutil.a │ └── go-files └── src├── github.com│ └── golang│ └── example│ ├── .git│ ├── hello│ │ └── hello.go│ └── stringutil│ ├── reverse.go│ └── reverse_test.go└── go-files├── hello│ └── hello.go└── stringutil├── reverse.go└── reverse_test.go

github.com 上的 hello 程序依賴同一個倉庫中的 package stringutil,
即 github.com 上的 hello.go 中引用了 github.com 上的 package stringutil, 所以, go get 命令也下載, 編譯, 安裝了 stringutil 模塊.

import ("fmt""github.com/golang/example/stringutil" )

這個特性可以讓你的 go package 很容易的被別人使用.
Go Wiki 和 godoc.org 上列出了很多第三方 Go 工程.
關于使用 go tool 來使用遠程倉庫的更多信息, 請參考: go help importpath

下一步

  • 訂閱 golang-announce 郵件列表來了解最新的 Go release 信息
  • 將 Effective Go 作為參考資料來編寫整潔, 地道的 Go 代碼
  • 通過 A Tour of Go 來完成一次 go 的旅行
  • 訪問 documentation page 來了解一系列關于Go語言的有深度的文章, 以及 Go 庫和工具.

獲取幫助

  • 尋求實時幫助, 可以使用 FreeNode 的IRC server #go-nuts
  • Go 語言官方郵件列表 Go Nuts
  • 匯報 Go 語言的 bug 請使用 Go issue tracker

轉載于:https://www.cnblogs.com/wang_yb/p/4333331.html

總結

以上是生活随笔為你收集整理的如何写 go 代码 (How to Write Go Code 翻译)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。