go語言使用

ynchyong發表於2020-10-12

1. 環境變數
    GO111MODULE=auto
2.在當前目錄下執行 命令列執行 go mod init + 模組名稱 初始化模組
    go mod init hello
    會在當前專案目錄下生成一個go.mod 檔案,這是一個關鍵檔案,之後的包的管理都是通過這個檔案管理。
    官方說明:除了go.mod之外,go命令還維護一個名為go.sum的檔案,其中包含特定模組版本內容的預期加密雜湊
    go.mod和go.sum都應檢入版本控制。go.sum 不需要手工維護,所以可以不用太關注
    注意:子目錄裡是不需要init的,所有的子目錄裡的依賴都會組織在根目錄的go.mod檔案裡

3.引入並使用需要的包 比如:import "github.com/astaxie/beego"
    按照過去的做法,要執行hello.go需要執行go get 命令 下載beego包到 $GOPATH/src
    
    現在 執行執行    go run hello.go
    
    稍等片刻… go 會自動查詢程式碼中的包,下載依賴包,並且把具體的依賴關係和版本寫入到go.mod和go.sum檔案中。

4.依賴的包下載到哪裡了?還在GOPATH裡嗎?
    使用Go的包管理方式,依賴的第三方包被下載到了$GOPATH/pkg/mod路徑下
    
5.依賴包的版本是怎麼控制的?
    可以看到最終下載在$GOPATH/pkg/mod 下的包
    在go.mod中沒有指定,go命令會自動下載程式碼中的依賴的最新版本
    在go.mod用require語句指定包和版本 ,go命令會根據指定的路徑和版本下載包,
    指定版本時可以用latest,這樣它會自動下載指定包的最新版本;
    釋出者標記的版本號,格式為 vn.n.n (n代表數字
    如果包的作者還沒有標記版本,預設為 v0.0.0

6.以把專案放在$GOPATH/src下嗎?
    但是go會根據GO111MODULE的值而採取不同的處理方式
    預設情況下,GO111MODULE=auto 自動模式
    auto 自動模式下,專案在$GOPATH/src裡會使用$GOPATH/src的依賴包,
          在$GOPATH/src外,就使用go.mod 裡 require的包
    on 開啟模式,1.12後,無論在$GOPATH/src裡還是在外面,都會使用go.mod 裡 require的包
    off 關閉模式,就是老規矩。

7.依賴包中的地址失效了怎麼辦?
    以前的做法:
        修改原始碼,用新路徑替換import的地址
        git clone 或 go get 新包後,copy到$GOPATH/src裡舊的路徑下無論什麼方法,都不便於維護,特別是多人協同開發時。
    
    使用go.mod就簡單了:
    在go.mod檔案裡用 replace 替換包:比如:
    replace golang.org/x/text => github.com/golang/text latest 
    go會用 http://github.com/golang/text 替代http://golang.org/x/text,
    原理就是下載http://github.com/golang/text 的最新版本到 $GOPATH/pkg/mod/golang.org/x/text下


8.init生成的go.mod的模組名稱有什麼用
    因為我們的專案已經不在$GOPATH/src裡了,那麼引用自己怎麼辦?就用模組名+路徑
    例如,在專案下新建目錄 utils,建立一個tools.go檔案:
    //tools.go
    package utils
    import “fmt”
    func PrintText(text string) {
        fmt.Println(text)
    }
    
    //在根目錄下的hello.go檔案就可以 import “hello/utils” 引用utils
    //hello.go
    package main

    import (
        "hello/utils"
        "github.com/astaxie/beego"
    )

    func main() {
        utils.PrintText("Hi")
        beego.Run()
    }
    
9.以前老專案如何用新的包管理
    如果用auto模式,把專案移動到$GOPATH/src外
    進入目錄,執行 go mod init + 模組名稱
    go build 或者 go run 一次
    
10.goproxy.cn - 為中國 Go 語言開發者量身打造的模組代理
    go env -w GOPROXY=https://goproxy.cn,direct

相關文章