GoFrame 是一个基于 Go 语言的 Web 开发框架,它提供了一系列的功能,可以帮助开发者快速构建出高性能、高可用的 Web 应用。GoFrame 是一个开源的项目,它是由一群志同道合的 Go 爱好者共同维护和开发的。
GoFrame 的核心特性包括:
1. 高性能:GoFrame 使用 Go 语言作为底层语言,具有非常优秀的性能表现。 2. 高可用:GoFrame 提供了一套完整的服务发现、负载均衡、集群部署、运行时监控等功能,保证应用的高可用性。 3. 易扩展:GoFrame 提供了一套完整的扩展机制,使得应用在不同场景下都能够很方便地进行扩展。 4. 安全保障:GoFrame 提供了多项安全保障功能,包括但不限于 HTTPS/TLS 加密、XSS 防御、CSRF 防御、SQL注入防御等。
此外,GoFrame 还有以下特性:
1. 灵活路由: GoFrame 提供了一套强大而灵活的路由机制, 可以根据不同场景进行定制化配置; 2. 多配置文件支撑: GoFrame 支撑多配置文件格式, 如 JSON, YAML, TOML 等; 3. 多中间件支撑: GoFrame 支撑多中间件, 如日志中间件, 跳板中间件, 过虑中间件, 验证中间件, 等; 4. 多数据库集成: GoFrame 集成了多数常用数据库, 如 MySQL, PostgreSQL, MongoDB 等; 5. 多部署方式: GoFrame 支撑多部署方式, 如 Docker 部署、Kubernetes 部署、Serverless 部署; 6. 多预留扩展Hook: GoFrame 本身也内部封装了大量Hook函数来方便开发者进行扩展.
gfsnotify
能监控指定文件/目录的改变,如文件的增加、删除、修改、重命名等操作。
使用方式:
import "github.com/gogf/gf/v2/os/gfsnotify"
接口文档:
https://pkg.go.dev/github.com/gogf/gf/v2/os/gfsnotify
推荐使用gfsnotify
模块提供的Add
和Remove
模块方法,用于添加监控和取消监控。推荐原因见随后章节说明。
此外也可能通过New
方法创建一个监控管理对象之后再进行监控管理。其中,添加监控的时候需要给定触发监控时的回调函数,参数类型为*gfsnotify.Event
对象指针。
package main
import (
"github.com/gogf/gf/v2/os/gfsnotify"
"github.com/gogf/gf/v2/os/glog"
)
func main() {
// /home/john/temp 是一个目录,当然也可以指定文件
path := "/home/john/temp"
_, err := gfsnotify.Add(path, func(event *gfsnotify.Event) {
if event.IsCreate() {
glog.Println("创建文件 : ", event.Path)
}
if event.IsWrite() {
glog.Println("写入文件 : ", event.Path)
}
if event.IsRemove() {
glog.Println("删除文件 : ", event.Path)
}
if event.IsRename() {
glog.Println("重命名文件 : ", event.Path)
}
if event.IsChmod() {
glog.Println("修改权限 : ", event.Path)
}
glog.Println(event)
})
// 移除对该path的监听
// gfsnotify.Remove(path)
if err != nil {
glog.Fatalln(err)
} else {
select {}
}
}
其中/home/john
参数为一个目录,gfsnotify.Add
方法默认为递归监控,也就是说当目录下的文件(包括子目录下的文件)发生变化时,也会收到文件监控信息回调。
当我们在/home/john
目录下创建/删除/修改文件时,可以看到gfsnotify
监控到了文件的修改并输出了对应的事件信息。
移除监听我们可以使用Remove
方法,会移除对整个文件/目录的监听。
当对同一个文件/目录存在多个监听回调时,我们可以通过RemoveCallback
方法移除指定的回调。方法参数callbackId
是在添加监听时返回的Callback
对象的唯一ID。
使用示例1:
package main
import (
"github.com/gogf/gf/v2/os/gfsnotify"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gtimer"
"time"
)
func main() {
c1, err := gfsnotify.Add("/home/john/temp/log", func(event *gfsnotify.Event) {
glog.Println("callback1")
})
if err != nil {
panic(err)
}
c2, err := gfsnotify.Add("/home/john/temp/log", func(event *gfsnotify.Event) {
glog.Println("callback2")
})
if err != nil {
panic(err)
}
// 5秒后移除c1的回调函数注册,仅剩c2
gtimer.SetTimeout(5*time.Second, func() {
gfsnotify.RemoveCallback(c1.Id)
glog.Println("remove callback c1")
})
// 10秒后移除c2的回调函数注册,所有的回调都移除,不再有任何打印信息输出
gtimer.SetTimeout(10*time.Second, func() {
gfsnotify.RemoveCallback(c2.Id)
glog.Println("remove callback c2")
})
select {}
}
使用示例2:
package main
import (
"github.com/gogf/gf/v2/os/gfsnotify"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gtimer"
"time"
)
func main() {
callback, err := gfsnotify.Add("/home/john/temp", func(event *gfsnotify.Event) {
glog.Println("callback")
})
if err != nil {
panic(err)
}
// 在此期间创建文件、目录、修改文件、删除文件
// 20秒后移除回调函数注册,所有的回调都移除,不再有任何打印信息输出
gtimer.SetTimeout(20*time.Second, func() {
gfsnotify.RemoveCallback(callback.Id)
glog.Println("remove callback")
})
select {}
}
在*nix
系统下,gfsnotify
模块使用的是系统的inotify
特性来实现的文件/目录监控,因此该功能在使用时会受到系统的两个内核函数限制:
fs.inotify.max_user_instances
:表示当前用户可创建的inotify
监控实例数量,即gfsnotify.New
方法创建的Watcher
对象数量,一个Watcher
对象对应系统的一个inotify
实例,系统默认数量为:128
;
fs.inotify.max_user_watches
:表示一个inotify
实例可添加的监控文件队列大小,往同一个inotify
添加的监控文件超过该数量限制则会失败,并且会有系统错误日志,系统默认数量往往为:8192
(有的系统该数值会比较大一些);Compare说明:Compare返回一个按字典顺序比较两个字符串的整数。如果a==b,结果为0,如果ab,结果为-1,如...
以下常用方法列表,文档更新可能滞后于代码新特性,更多的方法及示例请参考代码文档:https://pkg.go.dev/github.com/gogf/gf/v2...
goframe框架提供了独立的二进制数据操作包gbinary,主要用于各种数据类型与[]byte二进制类型之间的相互转换;以及针...
Query示例-并发网络蜘蛛Tornado 的tornado.queues模块为协程实现了异步生产者/消费者模式,类似于 Python 标准库的queue模块为线...