精品欧美一区二区三区在线观看 _久久久久国色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)

欧美老熟妇喷水| 国产精品乱码| 国产天堂av在线| 国产在线不卡一区二区三区| 亚洲色图欧洲色图婷婷| dy888夜精品国产专区| 中文字幕亚洲精品一区| 欧美亚洲激情| 日韩欧美国产一区二区在线播放| 成人性生活视频免费看| 亚洲AV成人无码一二三区在线| 久久午夜精品| 欧美成人午夜影院| 中日韩精品一区二区三区| 国产精品第一国产精品| 亚洲高清视频的网址| 日韩av不卡播放| a级片在线免费看| 久久久久在线| 色在人av网站天堂精品| 欧美黄色高清视频| 成人精品毛片| 欧美区一区二区三区| 久久久久久www| 视频国产在线观看| 国产精品一区二区你懂的| 欧美激情一区二区三级高清视频| 久久美女免费视频| 中文字幕一区图| 欧美日韩国产首页| a在线视频观看| caoporn免费在线视频| 久久精品日产第一区二区三区高清版 | 欧美熟妇交换久久久久久分类| 天堂成人免费av电影一区| 久久99精品视频一区97| 少妇愉情理伦三级| 精品在线99| 亚洲国产欧美一区| 亚洲综合中文网| 日韩国产大片| 欧美三级在线播放| 成年人免费在线播放| 青青青国内视频在线观看软件| 国产精品美女久久久久久久网站| 免费av在线一区二区| 国产按摩一区二区三区| 久久黄色级2电影| 国产精品日韩电影| 日韩免费av网站| 一区二区三区四区五区精品视频 | 久久精品在线观看视频| 视频国产一区| 亚洲乱码国产乱码精品精天堂| 色哟哟无码精品一区二区三区| 亚洲国产欧美国产第一区| 欧美偷拍一区二区| 亚洲精品视频导航| jizz亚洲女人高潮大叫| 在线影院国内精品| 无码日韩人妻精品久久蜜桃| 日本久久免费| 日本道色综合久久| 成人免费无码av| 桃花岛tv亚洲品质| 欧美在线一二三| 国产精品一区二区小说| 成人午夜在线| 91精品国产一区二区三区香蕉| 欧美丝袜在线观看| 国产美女亚洲精品7777| 日韩精品中文字幕一区| 亚洲av午夜精品一区二区三区| а√中文在线天堂精品| 亚洲国产欧美一区二区丝袜黑人| 一区二区三区免费在线观看视频| 综合综合综合综合综合网| 亚洲女人被黑人巨大进入| 久久无码人妻精品一区二区三区 | 亚洲人体一区| 超碰在线免费播放| 亚洲影视资源网| 久久久噜噜噜www成人网| 欧洲av不卡| 欧美日韩不卡视频| av地址在线观看| 日韩丝袜视频| 日韩在线视频观看| 2018天天弄| 亚洲一区二区三区四区五区午夜| 日韩av免费网站| 国产精品免费无遮挡| 国产成人在线影院| 欧美一区少妇| www红色一片_亚洲成a人片在线观看_| 亚洲国产综合人成综合网站| 亚洲精品无码久久久久久| 欧美日韩伦理一区二区| 亚洲第一天堂av| 国产探花视频在线播放| 欧美涩涩视频| 欧美一级在线亚洲天堂| 一级aaaa毛片| 97久久久精品综合88久久| 日韩三级电影| 成人福利影视| 欧美精品一卡二卡| youjizz.com日本| 欧美三级电影在线看| 国产精品羞羞答答| 成人无码一区二区三区| 久久青草欧美一区二区三区| 美女黄色片网站| 国模私拍一区二区国模曼安| 欧美日韩一二三区| 88av在线播放| 香港欧美日韩三级黄色一级电影网站| 高清一区二区三区日本久| 做爰无遮挡三级| 99亚偷拍自图区亚洲| 一区二区不卡视频| 男人皇宫亚洲男人2020| 日韩午夜av一区| jizzjizzjizz国产| 国产精品日韩欧美一区| 91丝袜脚交足在线播放| 国产男女在线观看| 亚洲av成人无码网天堂| 最新久久zyz资源站| 四虎永久在线精品无码视频| 亚洲电影一区| 久久精品美女视频网站| 天堂网免费视频| 成人av在线网| 男人天堂网站在线| 日日夜夜一区| 亚洲最新在线视频| 中文字幕av久久爽av| 麻豆国产精品777777在线| 欧美日韩精品久久| 九色porny自拍视频在线播放| 日韩一区二区三区在线| 很污很黄的网站| 视频一区免费在线观看| 久久久久久一区| 丁香花在线电影小说观看| 欧美一区二区大片| 欧洲第一无人区观看| 青青草国产精品亚洲专区无| 欧美精品尤物在线| 亚洲人免费短视频| 亚洲日本欧美中文幕| 五月天婷婷激情| 久久天天做天天爱综合色| 日日碰狠狠添天天爽超碰97| 露出调教综合另类| 国自产精品手机在线观看视频| 亚洲国产精品国自产拍久久| 亚洲最新视频在线播放| 国产a级片视频| 亚洲乱码久久| 国产在线一区二区三区四区| 国产精品电影| 日韩电影视频免费| 欧美精品一二三四区| 久久久91精品国产一区二区精品| 国产黄色特级片| 欧美理论视频| 91九色视频在线| av免费在线观| 欧美变态tickling挠脚心| 欧美黑人精品一区二区不卡| 国产成人av一区二区三区在线| 欧美这里只有精品| 卡一精品卡二卡三网站乱码| 欧美亚洲国产另类| 国产福利在线看| 欧美人与禽zozo性伦| 成人观看免费视频| av高清久久久| 午夜dv内射一区二区| 日韩在线视屏| 97久久夜色精品国产九色| 538视频在线| 亚洲网站在线播放| 99热这里只有精品在线观看| 亚洲一区二区三区视频在线 | 国产无码精品一区二区| 91在线观看免费视频| 熟女性饥渴一区二区三区| 成人精品久久| 亚洲一区二区三区777| 高清电影在线免费观看| 亚洲精品日韩久久久| 亚洲网站在线免费观看| 亚洲一二三四区不卡| 欧美视频亚洲图片| 亚洲免费黄色| 亚洲无玛一区| 国产精品xxxav免费视频| 国产精品美女www| 黄色成人在线网| 国产亚洲欧洲黄色| а√中文在线资源库| 色呦呦一区二区三区| 岛国毛片在线观看| 久久亚洲精品小早川怜子| 91欧美一区二区三区| 亚洲少妇一区| 影音先锋男人的网站| 欧美日韩破处| 91精品国产一区二区三区动漫| 怡红院成人在线| 欧美极品美女电影一区| av在线播放免费| 亚洲国产精品久久| 97在线播放免费观看| 欧美视频中文字幕在线| 青青草原国产视频| 国产精品丝袜91| 在线免费观看a级片| 国产一区美女在线| 妺妺窝人体色www在线观看| 伊人精品视频| 26uuu成人| 精品视频网站| 久久99导航| 亚洲国产欧美国产第一区| 国产精品观看在线亚洲人成网| 国产网红女主播精品视频| 自拍偷拍亚洲一区| 十九岁完整版在线观看好看云免费| 欧美一区二区三区视频免费| 国产91av在线播放| 五月婷婷久久丁香| 欧美片一区二区| 亚洲欧美一区二区三区久本道91| 草草影院第一页| www.久久精品| 岛国av免费观看| 国产精品1区2区3区| 午夜视频在线网站| 美女久久久精品| 午夜免费高清视频| 首页亚洲欧美制服丝腿| aa免费在线观看| 免费在线亚洲欧美| 欧美精品一区免费| 国产一区成人| www国产黄色| 亚洲欧美日韩国产一区二区| 欧美视频在线观看网站| 亚洲久久一区| 日本a级片免费观看| 99视频精品免费观看| 久久综合九色综合88i| 在线亚洲免费| 农村妇女精品一二区| 久久这里有精品15一区二区三区| 男女av免费观看| 水蜜桃久久夜色精品一区的特点| 国产精品无码一本二本三本色| 蜜桃av一区| 一本久道中文无码字幕av| 日本欧美加勒比视频| a在线观看免费视频| 九九精品视频在线看| 国内自拍第二页| 国产激情视频一区二区在线观看| 国产探花在线观看视频| 国产精品伊人色| 喷水视频在线观看| 国产亚洲精品福利| 婷婷综合在线视频| 亚洲日本电影在线| 久久精品免费在线| 色婷婷香蕉在线一区二区| 国产精品自拍第一页| 欧美日韩国产片| 超碰在线人人干| 亚洲精品久久久一区二区三区 | 日韩中文综合网| 26uuu亚洲电影在线观看| 欧美激情在线狂野欧美精品| 亚洲v.com| 国产日韩一区在线| 国产精品极品在线观看| 欧美日韩一区二| 天天操综合网| 久久久久久久久久久99| 日韩av一区二| 亚洲午夜精品在线观看| 99久久99久久精品国产片果冻| 日韩中文字幕有码| 一区二区三区在线免费观看| 国产毛片aaa| 欧美浪妇xxxx高跟鞋交| 亚洲精品免费在线观看视频| 亚洲美腿欧美激情另类| 菠萝菠萝蜜在线视频免费观看| 97高清免费视频| 草民电影神马电影一区二区| dy888夜精品国产专区| 亚洲国产最新| 91免费国产精品| 日产国产欧美视频一区精品| 欧美性受xxxx黒人xyx性爽| 91啪九色porn原创视频在线观看| a一级免费视频| 欧美天堂在线观看| 国产富婆一级全黄大片| 亚洲欧美日韩中文在线| 91黄色在线| 国产欧美日韩精品丝袜高跟鞋| 国产精品xxx在线观看| 综合国产精品久久久| 中文国产一区| 俄罗斯女人裸体性做爰| 国产精品免费观看视频| 日韩精品在线观看免费| 日韩欧美中文字幕精品| chinese偷拍一区二区三区| 欧美性视频在线| 91成人午夜| 手机福利在线视频| 日韩高清国产一区在线| 成人网站免费观看| 一区二区免费看| 国产精品自偷自拍| 亚洲性日韩精品一区二区| 九色porny自拍视频在线播放 | 婷婷丁香激情网| 99riav一区二区三区| 国产一级片久久| 欧美一区二区三区免费在线看| aⅴ在线视频男人的天堂| 欧美做受高潮电影o| 日本一道高清一区二区三区| 老司机激情视频| 国产一区二区精品在线观看| 97精品在线播放| 欧美日韩国产天堂| avav免费在线观看| 国产精品视频区1| 欧美日韩在线二区| caoporn超碰97| 久久美女艺术照精彩视频福利播放 | 亚洲欧美日韩一区二区 | 日本视频免费一区| 久久美女免费视频| 91成人网在线| 裸体xxxx视频在线| 国产精品白嫩美女在线观看| 尤物tv在线精品| 亚洲精品高清无码视频| 国产亚洲精品久| 在线免费观看av片| xxxxxxxxx欧美| 99久久久国产| 大片在线观看网站免费收看| 国产高清亚洲一区| 久久久久久欧美精品se一二三四| 精品欧美乱码久久久久久| 污污片在线免费视频| 激情一区二区三区| 国产精品毛片| 2019男人天堂| 91精品免费在线观看| 羞羞视频在线观看不卡| 国产精品国产一区二区| 一区二区黄色| 国产精品理论在线| 欧美一区二区三区婷婷月色| 久草在线视频福利| 久久久久高清| 日本aⅴ精品一区二区三区| 一级片一级片一级片| 日韩精品一区二| 手机在线观看av网站| 日本成人看片网址| 精品午夜一区二区三区在线观看| 国产稀缺精品盗摄盗拍| 精品久久久久av影院| 欧美xxx性| 在线观看成人av电影| 国产成人精品免费一区二区| 国内免费精品视频| 一夜七次郎国产精品亚洲| 国产激情一区| heyzo国产| 国产精品久久久久影院老司| 丰满人妻一区二区三区四区53| 欧亚精品中文字幕| 久久久久久久久久久9不雅视频| 无码国产精品一区二区免费式直播 | 肉大捧一出免费观看网站在线播放 | 91亚洲精品视频| 国产精品久久久久久久久久妞妞| 后入内射无码人妻一区| 精品国产99国产精品|