go語言多package使用實戰

測試下go多page包調用時是如何實現的,這裏測試實戰下。
爲後面使用go get做準備

首先檢查環境:

GOROOT 指向系統安裝路徑
GOPATH 指向工作路徑

在這裏插入圖片描述

一、同一目錄下多個文件共用一個包時

一個路徑下只能存在一個package,一個package可以由多個源代碼文件組成
api.go

package main

import "fmt"

func Api() {
        fmt.Println("api")
}

main.go

package main

import (
        "fmt"
)

func main() {
        fmt.Println("vim-go")
        //test api
        Api()
}

如上,兩個文件都屬於同一個main包,直接編譯即可。
在這裏插入圖片描述

二、同一目錄多個包時

方式1:通過GOPATH管理多個package

先引入一個知識點。

Go compiler的package搜索順序
  1. 首先,Go compiler會在GO安裝目錄(GOROOT,這裏Linux安裝目錄/usr/local/go)下查找是否有src/pkg/hello相關包源碼;如果沒有則繼續;
  2. 如果export GOPATH=PATH1:PAHT2,則Go compiler會依次查找是否存在PATH1/src/hello、PATH2/src/hello;配置在GOPATH中的PATH1和PATH2被稱作workplace
  3. 如果在上述幾個位置均無法找到hello這個package,則提示出錯。
驗證測試

這裏自己的go版本比較高,所以直接關閉了go mod機制,同時設置GOPATH路徑來測試:

➜  main export GOPATH=/data/home/cooperswang/code_study/
➜  main go env GOPATH
/data/home/cooperswang/code_study/
➜  main export GO111MODULE=off
➜  main go env GOPATH
/data/home/cooperswang/code_study/

在這裏插入圖片描述
代碼結構如圖:
在這裏插入圖片描述
這裏重點main.go中調用其它packge的方式:
在這裏插入圖片描述
可以看到,這時採用相對路徑的方式實現自定義包的查找,使用的查找順序如上面的知識點,主要使用了GOPATH路徑。

不過這裏仍有點不明白,不清楚go查找包到底是怎麼起作用的,先記錄下吧

方式2:使用Go mod管理多個package

Golang在1.11版本中引入了go mod機制,在統一的位置對依賴進行管理。

go mod不同於以往基於GOPATH和Vendor的構建方式,其主要是通過GOPATH/pkg/mod下的緩存包來對工程進行構建。在Go 1.11中已經可以使用,同以往新添加的功能一樣,go mod 可以通過GO111MODULE來控制是否啓用,GO111MODULE有一下三種類型。

on 所有的構建,都使用Module機制
off 所有的構建,都不使用Module機制,而是使用GOPATH和Vendor
auto 在GOPATH下的工程,不使用Module機制,不在GOPATH下的工程使用

Go mod化處理步驟

  • 在項目的根目錄下使用命令go mod init projectName
  • 在該目錄下執行go build main.go

can-i-have-multiple-packages-inside-a-single-go-module-how
建立項目HelloWorld,在頂層目錄使用go mod init生成go.mod文件。
在這裏插入圖片描述
此時go.mod文件:

module HelloWorld

go 1.13

此時hello包和main包內容:

➜  HelloWorld cat src/hello/hello.go
package hello

import "fmt"

func Hello() {
        fmt.Println("hello wsq")
}


➜  HelloWorld cat src/main/main.go
package main

import "HelloWorld/src/hello"

func main() {
        hello.Hello()
}

此時,在HelloWorld目錄下,編譯即可:
在這裏插入圖片描述

 1. 在非main包中go build 執行時,編譯生成.a文件;go install可以看到生成在GOPATH/pkg下
 2. 在main包中go build執行時,生成main文件;go install可以看到生成再GOPATH/bin下

三、 包機制導入機制

  1. 如果一個main導入其他的包,包會被順序導入
  2. 如果導入的包(pkg1)依賴其他的包(包pkg2),會首先導入pkg2,然後初始化pkg2中的常量與變量,如果pkg2中有init函數,會自動執行init
  3. 所有包導入完成後纔會對main的常量和變量進行初始化,然後執行main中的init函數(如果有的話),最後執行main函數
  4. 如果一個包被導入多次實際上只會導入一次

```

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章