代理模式在Go中通过组合与函数封装实现,无需继承或接口强制;代理结构体包裹真实对象并实现相同接口,在方法调用前后插入控制逻辑,支持日志、鉴权、懒加载、限流、缓存、远程调用等场景。

代理模式在 Go 中不依赖继承或接口强制实现,而是通过组合与函数封装自然达成。核心思路是:用一个代理结构体包裹真实对象,对外提供相同方法签名,在调用前后插入控制逻辑(如权限检查、日志、延迟加载等)。
Go 没有传统面向对象的“抽象类”,但可通过接口或函数类型统一行为契约。推荐优先使用接口,便于测试和替换:
// 定义被代理对象需实现的行为
type Service interface {
DoWork() string
Shutdown() error
}
// 真实服务(被代理者)
type RealService struct{}
func (r *RealService) DoWork() string { return "real work done" }
func (r *RealService) Shutdown() error { return nil }
代理结构体持有真实对象(或其指针),并实现相同接口。所有方法都可加入前置/后置逻辑:
type LoggingProxy struct {
service Service // 组合,非继承
}
func (p *LoggingProxy) DoWork() string {
fmt.Println("→ logging: before DoWork")
result := p.service.DoWork()
fmt.Println("← logging: after DoWork")
return result
}
func (p *LoggingProxy) Shutdown() error {
fmt.Println("→ logging: shutting down...")
return p.service.Shutdown()
}
使用时只需将 *RealService 包装进 *LoggingProxy:
立即学习“go语言免费学习笔记(深入)”;
svc := &RealService{}
proxy := &LoggingProxy{service: svc}
fmt.Println(proxy.DoWork()) // 自动触发日志
若不想定义新结构体,可用函数值实现轻量代理。适合简单拦截场景:
type WorkFunc func() string
func WithAuthCheck(f WorkFunc) WorkFunc {
return func() string {
if !isUserAuthorized() {
return "access denied"
}
return f()
}
}
// 使用
realDo := func() string { return "work" }
securedDo := WithAuthCheck(realDo)
fmt.Println(securedDo()) // 先校验,再执行
代理不止于日志和鉴权,还可灵活应对多种访问控制需求:
关键原则:代理应透明——调用方无需感知自己在和代理打交道;变更应集中在代理层,不影响真实逻辑。
基本上就这些。Go 的代理模式重在组合与职责分离,写起来简洁,维护起来清晰。
以上就是如何使用Golang实现代理模式_使用Proxy Pattern控制对象访问的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号