Go 每日一庫之 go homedir

2021-10-02 05:09:22 字數 3001 閱讀 3563

公尺妮 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 ...