成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言跨平臺文件監聽庫 Fsnotify 怎么使用?

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

?1、介紹

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

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

2、fsnotify 源碼解讀

NewWatcher 函數:

fsnotify? 提供了 NewWatcher 函數,使用該函數可以創建一個監聽器。

// 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? 函數的源碼,我們可以發現,該函數返回一個 *Watcher。

并且我們可以發現該結構體的兩個公開字段 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
)

閱讀上面這段代碼,我們可以發現 Event? 包含兩個字段,分別表示事件名稱和操作類型,其中,事件操作類型有 5 個,分別是 Create、Write、Remove、Rename? 和 Chmod。

我們可以啟動一個協程,使用 for ... select? 監聽 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) }

監聽器:

Watcher? 包含 4 個公共方法,分別是 Add、Close、Remove? 和 WatchList。

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

3、fsnotify 使用示例

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

func main() {
// 創建一個監聽器
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
// 關閉監聽器
defer watcher.Close()
// 開始監聽事件
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)
}
}
}()
// 添加監聽目錄
err = watcher.Add("./")
if err != nil {
log.Fatal(err)
}
// 永久阻塞 main goroutine
<-make(chan struct{})
}

閱讀上面這段示例代碼,我們可以發現,使用 fsnotify 非常簡單。

首先,使用 NewWatcher? 函數創建一個 watcher?,然后,使用 Add? 方法添加監聽目錄或文件,最后,使用 defer? 調用 Close 方法,關閉監聽器,釋放系統資源。

示例代碼中,啟動一個 goroutine? 循環輸出事件通道中的事件,發現 Write? 操作類型的事件時,將 log.txt 中的文件內容拷貝到標準輸出。

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

我們可以使用該特性,自動監聽應用程序的配置文件,避免修改配置信息后,還需要重新編譯并啟動應用才可以生效。

4、總結

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

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

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

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2023-02-13 00:24:37

Go語言日志庫

2022-06-05 23:30:25

AES加密算法

2022-04-13 08:20:32

DockerGo項目

2022-07-04 14:41:31

Go 語言變長參數變長參數函數

2024-04-01 00:02:56

Go語言代碼

2022-07-03 23:07:48

Go語言參數

2010-01-19 15:18:12

C++語言

2023-01-16 00:12:20

Go語言Web

2024-09-13 09:58:54

MarotoGo語言

2022-01-04 09:36:24

Samba文件共享工具Linux

2023-07-16 23:43:05

Go語言模式

2022-10-24 00:48:58

Go語言errgroup

2021-06-28 11:15:22

Go語言16GB文件

2023-04-02 23:13:07

Go語言bufio

2021-07-08 10:50:02

Go語言16GB文件代碼

2010-08-10 15:13:11

GoGoogle

2014-06-23 09:49:32

Go語言Android谷歌

2014-07-01 10:01:36

Go安卓開發

2025-01-08 08:39:10

Go語言CSV

2019-11-18 14:00:40

開發工具環境搭建vagrant
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美日韩一区二区三区在线观看 | 97精品一区二区 | 欧美国产视频 | 欧美精品片 | 国产欧美一区二区精品久导航 | 国产97久久 | 国产一级精品毛片 | 免费特黄视频 | 欧美日韩国产精品一区 | 日韩国产一区二区三区 | 色精品 | 色播99 | 高清视频一区二区三区 | 国产偷录视频叫床高潮对白 | 欧美色偷拍 | 狠狠狠 | 91视频在线看 | 一区欧美| 在线免费观看成年人视频 | 久久精品国产久精国产 | 狠狠干av | www.亚洲 | 午夜精品一区二区三区在线 | 欧美亚洲免费 | 国产一区91精品张津瑜 | 亚洲精品久久久久久久久久久久久 | 激情欧美一区二区三区中文字幕 | 国产精品www | 日韩日韩日韩日韩日韩日韩日韩 | 久久99久久98精品免观看软件 | 九色 在线 | 日本男人天堂 | 欧美男人天堂 | 欧美99| 久久高清免费视频 | 国产成人精品一区 | 嫩草研究影院 | 久久久一区二区三区 | 欧洲国产精品视频 | 亚洲国产成人久久综合一区,久久久国产99 | 国产精品一区二区视频 |