精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

來(lái)聊一聊,Go 的相對(duì)路徑問(wèn)題

開發(fā) 前端
go test 在一些場(chǎng)景下也會(huì)遇到路徑問(wèn)題,因?yàn)間o test只能夠在當(dāng)前目錄執(zhí)行,所以在執(zhí)行測(cè)試用例的時(shí)候,你的執(zhí)行目錄已經(jīng)是測(cè)試目錄了。

[[415282]]

本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚了」,作者陳煎魚。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚了公眾號(hào)。

大家好,我是煎魚。

Go 語(yǔ)言中存在各種運(yùn)行方式,如何正確的引用文件路徑成為一個(gè)值得商議的問(wèn)題

以我的一個(gè)老 Demo gin-blog 為例,當(dāng)我們?cè)陧?xiàng)目根目錄下運(yùn)行。

無(wú)論是執(zhí)行 go run main.go 時(shí)能夠正常運(yùn)行,執(zhí)行 go build也是正常的。如下:

  1. [$ gin-blog]# go run main.go 
  2. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. 
  3.  - using env:    export GIN_MODE=release 
  4.  - using code:    gin.SetMode(gin.ReleaseMode) 
  5.  
  6. [GIN-debug] GET    /api/v1/tags              --> gin-blog/routers/api/v1.GetTags (3 handlers) 
  7. ... 

在不同的目錄層級(jí)下,不同的方式運(yùn)行,又是怎么樣的呢,帶著我們的疑問(wèn)去學(xué)習(xí)!

問(wèn)題

go run

我們上移目錄層級(jí),到 $GOPATH/src 下,執(zhí)行 go run gin-blog/main.go

  1. [$ src]# go run gin-blog/main.go 
  2. 2018/03/12 16:06:13 Fail to parse 'conf/app.ini'open conf/app.ini: no such file or directory 
  3. exit status 1 

go build

使用 go build 命令,執(zhí)行 ./gin-blog/main。如下:

  1. [$ src]# ./gin-blog/main 
  2. 2018/03/12 16:49:35 Fail to parse 'conf/app.ini'open conf/app.ini: no such file or directory 

這時(shí)候你要打一個(gè)大大的問(wèn)號(hào),就是我的程序讀取到什么地方去了?

我們通過(guò)分析得知,Go 運(yùn)行的相對(duì)路徑是相對(duì)于執(zhí)行命令時(shí)的目錄,自然也就讀取不到了。

思考

既然已經(jīng)知道問(wèn)題的所在點(diǎn),我們就可以尋思做點(diǎn)什么 : )

我們想到相對(duì)路徑是相對(duì)執(zhí)行命令的目錄,那么我們獲取可執(zhí)行文件的地址,拼接起來(lái)不就好了嗎?

實(shí)踐

我們編寫獲取當(dāng)前可執(zhí)行文件路徑的方法:

  1. import ( 
  2.  "path/filepath" 
  3.  "os" 
  4.  "os/exec" 
  5.  "string" 
  6.  
  7. func GetAppPath() string { 
  8.     file, _ := exec.LookPath(os.Args[0]) 
  9.     path, _ := filepath.Abs(file) 
  10.     index := strings.LastIndex(path, string(os.PathSeparator)) 
  11.  
  12.     return path[:index

將其放到啟動(dòng)代碼處查看路徑:

  1. log.Println(GetAppPath()) 

我們分別執(zhí)行以下兩個(gè)命令,查看輸出結(jié)果。

1、 go run

  1. $ go run main.go 
  2. 2018/03/12 18:45:40 /tmp/go-build962610262/b001/exe 

2、 go build

  1. $ ./main 
  2. 2018/03/12 18:49:44 $GOPATH/src/gin-blog 

剖析

我們聚焦在 go run 的輸出結(jié)果上,發(fā)現(xiàn)它是一個(gè)臨時(shí)文件的地址,這是為什么呢?

在go help run中,我們可以看到:

  1. Run compiles and runs the main package comprising the named Go source files. 
  2. A Go source file is defined to be a file ending in a literal ".go" suffix. 

也就是 go run 執(zhí)行時(shí)會(huì)將文件放到 /tmp/go-build... 目錄下,編譯并運(yùn)行。

因此go run main.go出現(xiàn)/tmp/go-build962610262/b001/exe結(jié)果也不奇怪了,因?yàn)樗呀?jīng)跑到臨時(shí)目錄下去執(zhí)行可執(zhí)行文件了。

思考

這就已經(jīng)很清楚了,那么我們想想,會(huì)出現(xiàn)哪些問(wèn)題呢。如下:

  • 依賴相對(duì)路徑的文件,出現(xiàn)路徑出錯(cuò)的問(wèn)題。
  • go run 和 go build 不一樣,一個(gè)到臨時(shí)目錄下執(zhí)行,一個(gè)可手動(dòng)在編譯后的目錄下執(zhí)行,路徑的處理方式會(huì)不同。
  • 不斷go run,不斷產(chǎn)生新的臨時(shí)文件。

這其實(shí)就是根本原因了,因?yàn)?go run 和 go build 的編譯文件執(zhí)行路徑并不同,執(zhí)行的層級(jí)也有可能不一樣,自然而然就出現(xiàn)各種讀取不到的奇怪問(wèn)題了。

解決方案

一、獲取編譯后的可執(zhí)行文件路徑

1、 將配置文件的相對(duì)路徑與GetAppPath()的結(jié)果相拼接,可解決go build main.go的可執(zhí)行文件跨目錄執(zhí)行的問(wèn)題(如:./src/gin-blog/main)

  1. import ( 
  2.  "path/filepath" 
  3.  "os" 
  4.  "os/exec" 
  5.  "string" 
  6.  
  7. func GetAppPath() string { 
  8.     file, _ := exec.LookPath(os.Args[0]) 
  9.     path, _ := filepath.Abs(file) 
  10.     index := strings.LastIndex(path, string(os.PathSeparator)) 
  11.  
  12.     return path[:index

但是這種方式,對(duì)于go run依舊無(wú)效,這時(shí)候就需要 2 來(lái)補(bǔ)救。

2、 通過(guò)傳遞參數(shù)指定路徑,可解決go run的問(wèn)題

  1. package main 
  2.  
  3. import ( 
  4.     "flag" 
  5.     "fmt" 
  6.  
  7. func main() { 
  8.     var appPath string 
  9.     flag.StringVar(&appPath, "app-path""app-path"
  10.     flag.Parse() 
  11.     fmt.Printf("App path: %s", appPath) 

運(yùn)行:

  1. go run main.go --app-path "Your project address" 

二、增加os.Getwd()進(jìn)行多層判斷

參見 beego 讀取 app.conf 的代碼。

該寫法可兼容 go build 和在項(xiàng)目根目錄執(zhí)行 go run ,但是若跨目錄執(zhí)行 go run 就不行。

三、配置全局系統(tǒng)變量

我們可以通過(guò)os.Getenv來(lái)獲取系統(tǒng)全局變量,然后與相對(duì)路徑進(jìn)行拼接。

1、 設(shè)置項(xiàng)目工作區(qū)

簡(jiǎn)單來(lái)說(shuō),就是設(shè)置項(xiàng)目(應(yīng)用)的工作路徑,然后與配置文件、日志文件等相對(duì)路徑進(jìn)行拼接,達(dá)到相對(duì)的絕對(duì)路徑來(lái)保證路徑一致。

參見 gogs 讀取GOGS_WORK_DIR進(jìn)行拼接的代碼。

2、 利用系統(tǒng)自帶變量

簡(jiǎn)單來(lái)說(shuō)就是通過(guò)系統(tǒng)自帶的全局變量,例如$HOME等,將配置文件存放在$HOME/conf或/etc/conf下。

這樣子就能更加固定的存放配置文件,不需要額外去設(shè)置一個(gè)環(huán)境變量。

拓展

go test 在一些場(chǎng)景下也會(huì)遇到路徑問(wèn)題,因?yàn)間o test只能夠在當(dāng)前目錄執(zhí)行,所以在執(zhí)行測(cè)試用例的時(shí)候,你的執(zhí)行目錄已經(jīng)是測(cè)試目錄了。

需要注意的是,如果采用獲取外部參數(shù)的辦法,用 os.args 時(shí),go test -args 和 go run、go build 會(huì)有命令行參數(shù)位置的不一致問(wèn)題。

總結(jié)

這三種解決方案,在目前可見的開源項(xiàng)目或介紹中都能找到這些的身影。優(yōu)缺點(diǎn)也是顯而易見的,我認(rèn)為應(yīng)在不同項(xiàng)目選定合適的解決方案即可。

建議大家不要強(qiáng)依賴讀取配置文件的模塊,應(yīng)當(dāng)將其“堆積木”化,需要什么配置才去注冊(cè)什么配置變量,可以解決一部分的問(wèn)題。

大家又有什么想法呢,一起討論一波?

 

責(zé)任編輯:武曉燕 來(lái)源: 腦子進(jìn)煎魚了
相關(guān)推薦

2011-07-11 13:29:03

JAVA

2020-04-24 09:53:59

Go協(xié)作搶占

2021-04-15 12:10:42

Go語(yǔ)言Go開發(fā)者

2010-03-18 08:48:30

Python入門

2021-07-29 20:28:24

靜態(tài)代碼Hdfs

2010-06-23 17:26:01

2017-12-26 10:19:14

大數(shù)據(jù)問(wèn)題缺陷

2017-06-29 13:22:15

2009-08-07 13:38:18

C#文件相對(duì)路徑

2011-06-23 15:33:24

SEO

2020-09-08 06:54:29

Java Gradle語(yǔ)言

2023-07-06 13:56:14

微軟Skype

2009-08-06 18:31:57

C#相對(duì)路徑絕對(duì)路徑

2009-08-06 18:03:21

C#相對(duì)路徑

2018-06-07 13:17:12

契約測(cè)試單元測(cè)試API測(cè)試

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-22 17:36:37

2022-12-14 10:43:16

2023-03-03 12:37:50

JavaJVM內(nèi)存溢出
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

五月天激情四射| 免费看日本毛片| 国产精品人人妻人人爽| 中文一区一区三区免费在线观看| 91麻豆精品国产91久久久久久久久 | 日韩综合av| 亚洲第一成年网| 视频一区国产精品| 国产91麻豆视频| 日韩精品视频网站| 久久久久久久久久久网站| 亚洲色成人网站www永久四虎 | 91禁在线看| 国产女人水真多18毛片18精品视频 | 91在线你懂的| 国产农村妇女毛片精品久久莱园子 | 亚洲人做受高潮| 久久精品福利| 欧美一级理论性理论a| 无码人妻h动漫| 欧美人与禽猛交乱配| 国产精品视频看| 国内外成人免费视频| 136福利视频导航| 免费一区视频| 97精品国产97久久久久久| 性色av无码久久一区二区三区| 亚洲bt欧美bt精品777| 日韩欧美黄色影院| 狠狠躁夜夜躁人人爽天天天天97| 亚洲片av在线| 欧美激情区在线播放| 日韩精品无码一区二区三区久久久| 亚洲精品66| 在线中文字幕一区二区| 日韩欧美一区二| 国产精品av免费观看| 国产一级一片免费播放| 久久中文字幕二区| 日韩精品高清视频| 中文字幕一区二区三区人妻在线视频 | 日韩精品无码一区二区三区久久久 | 国产一区二区中文| 日韩在线播放av| 欧美 日韩 国产 成人 在线观看| 欧美日韩一区二区三区四区不卡 | 91精品又粗又猛又爽| 精品视频在线一区| 欧美日本韩国一区| 久久国产这里只有精品| av一区在线播放| 在线观看日产精品| 黄色三级视频片| av一区在线| 色88888久久久久久影院按摩| 最新国产精品亚洲| 成人免费看黄网站| 真实的国产乱xxxx在线91| 母乳一区在线观看| 青青久久av北条麻妃黑人| 国产大片中文字幕| 999亚洲国产精| 欧美亚洲免费电影| 日韩在线播放中文字幕| 日日欢夜夜爽一区| 国产精品手机播放| 一区二区日韩在线观看| 国产一区二区女| 超碰在线97av| 亚洲激情免费视频| 91免费视频播放| 韩国三级在线一区| 999在线免费观看视频| 草草视频在线播放| 91美女片黄在线| 日韩免费三级| 国产精品刘玥久久一区| 亚洲免费在线电影| 国产二级片在线观看| 欧美最新精品| 777午夜精品视频在线播放| 男男受被啪到高潮自述| 日韩激情毛片| 在线性视频日韩欧美| 人妻久久一区二区| 尹人成人综合网| 日韩av电影中文字幕| 91国内精品视频| www.亚洲在线| 亚洲春色综合另类校园电影| av网站导航在线观看免费| 亚洲成人av福利| 人人干人人视频| 日韩在线观看中文字幕| 亚洲黄色www| 成人做爰69片免网站| 欧美国产免费| 国产成人亚洲综合| 中日韩一级黄色片| 免费日韩电影| 777欧美精品| 国产伦精品一区三区精东| 青青艹视频在线| 日韩精彩视频| 69视频在线| xxxx视频在线| 欧美日韩亚洲91| 日本免费色视频| 免费萌白酱国产一区二区三区| 亚洲欧洲在线看| 欧美黄色免费看| 日本午夜精品一区二区三区电影| 91嫩草免费看| av每日在线更新| 精品久久香蕉国产线看观看gif| 在线观看av网页| 亚洲大片精品免费| 欧美大片在线看免费观看| 国产精品无码粉嫩小泬| 成人国产精品免费观看动漫| 中文字幕久久一区| 成人免费短视频| 亚洲精品一线二线三线| 亚洲熟女毛茸茸| 日韩中文字幕一区二区三区| 国产精品久久九九| 黄网站app在线观看| 在线看日本不卡| 三级电影在线看| 国一区二区在线观看| 成人av番号网| 在线视频1区2区| 欧洲一区在线电影| 精品人妻少妇嫩草av无码| 激情久久五月| 丁香婷婷久久久综合精品国产| 美女隐私在线观看| 欧美日韩国产小视频在线观看| 国产精品一二三区在线观看| 中文亚洲免费| 国产综合色在线视频区| 国产精品久久久久久久久男 | 日韩午夜在线观看| 欧美激情精品久久久久久免费| 日本午夜精品视频在线观看| 欧美在线3区| 欧美不卡高清一区二区三区| 亚洲日本成人网| 波多野结衣爱爱| 国产嫩草影院久久久久| av网站在线不卡| 欧美色婷婷久久99精品红桃| 国产精品人成电影在线观看| 日本视频不卡| 欧美一区二区三区系列电影| 国产成人综合在线视频| 国产剧情一区在线| 久久久久久久香蕉| 成人午夜大片| 97在线精品视频| 九一国产在线| 欧美三级电影网站| 亚洲AV成人无码精电影在线| 国产一区二区三区在线观看免费 | 午夜精品久久久久99蜜桃最新版 | 成人一区二区电影| dy888亚洲精品一区二区三区| 欧美一区二区视频网站| 黄色在线观看免费| 99久久精品国产一区二区三区| 欧美视频在线播放一区| 欧美美女在线观看| 国产精品永久在线| 一区二区三区伦理| 日韩大片在线观看视频| 日韩黄色一级视频| 最新中文字幕一区二区三区| 韩国三级在线看| 99精品国产一区二区青青牛奶| 欧洲视频一区二区三区| 四虎精品一区二区免费| 欧美国产视频一区二区| 一区二区传媒有限公司| 尤物网在线观看| 日韩女优视频免费观看| 久草手机在线观看| 欧美国产禁国产网站cc| 午夜大片在线观看| 国产婷婷精品| 中文字幕一区二区三区有限公司| 日韩一区二区三区在线看| 欧美在线性爱视频 | 国产手机视频在线| 五月综合激情日本mⅴ| 99精品欧美一区二区| 国产乱码精品一品二品| 欧美牲交a欧美牲交aⅴ免费真| 97精品国产| 久久99精品久久久久子伦| 狠狠久久综合| 性欧美在线看片a免费观看| 91免费在线| 日韩hd视频在线观看| 亚洲专区第一页| 欧美日韩国产一中文字不卡| 韩国一级黄色录像| 国产婷婷色一区二区三区四区 | 一区二区三区四区高清视频| 国产成人在线精品| 韩国日本一区| 日韩亚洲综合在线| 神马精品久久| 精品久久久久久久久久久久久久久 | 久草在线新免费首页资源站| 中文字幕日韩精品在线观看| 亚洲 欧美 激情 另类| 4438x亚洲最大成人网| 免费污污视频在线观看| 亚洲成人免费观看| 性欧美videos| 国产精品污污网站在线观看| avtt香蕉久久| 成人午夜av影视| 伊人五月天婷婷| 久久激情五月婷婷| 欧美婷婷精品激情| 久久字幕精品一区| 亚洲熟妇av日韩熟妇在线| 黑人巨大精品| 夜夜爽夜夜爽精品视频| 国产91在线播放九色| 国产欧美一二三区| 亚洲自拍偷拍一区二区| aaa欧美色吧激情视频| 国产精品99久久久精品无码| 国产一区激情在线| 91免费视频污| 国产一区福利在线| 亚洲精品在线视频播放| 精品一区二区综合| 男人的天堂最新网址| 美女网站在线免费欧美精品| 欧美成人黄色网址| 欧美aa在线视频| 一区二区xxx| 精品一区二区三区的国产在线播放| 看欧美ab黄色大片视频免费| 天堂影院一区二区| 欧美日韩大尺度| 日本vs亚洲vs韩国一区三区二区 | 日韩经典中文字幕| 国产又爽又黄网站亚洲视频123| 亚洲成年网站在线观看| 免费观看a视频| 亚洲国产日韩精品在线| 香蕉人妻av久久久久天天| 亚洲精品福利免费在线观看| 青青草娱乐在线| 亚洲免费av网址| 成人好色电影| 久久精品视频在线播放| 丝袜中文在线| 欧美亚洲成人网| 日本欧美一区| 91啪国产在线| 高潮久久久久久久久久久久久久| 国产一区二区自拍| 最新国产一区| 亚洲一区二区四区| 欧美va天堂在线| av之家在线观看| 日本不卡一区二区三区 | www日韩大片| 卡一卡二卡三在线观看| 亚洲色大成网站www久久九九| 妺妺窝人体色www婷婷| 欧美日韩国产丝袜美女| 五月婷婷丁香在线| 日韩一级免费观看| 四虎精品在永久在线观看| 在线观看国产精品日韩av| www视频在线免费观看| 96精品视频在线| 四虎地址8848精品| 激情视频一区二区| 999久久久免费精品国产| 国产精品www在线观看| 水蜜桃久久夜色精品一区的特点| 国产成人自拍视频在线观看| 一本色道久久综合无码人妻| 91精品在线麻豆| 完全免费av在线播放| 天天色综合天天色| 粉嫩av亚洲一区二区图片| 精品人妻一区二区三区视频| 国产精品国产三级国产有无不卡| 久久久久久久黄色| 在线观看亚洲精品视频| www.久久综合| 伊人久久大香线蕉av一区二区| 污污的网站在线看| 国产精品日韩精品| 黄色免费大全亚洲| 国产成人精品免费看在线播放| 国产欧美欧美| 成人三级做爰av| 国产亚洲1区2区3区| 精品少妇久久久| 欧美另类一区二区三区| 欧美女子与性| 高清欧美性猛交xxxx黑人猛交| 天堂久久一区| 日韩三级在线播放| 一本久道久久综合婷婷鲸鱼| 国产精品久久久久久9999| 国产亚洲欧美日韩日本| 久久夜色精品亚洲| 日韩午夜在线影院| 欧美成人性生活视频| 国产精品69av| 美女久久久久| 麻豆tv在线播放| 国产福利一区二区三区视频在线| 山东少妇露脸刺激对白在线| 色哟哟一区二区三区| 手机在线观看免费av| xxx一区二区| 免费成人黄色网| 日韩欧美手机在线| 老鸭窝亚洲一区二区三区| 老司机午夜免费福利| 亚洲码国产岛国毛片在线| 在线免费观看中文字幕| 亚洲人成绝费网站色www| 美女的胸无遮挡在线观看| 国产一区二区黄色| av在线播放av| 欧美在线一区二区三区| 三级av在线播放| 91爱视频在线| 亚洲成aⅴ人片久久青草影院| 国产91在线免费| 91香蕉视频污在线| 日韩视频免费观看高清| 亚洲精品大尺度| 成人午夜视屏| 色综合666| 麻豆91在线播放| 91插插插插插插| 欧美不卡一区二区三区四区| 欧美韩日亚洲| 国产日韩欧美亚洲一区| 国产日韩一区二区三区在线播放| av2014天堂网| 日韩欧美国产一区二区| 国模吧精品人体gogo| 国产精品国产福利国产秒拍| 欧美日韩中文字幕一区二区三区| 天天视频天天爽| 亚洲色欲色欲www| 亚洲精品视频专区| 欧美激情视频一区| 曰本一区二区三区视频| 日韩在线第三页| 国产精品每日更新在线播放网址| 91亚洲精品国偷拍自产在线观看 | 日本不卡在线观看| 日本视频免费一区| 欧美精品久久久久久久久46p| 日韩精品资源二区在线| 国产资源在线观看入口av| 日韩精品无码一区二区三区| 精品午夜久久福利影院| 九九热国产在线| 日韩毛片在线看| 国产经典一区| 99热都是精品| 99精品视频一区二区三区| 波多野结衣视频在线看| 久久亚洲春色中文字幕| 欧美日韩看看2015永久免费 | 男人添女荫道口女人有什么感觉| 不卡电影一区二区三区| 最近中文字幕在线观看视频| 欧美噜噜久久久xxx| 尤物tv在线精品| 免费欧美一级片| 色综合久久久久综合99| 国产黄色在线免费观看| 久久资源av| 国产麻豆成人精品| 69国产精品视频免费观看| 久久天天躁日日躁| 在线看成人短视频| 精品久久久久久无码人妻| 欧美日韩视频在线第一区 | 91精品啪aⅴ在线观看国产| 亚洲精品孕妇| 青青影院一区二区三区四区| 日本久久免费|