公尺妮 m.amini.net
今天我們來看乙個很小,很實用的庫go-homedir。顧名思義,go-homedir
用來獲取使用者的主目錄。
實際上,使用標準庫os/user
我們也可以得到這個資訊:
package main
import (
"fmt"
"log"
"os/user"
)func main()
fmt.println("home dir:", u.homedir)
}
那麼為什麼還要go-homedir
庫?
在 darwin 系統上,標準庫os/user
的使用需要 cgo。所以,任何使用os/user
的**都不能交叉編譯。
但是,大多數人使用os/user
的目的僅僅只是想獲取主目錄。因此,go-homedir
庫出現了。
go-homedir
是第三方包,使用前需要先安裝:
$ go get github.com/mitchellh/go-homedir
使用非常簡單:
}go-homedir
有兩個功能:
由於dir
的呼叫可能涉及一些系統呼叫和外部執行命令,多次呼叫費效能。所以go-homedir
提供了快取的功能。預設情況下,快取是開啟的。
我們也可以將disablecache
設定為false
來關閉它。
}使用快取時,如果程式執行中修改了主目錄,再次呼叫dir
還是返回之前的目錄。如果需要獲取最新的主目錄,可以先呼叫reset
清除快取。
func dir() (string, error) else
if err != nil
return result, nil
}
判斷當前的系統是windows
還是類 unix,分別呼叫不同的方法。先看 windows 的,比較簡單:
func dirwindows() (string, error)
// prefer standard environment variable userprofile
if home := os.getenv("userprofile"); home != ""
drive := os.getenv("homedrive")
path := os.getenv("homepath")
home := drive + path
if drive == "" || path == ""
return home, nil
}
流程如下:
類 unix 系統的實現稍微複雜一點:
func dirunix() (string, error)
// first prefer the home environmental variable
if home := os.getenv(homeenv); home != ""
var stdout bytes.buffer
// if that fails, try os specific commands
if runtime.goos == "darwin"
}} else
} else }}
} // if all else fails, try the shell
stdout.reset()
cmd := exec.command("sh", "-c", "cd && pwd")
cmd.stdout = &stdout
if err := cmd.run(); err != nil
result := strings.trimspace(stdout.string())
if result == ""
return result, nil
}
流程如下:
這裡分析原始碼並不是表示使用任何庫都要熟悉它的原始碼,畢竟使用庫就是為了方便開發。
但是原始碼是我們學習和提高的乙個非常重要的途徑。我們在使用庫遇到問題的時候也要有能力從文件或甚至原始碼中查詢原因。
home-dir github 倉庫
我的部落格
本文由部落格一文多發平台 openwrite 發布!
Go 每日一庫之 quicktemplate
最近在整理我們專案 的時候,發現有很多活動的 在結構和提供的功能上都非常相似。為了方便今後的開發,我花了一點時間編寫了乙個生成 框架的工具,最大程度地降低重複勞動。本身並不複雜,且與專案 關聯性較大,這裡就不展開介紹了。在這個過程中,我發現 go 標準的模板庫text template和html t...
Go每日一題 6
以下 是否編譯通過 package main import fmt type myint1 inttype myint2 int func main 輸出結果 編譯不通過,cannot use i type int as type myint1 in assignment。myint1 和 myin...
go每日一庫 home dir 獲取使用者主目錄
我的部落格 文章首發 顧名思義,go homedir用來獲取使用者的主目錄。實際上,通過使用標準庫os user我們也可以得到內容,使用以下方式 package main import fmt log os user func main fmt.println home dir u.homedir ...