代理模式通过统一接口让代理与真实对象实现相同行为,在调用前后插入鉴权、日志、缓存等逻辑,支持链式组合与HTTP中间件模拟,提升系统可控性与扩展性。

代理模式在 Golang 中常用于控制对目标对象的访问,比如添加鉴权、日志、缓存、限流或延迟加载等逻辑,而无需修改原始业务代码。核心思路是定义统一接口,让代理和真实对象都实现它,代理在调用真实对象前后插入自定义行为。
先设计一个基础接口(如 Service),再实现真实业务逻辑(RealService):
示例:
type Service interface {
Do() string
}
type RealService struct{}
func (r *RealService) Do() string {
return "执行核心业务"
}代理结构体持有真实对象指针,并在方法中加入控制逻辑:
立即学习“go语言免费学习笔记(深入)”;
示例(带日志与简单鉴权):
type AuthServiceProxy struct {
service Service
token string
}
func NewAuthServiceProxy(s Service, t string) *AuthServiceProxy {
return &AuthServiceProxy{service: s, token: t}
}
func (a *AuthServiceProxy) Do() string {
if a.token != "valid-token" {
return "拒绝访问:无效凭证"
}
log.Println("→ 开始处理请求")
result := a.service.Do()
log.Println("← 请求完成")
return result
}多个关注点可拆分为独立代理(如 AuthProxy、LogProxy、CacheProxy),通过嵌套实现职责分离:
newCacheProxy(newAuthProxy(newRealService()))
在 Web 场景中,Golang 的 http.Handler 天然适合代理思想:
http.Handler 并返回新 http.Handler
ServeHTTP 中预处理请求、调用下一层、后处理响应典型写法:
func LoggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("收到请求: %s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}基本上就这些。代理模式不复杂但容易忽略边界——比如代理不应暴露真实对象内部细节,接口要足够抽象,代理自身也应可被代理。用好它,能让系统更可控、更易扩展。
以上就是如何使用Golang实现代理模式控制请求访问_Golang代理模式实践方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号