如何在Golang中实现状态模式_Golang状态模式实现与使用技巧-Golang

Go通过接口+结构体组合实现轻量状态模式:定义State接口封装行为,Machine持State接口并加锁转发请求,状态切换需避免循环引用和阻塞操作,注重并发安全与资源清理。

Go 语言没有类和继承,状态模式不能照搬传统 OOP 的写法;但通过接口 + 结构体组合 + 方法集,完全可以实现等效、更轻量的状态切换逻辑。

用 interface 定义状态行为契约

状态模式的核心是把“不同状态下对同一请求的响应”抽成统一接口。在 Go 中,这必须是一个接口,比如:

type State interface {
    Handle(ctx context.Context, req *Request) error
    Name() string
}

所有具体状态(如 IdleState、RunningState)都实现该接口。注意两点:

  • 避免在接口中暴露过多方法——只放真正随状态变化的行为,像 Enter() 或 Exit() 属于生命周期钩子,应由上下文结构体统一调用,不放进 State 接口
  • 接口方法参数尽量精简,优先传值或不可变结构(如 *Request),避免传入整个上下文对象导致状态实现强耦合

用嵌入结构体实现状态切换与委托

上下文(Context)不直接持有状态值,而是持有一个 State 接口变量,并把请求转发给当前状态:

type Machine struct {
    mu    sync.RWMutex
    state State
}

func (m *Machine) Handle(ctx context.Context, req *Request) error {
    m.mu.RLock()
    defer m.mu.RUnlock()
    return m.state.Handle(ctx, req)
}

状态切换发生在具体操作中,例如:

func (m *Machine) Start() {
    m.mu.Lock()
    defer m.mu.Unlock()
    m.state = &RunningState{machine: m} // 注意:这里传回指针,避免循环引用或拷贝丢失
}

关键点:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何在Golang中实现状态模式_Golang状态模式实现与使用技巧-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4022384+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4022384+
  • 本周更新: 0+
  • 最后更新: 2026-03-16