1. 程式人生 > >Go開發中GOPATH的理解

Go開發中GOPATH的理解

在學習go語言的過程當中, 你也許問過自己一個問題, GOPATH到底是做什麼的? 或許在寫過一些程式碼之後, 很快你就會在網上找到一些資料, 它告訴我們GOPATH這個環境變數它指定了一個目錄, 這個目錄包含了我們所有的原始碼, 比如這裡的介紹, 但是我覺得光是理解這一點是不夠的, 因為你會發現讓人為難的是, 看起來似乎我們每新建一個專案, 都要往GOPATH再補充一條路徑, 這實在是反人類的做法啊.

我自己曾經也有過那樣的顧慮, 為了鞏固自己的理解, 同時也為了讓其他讀者更清楚GOPATH的作用, 我希望這篇小文希望能夠起到一定的作用.
基本探索

讓我們先從目錄結構開始說起, 在寫registry-watch這個專案的時候, 編輯器經常提示我結構不正確, 於是在網上搜了搜, 找到了這個.

按照文件的說法, 作為一個workspace, 它需要包含三個目錄:

workspace
|– src
|– pkg
|– bin

src表示我們的原始碼目錄, 在不考慮另外兩個目錄的情況下, 假設我寫了一個demo專案, 並新建了一個hello.go, 它是main模組, 同時它依賴於另外一個函式, 該函式位於library/world.go:

hello.go

package main

import “fmt”
import “demo/library”

func main() {
fmt.Println(“Hello, ” + library.World())
}

world.go

package library

// World return “World”
func World() string {
return “World”
}

於是目錄結構變成了現在這個樣子:

workspace
|– src
| |– demo
| | |– hello.go
| | |– library
| | | |– world.go
|– pkg
|– bin

現在我cd src目錄並執行go install demo後, 我們發現以下變化:

workspace
|– src
| |– demo
| | |– hello.go
| | |– library
| | | |– world.go
|– pkg
| |– darwin_amd64
| | |– demo
| | | |– library.a
|– bin
| |– demo

這個例子基本說明了問題, 當我們寫的模組是main時, 它會對應到一個可執行檔案, 並且編譯後的檔案會被複制到bin目錄, 如果是其他模組, 它會被編譯成一個庫檔案, 並且被複制到pkg目錄. 這就是我們必須提供三個目錄的原因, 一個放原始碼, 一個放編譯後的可執行檔案, 另外一個放編譯後的庫檔案.
協作

一個專案總是會由多個成員進行協作開發, 在觀察我們的專案結構之後, 很自然的, 我們會發現應該被提交的程式碼只有hello.go和library/world.go, 也就是說我們的.git目錄應該位於src/demo之下.

workspace
|– src
| |– demo
| | |– .git
| | |– hello.go
| | |– library
| | | |– world.go
|– pkg
|– bin

再考慮另外一個問題, 我們經常會執行go get xxx去安裝一些包, 這些包會被下載到$GOPATH/src目錄下, 當另外一個團隊成員拉下我們的程式碼時, 如果還需要逐個去執行go get xxx那就太不方便了, 於是我們需要藉助一個依賴管理的工具, 這就是godep. 當我們執行過go get xxxx安裝過依賴之後, 只要再到專案目錄下, 執行godep save, 便會將所有的依賴記錄在一個檔案當中, 並且這個時候我們的目錄結構再次發生了一些小小的變化.

workspace
|– src
| |– demo
| | |– .git
| | |– Godeps
| | | |– _workspace
| | | |– Godeps.json
| | |– hello.go
| | |– library
| | | |– world.go
|– pkg
|– bin

現在來到需要拉程式碼的這一方, 對於像上面這樣一個倉庫. 我們需要多考慮一些事情. 我們不如以kubernetes為例來做示例:

初看可能會奇怪, 為什麼需要指定目的目錄呢, 尤其是k8s.io看起來好生奇怪, 其實只要大概找一個原始碼檔案看看就知道了, 比如這個檔案

pkg/api/context.go

package api

import (
stderrs “errors”
“time”

"golang.org/x/net/context"
"k8s.io/kubernetes/pkg/auth/user"

)

我們知道import路徑都是針對$GOPATH/src的, 所以很自然的我們要有k8s.io這個目錄.
總結

這個時候, 我們回到一開始提到的顧慮, 我們真的需要對每一個專案都新增一條GOPATH路徑嗎? 不然, 我們所說的專案不過是以一個資料夾的形式存在於$GOPATH/src中, 我們只需要配置一個GOPATH, 並把專案都建在src目錄下就可以了.

相關推薦

Go開發GOPATH理解

在學習go語言的過程當中, 你也許問過自己一個問題, GOPATH到底是做什麼的? 或許在寫過一些程式碼之後, 很快你就會在網上找到一些資料, 它告訴我們GOPATH這個環境變數它指定了一個目錄, 這個目錄包含了我們所有的原始碼, 比如這裡的介紹, 但是我覺得光

百度地圖開發理解的部分(二)

不是很明白allowBackup的方法 查詢一下 Android API Level 8及其以上Android系統提供了為應用程式資料的備份和恢復功能,此功能的開關決定於該應用程式中AndroidManifest.xml檔案中的allowBackup屬性值

Go開發的十大常見陷阱[譯]

原文: The Top 10 Most Common Mistakes I’ve Seen in Go Projects 作者: Teiva Harsanyi 譯者: Simon Ma 我在Go開發中遇到的十大常見錯誤。順序無關緊要。 未知的列舉值 讓我們看一個簡單的例子: type Status uint3

對於軟件開發開發人員與測試人員關系的理解

我不知道 統一 選擇 好聽 dash 過去 思路 排查 定位   在軟件開發中都會有開發人員(以下簡稱開發)和測試人員(以下簡稱測試),在一些小型公司可能並沒有測試,僅僅是開發兼任測試。在這裏我僅針對於有專業的測試和專業的開發的項目。   每個公司應該都有考核機制,對於開

軟件開發對MVC的一些理解

https 我們 直接 mod 一個 span 最大的 控制器 用戶 接口隔離 通俗一點講,接口隔離就是當一個類需要繼承另一個類時, 如果被繼承的類中有繼承的類用不到的方法或者屬性時,就不要去實現這個繼承。如果真的情非得已必須要繼承,那麽也需要從被繼承的類中再提取出一個只包

windows通過Visual Studio Code配置GO開發環境(轉)

fin gpe def 微軟 sqs oba 安裝插件 包括 ont 一、GO語言安裝 詳情查看:GO語言下載、安裝、配置 二、GoLang插件介紹 對於Visual Studio Code開發工具,有一款優秀的GoLang插件,它的主頁為:https://gith

Go語言開發MongoDB數據庫

urn import l數據庫 pkg selector 關系 示例 nec UNC 伴隨著移動端的興起,Nosql數據庫以其分布式設計和高性能等特點得到了廣泛的應該用,下面將介紹下Nosql中的mongoDB在Go語言中的應用,在開發前,有必要了解下基礎知識,mongo數

golangGOPATH的簡答理解

1、為什麼要配置GOPATH 配置GOPATH的用意是為了方便專案的部署和構建,以及可以直接使用go get 命令下載第三方的包到自己的專案的src下和相關的執行檔案bin目錄,和中間檔案pkg src :專案的原始碼 pkg :編譯後的生成檔案 bin : 編譯後的可執行

Android 人們口中的sdcard和android開發的sdcard的區別(自理解

現在的android手機很多都不支援在手機上再插一張sdcard了,就是那種上面印著多少GB的小黑卡,我查了很多資料發現,手機自帶的記憶體(其中分為兩部分:系統所佔記憶體 + 手機除去系統所佔記憶體剩餘的記憶體,其中“手機除去系統所佔記憶體剩餘的記憶體”被安卓預設為:手機自帶

Java專案開發關於classpath路徑的理解

在做專案的過程中,經常會遇到在classpath下載入配置檔案,但是對於classpath的理解確一直很模糊。 1、專案src路徑下的.java檔案編譯之後的檔案會存放在WEB-INF/classes路徑下,預設的classpath路徑即為WEB-INF/cla

在Visual Studio Code配置GO開發環境

轉自:https://www.cnblogs.com/zsy/archive/2016/02/28/5223957.html一、GO語言安裝二、GoLang外掛介紹這款外掛的特性包括:Colorization 程式碼著彩色Completion Lists 程式碼自動完成(使用

對於前端開發的幾種佈局方式的理解

一,靜態佈局(Static Layout) 在螢幕寬高有調整時,使用橫向和豎向的滾動條來查閱被遮掩部分; 意思就是不管瀏覽器尺寸具體是多少,網頁佈局就按照當時寫程式碼的佈局來佈置 二,彈性佈局(Elastc Layout) 是CSS3引入的佈局方式,其中flex-flow是flex-di

Go語言編譯、執行,以及開發注意事項

** 編譯 ** 1.有了go原始檔,通過編譯器將其編譯成機器可以識別的二進位制原始碼檔案 2.在該原始檔目錄下,通過go build對原始檔.go進行編譯,可以指定生成的可執行檔名,在Windows下必須是.exe字尾 go build -o 新檔名.exe 原始檔名.go

iOS開發Block的理解與使用

// 隨機生成的顏色 UIColor *color = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]; // 第二步 給Blo

深入理解 iOS 開發的鎖

摘要 本文的目的不是介紹 iOS 中各種鎖如何使用,一方面筆者沒有大量的實戰經驗,另一方面這樣的文章相當多,比如 iOS中保證執行緒安全的幾種方式與效能對比、iOS 常見知識點(三):Lock。本文也不會詳細介紹鎖的具體實現原理,這會涉及到太多相關知識,筆者不

Go語言開發MongoDB資料庫

伴隨著移動端的興起,Nosql資料庫以其分散式設計和高效能等特點得到了廣泛的應該用,下面將介紹下Nosql中的mongoDB在Go語言中的應用,在開發前,有必要了解下基礎知識 在開發前,匯入開發需要用到的類庫 import ( "fmt" "gopkg.in/mgo.v2" "gopk

理解iOS開發的BitCode功能

最近在輔導我戴維營戰友們做手機音視訊直播的App,除錯的時候手機採集音視訊,視訊用h264編碼,音訊採用aac編碼,通過RTMP協議往鬥魚直播頻道釋出媒體流,專案需要用FFMPEG和libx264兩個開源專案,在編譯為iOS框架庫提供給學生用的時候,他們遇到了bitcode的

開發過程如何理解好一個專案的需求

這裡的軟體,可以是個小程式、小工具,可以是個框架、元件,也可以是個系統。 1 軟體的理想 對很多開發人員來說,需求是個比較籠統、模糊的概念。如果不在開發運維的過程中,多揣摩多思考,那麼需求這個東西就會變的越來越陌生,甚至覺得不那麼重要,不那麼相關! 那麼到底需求是什麼?

Android開發的事件分發和消費機制的一些理解

說明事件分發被用作解決事件衝突,還被用作自定義View事件包含的動作 1.ACTION_DOWN(按下):手指只要一觸控式螢幕幕就立即觸發這個動作 2.ACTION_MOVE(移動):手指觸控式螢幕幕

android開發的同步和非同步區別的理解

同步和非同步的區別: 網路答案 答案一: 1、同步執行的話,就是程式會呆板地從頭執行到尾,耗時間的東西不執行完,程式不會繼續往下走,等待時間長的話,有時候就會造成失去響應了。 2、非