亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文我們介紹了跨平臺文件監(jiān)聽庫 fsnotify,它主要用于自動監(jiān)聽文件中的內(nèi)容變更。我們通過 fsnotify 源碼和示例代碼,介紹了該庫支持的功能和使用方式。

?1、介紹

Go 語言作為靜態(tài)編譯型語言,每次修改配置文件后,我們都需要重新編譯,修改的配置信息才可以生效,而動態(tài)編譯型語言修改配置文件可以自動生效,相對來說更方便一些。

但是,我們可以使用三方開源庫 fsnotify?,這是一款非常流行的文件系統(tǒng)監(jiān)聽庫,很多開源的三方庫也都使用該庫實(shí)現(xiàn)監(jiān)聽文件變更,比如我們之前介紹的非常流行的管理配置信息開源庫 viper。

2、fsnotify 源碼解讀

NewWatcher 函數(shù):

fsnotify? 提供了 NewWatcher 函數(shù),使用該函數(shù)可以創(chuàng)建一個(gè)監(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? 函數(shù)的源碼,我們可以發(fā)現(xiàn),該函數(shù)返回一個(gè) *Watcher。

并且我們可以發(fā)現(xiàn)該結(jié)構(gòu)體的兩個(gè)公開字段 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? 包含兩個(gè)字段,分別表示事件名稱和操作類型,其中,事件操作類型有 5 個(gè),分別是 Create、Write、Remove、Rename? 和 Chmod。

我們可以啟動一個(gè)協(xié)程,使用 for ... select? 監(jiān)聽 watcher? 的 Events? 和 Errors 通道并輸出事件信息和錯(cuò)誤信息。

Event? 包含 2 個(gè)方法,分別是 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 個(gè)公共方法,分別是 Add、Close、Remove? 和 WatchList。

  • Add - 用于指定監(jiān)聽目錄或監(jiān)聽文件,需要注意的是,指定目錄僅能監(jiān)聽該目錄中的所有文件,無法監(jiān)聽該目錄中子目錄的文件。
  • Close - 刪除所有監(jiān)聽,并關(guān)閉 Event 通道。
  • Remove - 停止監(jiān)視指定目錄或指定文件的變更,需要注意的是,指定目錄僅代表當(dāng)前目錄,指定目錄中的子目錄需單獨(dú)停止監(jiān)聽。刪除未被監(jiān)聽的目錄或文件,將會返回錯(cuò)誤。
  • WatchList - 返回尚未被刪除的所有使用 Ad 添加的目錄或文件。

3、fsnotify 使用示例

在了解完 fsnotify? 源碼之后,我們再介紹一下 fsnotify 的使用示例。

func main() {
 // 創(chuàng)建一個(gè)監(jiān)聽器
 watcher, err := fsnotify.NewWatcher()
 if err != nil {
  log.Fatal(err)
 }
 // 關(guān)閉監(jiān)聽器
 defer watcher.Close()
 // 開始監(jiān)聽事件
 go func() {
  for {
   select {
   case event, ok := <-watcher.Events:
    if !ok {
     return
    }
    if event.Has(fsnotify.Write) {
     // 自動加載文件內(nèi)容
     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? 函數(shù)創(chuàng)建一個(gè) watcher?,然后,使用 Add? 方法添加監(jiān)聽目錄或文件,最后,使用 defer? 調(diào)用 Close 方法,關(guān)閉監(jiān)聽器,釋放系統(tǒng)資源。

示例代碼中,啟動一個(gè) goroutine? 循環(huán)輸出事件通道中的事件,發(fā)現(xiàn) Write? 操作類型的事件時(shí),將 log.txt 中的文件內(nèi)容拷貝到標(biāo)準(zhǔn)輸出。

我們可以在運(yùn)行該程序后,修改  log.txt 中的內(nèi)容,終端將會打印該文件修改后的最新內(nèi)容。

我們可以使用該特性,自動監(jiān)聽?wèi)?yīng)用程序的配置文件,避免修改配置信息后,還需要重新編譯并啟動應(yīng)用才可以生效。

4、總結(jié)

本文我們介紹了跨平臺文件監(jiān)聽庫 fsnotify,它主要用于自動監(jiān)聽文件中的內(nèi)容變更。

我們通過 fsnotify 源碼和示例代碼,介紹了該庫支持的功能和使用方式。

建議感興趣的讀者朋友們,繼續(xù)閱讀該庫的官方文檔和源碼,了解在不同系統(tǒng)平臺中使用的注意事項(xiàng),并有效運(yùn)用在自己的項(xiàng)目中。

分享到:
標(biāo)簽:語言
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定