久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

關(guān)于GOROOT、GOPATH,、GOBIN,、project目錄

 openlog 2017-07-06

GOROOT、GOPATH,、GOBIN,、project目錄


前言:我覺(jué)得Java程序員學(xué)golang很容易上手,。關(guān)于GOROOT,、GOPATH、GOBIN這些環(huán)境變量的設(shè)置,,我隱約感覺(jué)到了java的影子(盡管我是一個(gè)C++程序員),,唯一和java不同的是不能設(shè)置“.”。

另外,,golang的設(shè)計(jì)也很明顯的透露著“約定優(yōu)于配置”的原則,。這在java很多框架里面很常見(jiàn)。golang的環(huán)境變量設(shè)計(jì)也是如此,。從Android和golang我覺(jué)得google喜歡java,。

不了解java的C++程序員,可以嘗試全新去理解golang,。

GOROOT

golang安裝路徑,。

GOPATH

官方解釋,請(qǐng)google,。Go工作環(huán)境中常常用到的一個(gè)很重要的環(huán)境變量(這種設(shè)計(jì)類似java),。具體用途:go命令常常需要用到的,如go run,,go install,, go get等。允許設(shè)置多個(gè)路徑,,和各個(gè)系統(tǒng)環(huán)境多路徑設(shè)置一樣,,windows用“;”,Linux(mac)用“:”分隔,。

linux(Mac)下,,為了方便,一般配置在~/.bash_profile中。

book:~ wukebing$ vi ~/.bash_profile  //編輯

book:~ wukebing$ source ~/.bash_profile //編輯完成后,,使立即生效

例如:我的GOPATH設(shè)置(MAC下)

export GOPATH=$HOME/workspace/go
export PATH=$PATH:${GOPATH//://bin:}/bin
export GOBIN=

其中,,“export PATH=$PATH:${GOPATH//://bin:}/bin”為L(zhǎng)inux(Mac)下把每個(gè)GOPATH下的bin都加入到PATH中。

當(dāng)存在多個(gè)路徑時(shí),,好像優(yōu)先采用第一個(gè)路徑,。這個(gè)無(wú)關(guān)緊要了,只有需要的第三方包(庫(kù))都能正確下載和使用就ok了,。

GOBIN

go install編譯存放路徑,。不允許設(shè)置多個(gè)路徑??梢詾榭?。為空時(shí)則遵循“約定優(yōu)于配置”原則,可執(zhí)行文件放在各自GOPATH目錄的bin文件夾中(前提是:package main的main函數(shù)文件不能直接放到GOPATH的src下面,。

go環(huán)境查看

用go env 可查看當(dāng)前go環(huán)境變量,。

GOPATH目錄結(jié)構(gòu)

goWorkSpace  // (goWorkSpace為GOPATH目錄)
  -- bin  // golang編譯可執(zhí)行文件存放路徑,可自動(dòng)生成,。
  -- pkg  // golang編譯的.a中間文件存放路徑,,可自動(dòng)生成。
  -- src  // 源碼路徑,。按照golang默認(rèn)約定,,go run,go install等命令的當(dāng)前工作路徑(即在此路徑下執(zhí)行上述命令),。

go目錄結(jié)構(gòu)1:

project1 // (project1添加到GOPATH目錄了)
  -- bin
  -- pkg
  -- src  
     -- models       // package
     -- controllers  // package
     -- main.go      // package main[注意,,本文所有main.go均指包main的入口函數(shù)main所在文件]
 project2 // (project2添加到GOPATH目錄了)
      -- bin
      -- pkg
      -- src
         -- models       // package
         -- controllers  // package
         -- main.go      // package main
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

package main文件直接在GOPATH目錄到src下。

使用go build可以在src文件夾下編譯生成名為“src”的可執(zhí)行文件,。這是golang默認(rèn)約定,。一般我個(gè)人不怎么用這個(gè)命令。因?yàn)樗鼤?huì)生成可執(zhí)行文件在src目錄下面,。

我一般用:go get 和 go install,。

go get [main.go所在路徑]

參數(shù) [main.go所在路徑]:可選。相對(duì)GOPATH/src路徑,。 缺省是.(src自己),。可指定src下面的子文件夾路徑,。
go get會(huì)做2件事:1. 從遠(yuǎn)程下載需要用到的包,。2.執(zhí)行g(shù)o install。(從這里也可以看出golang處處為了簡(jiǎn)潔而遵循的“約定優(yōu)于配置”原則)

go install [main.go所在路徑]

參數(shù) [main.go所在路徑]:可選,。 相對(duì)GOPATH/src路徑,。缺省是.(即當(dāng)前所在目錄或工作目錄),。可指定src下面的子文件夾,。
go install編譯生成名稱為[main.go父文件夾名]的可執(zhí)行文件,,放到GOBIN路徑下。當(dāng)GOBIN為空時(shí),,默認(rèn)約定是:生成的可執(zhí)行文件放到GOPATH/bin文件夾中,。產(chǎn)生的中間文件(.a)放在project/pkg中(沒(méi)有變化時(shí),不重新生成.a),。

我們?cè)倏创薵o目錄結(jié)構(gòu)1,,執(zhí)行g(shù)o install(以及go get的第二階段go install)會(huì)報(bào)錯(cuò):

注意:如果不用額外方式改變環(huán)境變量(公司目前用的是sh腳本編譯),是編譯不過(guò)的,。報(bào)錯(cuò):can’t load package: package .: no buildable Go source files in *

解決方法1:
曾經(jīng)我也因?yàn)檫@個(gè)錯(cuò)誤感到迷惑,,認(rèn)為所有都環(huán)境變量都沒(méi)有問(wèn)題。網(wǎng)上也沒(méi)怎么看到直接明確都解答,??戳艘恍┨雍螅|類旁通,,設(shè)置了GOBIN環(huán)境變量后解決,。(好吧,,我至今也沒(méi)有完整讀過(guò)英文官方文檔,。這種默認(rèn)約定,官方文檔上應(yīng)該有,。)

此解決方法有個(gè)弊端,,多個(gè)project會(huì)導(dǎo)致多個(gè)GOPATH目錄。多個(gè)project下的目錄結(jié)構(gòu)和包一致的話,,直接編譯會(huì)導(dǎo)致編譯問(wèn)題,。因?yàn)間o優(yōu)先使用第一個(gè)GOPATH目錄,導(dǎo)致編譯沖突,。(當(dāng)然,,你也可以每次手工或腳步修改GOPATH環(huán)境變量,感覺(jué)很麻煩,。)不建議多個(gè)project直接設(shè)置到茫茫多的GOPATH中,。當(dāng)然有解決方法2,我認(rèn)為是標(biāo)準(zhǔn)合理的解決方法,,就是下面go目錄結(jié)構(gòu)2了,。

go目錄結(jié)構(gòu)2:

goWorkSpace     // goWorkSpace為GOPATH目錄
  -- bin
     -- myApp1  // 編譯生成
     -- myApp2  // 編譯生成
     -- myApp3  // 編譯生成
  -- pkg
  -- src
     -- common 1
     -- common 2
     -- common utils ...
     -- myApp1     // project1
        -- models
        -- controllers
        -- others
        -- main.go 
     -- myApp2     // project2
        -- models
        -- controllers
        -- others
        -- main.go 
     -- myApp3     // project3
        -- models
        -- controllers
        -- others
        -- main.go 

一個(gè)solution里面的多個(gè)project或工具組件都并列放在GOPATH的src下,如myApp1,,myApp2,,myApp3,,common utils。
這時(shí),,GOBIN可以為空,,編譯時(shí),可以如下:
go install myApp1 或 go get myApp1
go install myApp2 或 go get myApp2
go install myApp3 或 go get myApp3

這時(shí)才是大家都認(rèn)為的,,把可執(zhí)行程序myApp1,、myApp2、myApp3生成在goWorkSpace/bin下面,。多個(gè)GOPATH也就有了上面的“把每個(gè)GOPATH下的bin都加入到PATH中”,。

提示:相同結(jié)構(gòu)的project下同名包怎么辦?
有同事在初學(xué)時(shí),,習(xí)慣按照go目錄結(jié)構(gòu)1,,了解到go目錄結(jié)構(gòu)2后(以為僅僅是把main放到了子文件夾,其他controllers等包結(jié)構(gòu)不變),,有這樣的疑惑,。他們?cè)瓉?lái)就有這樣的問(wèn)題,同時(shí)把go目錄加入到GOPATH后,,編譯就出現(xiàn)問(wèn)題,,因?yàn)榘吐窂较嗤ㄏ鄬?duì)GOPATH下的src),go只會(huì)優(yōu)先查找第一個(gè)符合的GOPATH),。只會(huì)每次編譯時(shí)手工修改GOPATH,,或?qū)懩_本編譯。(我看著就覺(jué)得累,,還徒增腳本維護(hù)煩惱,。)

解決方案就是:除了通用的,公有的工具,、組件外,,屬于各個(gè)project自己的東西,統(tǒng)統(tǒng)隨著main.go一起移到project目錄下,。go目錄結(jié)構(gòu)2就是這樣的,。
導(dǎo)入各個(gè)project下的controllers方法:import myApp1/controllers,import myApp2/controllers這樣的,。go的import查找的是包的路徑,,并不是包名。你只用告訴go,,你的包都放在哪了,,go會(huì)從這些路徑下查找有沒(méi)有所需要的包。只是大家一般習(xí)慣包名和文件夾名相同,,容易誤解,。只需要注意,,一個(gè)文件夾下只允許有一個(gè)包名,允許有子文件夾定義不同的包,。
import 采用的是相對(duì)路徑寫(xiě)法:路徑是 相對(duì)GOROOT和GOPATH下的src,。

也可以設(shè)置GOBIN,而且這時(shí),,由于可執(zhí)行文件名稱不同,,也不大容易產(chǎn)生覆蓋(需要避免的時(shí)多個(gè)GOPATH用相同的“myApp”project名稱。)

具體的還是看個(gè)人喜好和實(shí)際情況,。我個(gè)人本地的環(huán)境大致是:

dir      
  -- goWorkSpace1    // 主要是為了區(qū)分自己的鼓搗的一些東西和工作上的項(xiàng)目
  -- goWorkSpace2
        -- bin
        -- pkg
        -- src                  
           -- myApp1
              -- .git
              -- models
              -- controllers
              -- main.go 
           -- myApp2
              -- .git
              -- models
              -- controllers
              -- main.go 
           -- myApp3
              -- .git
              -- models
              -- controllers
              -- main.go

也就是我本地是有多個(gè)GOPATH路徑的dir/goWorkSpace1,、dir/goWorkSpace2。
注意:GOPATH目錄和GOPATH下的src不應(yīng)該添加到源代碼管理中,,而是各個(gè)project目錄myApp1,、myApp2、myApp3各自時(shí)獨(dú)立的進(jìn)行源代碼管理

我一般不設(shè)置GOBIN,,把每個(gè)GOPATH下的bin都加入到PATH中,。

個(gè)人理解,有任何問(wèn)題,,歡迎指正,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多