掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流
Go 語言作為靜態(tài)編譯型語言,每次修改配置文件后,我們都需要重新編譯,修改的配置信息才可以生效,而動態(tài)編譯型語言修改配置文件可以自動生效,相對來說更方便一些。

我們注重客戶提出的每個要求,我們充分考慮每一個細節(jié),我們積極的做好成都做網站、成都網站設計、成都外貿網站建設服務,我們努力開拓更好的視野,通過不懈的努力,成都創(chuàng)新互聯(lián)公司贏得了業(yè)內的良好聲譽,這一切,也不斷的激勵著我們更好的服務客戶。 主要業(yè)務:網站建設,網站制作,網站設計,微信小程序定制開發(fā),網站開發(fā),技術開發(fā)實力,DIV+CSS,PHP及ASP,ASP.Net,SQL數據庫的技術開發(fā)工程師。
但是,我們可以使用三方開源庫 fsnotify?,這是一款非常流行的文件系統(tǒng)監(jiān)聽庫,很多開源的三方庫也都使用該庫實現(xiàn)監(jiān)聽文件變更,比如我們之前介紹的非常流行的管理配置信息開源庫 viper。
NewWatcher 函數:
fsnotify? 提供了 NewWatcher 函數,使用該函數可以創(chuàng)建一個監(jiān)聽器。
// NewWatcher creates a new Watcher.
func NewWatcher() (*Watcher, error) {
// 省略代碼 ...
w := &Watcher{
// 省略代碼 ...
Events: make(chan Event),
Errors: make(chan error),
// 省略代碼 ...
}
go w.readEvents()
return w, nil
}
閱讀 NewWatcher? 函數的源碼,我們可以發(fā)現(xiàn),該函數返回一個 *Watcher。
并且我們可以發(fā)現(xiàn)該結構體的兩個公開字段 Events? 和 Errors? 分別是 Event? 類型和 error? 類型的 channel。
事件:
Event? 類型的字段 Events。
type Event struct {
Name string
Op Op
}
type Op uint32
const (
Create Op = 1 << iota
Write
Remove
Rename
Chmod
)閱讀上面這段代碼,我們可以發(fā)現(xiàn) Event? 包含兩個字段,分別表示事件名稱和操作類型,其中,事件操作類型有 5 個,分別是 Create、Write、Remove、Rename? 和 Chmod。
我們可以啟動一個協(xié)程,使用 for ... select? 監(jiān)聽 watcher? 的 Events? 和 Errors 通道并輸出事件信息和錯誤信息。
Event? 包含 2 個方法,分別是 Has? 和 String,Has 用于判斷事件是否包含給定操作,源碼如下:
// Has reports if this event has the given operation.
func (e Event) Has(op Op) bool { return e.Op.Has(op) }
監(jiān)聽器:
Watcher? 包含 4 個公共方法,分別是 Add、Close、Remove? 和 WatchList。
在了解完 fsnotify? 源碼之后,我們再介紹一下 fsnotify 的使用示例。
func main() {
// 創(chuàng)建一個監(jiān)聽器
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
// 關閉監(jiān)聽器
defer watcher.Close()
// 開始監(jiān)聽事件
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
if event.Has(fsnotify.Write) {
// 自動加載文件內容
f, _ := os.Open("log.txt")
_, _ = io.Copy(os.Stdout, f)
}
}
}()
// 添加監(jiān)聽目錄
err = watcher.Add("./")
if err != nil {
log.Fatal(err)
}
// 永久阻塞 main goroutine
<-make(chan struct{})
}閱讀上面這段示例代碼,我們可以發(fā)現(xiàn),使用 fsnotify 非常簡單。
首先,使用 NewWatcher? 函數創(chuàng)建一個 watcher?,然后,使用 Add? 方法添加監(jiān)聽目錄或文件,最后,使用 defer? 調用 Close 方法,關閉監(jiān)聽器,釋放系統(tǒng)資源。
示例代碼中,啟動一個 goroutine? 循環(huán)輸出事件通道中的事件,發(fā)現(xiàn) Write? 操作類型的事件時,將 log.txt 中的文件內容拷貝到標準輸出。
我們可以在運行該程序后,修改 log.txt 中的內容,終端將會打印該文件修改后的最新內容。
我們可以使用該特性,自動監(jiān)聽應用程序的配置文件,避免修改配置信息后,還需要重新編譯并啟動應用才可以生效。
本文我們介紹了跨平臺文件監(jiān)聽庫 fsnotify,它主要用于自動監(jiān)聽文件中的內容變更。
我們通過 fsnotify 源碼和示例代碼,介紹了該庫支持的功能和使用方式。
建議感興趣的讀者朋友們,繼續(xù)閱讀該庫的官方文檔和源碼,了解在不同系統(tǒng)平臺中使用的注意事項,并有效運用在自己的項目中。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流