FSM-Golang

如何优雅代码中处理复杂的状态流转?Golang FSM 实践 有限状态机 (FSM) 是处理复杂状态和流程管理的强大武器。通过这样的库,我们可以轻松地在 Go 项目中实践 FSM,告别混乱的if-else逻辑,写出更优雅、更健壮、更易于维护的代码。 阅读详情

使用FSM(Finite State Machine)来制作怪物的AI,比较轻量级;

概念

状态机分为两大类:

名称说明
Moore machine输出只和状态有关而与输入无关
Mealy machine输出不仅和状态有关而且和输入有关系(使用这种状态机通常可以减少状态的数量。)

状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:

①现态:是指当前所处的状态。

②条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

最首先状态机的概念是使用在电路,单片机相关的东西里面。

在刚才归纳的要素里面很重要的就是“状态”,“条件“,”动作“。

游戏中常用的状态机

DulcAU.png

要素元素
状态待机状态巡逻状态追击状态攻击状态
条件出现敌人主动怪判断遭到攻击攻击范围检测追击范围检测
动作朝某个位置移动施法

阅读 looplab/fsm 实现

DKZZLD.png

在创建状态机的时候需要指定状态之间切换的可能性;需要指定在状态切换的时候的调用。(状态是直接使用string来表示)

核心对象FMS,里面缓存了有限状态机的路由,并且能接受外部提供的Event的触发;

当Event区触发当前的有限状态机的时候,将会做状态的切换;

切换状态的时候,需要使用到 transitioner 对象;

参考实例代码:

package main

import (
    "fmt"
    "github.com/looplab/fsm"
)

// Door 门对象
type Door struct {
    To  string
    // FSM 有限状态机对象
    FSM *fsm.FSM
}

// NewDoor 新建门对象
// to 名称
func NewDoor(to string) *Door {
    d := &Door{
        To: to,
    }

    d.FSM = fsm.NewFSM(
        // 默认的状态名称
        "closed",
        fsm.Events{
            // 事件 open ,能将状态机从 closed 转换成 open 状态
            {Name: "open", Src: []string{"closed"}, Dst: "open"},
            // 事件 close ,能将状态机从 closed 转换成 open 状态
            {Name: "close", Src: []string{"open"}, Dst: "closed"},
        },
        fsm.Callbacks{
            // 给状态机注册 enter_state 回调函数
            "enter_state": func(e *fsm.Event) { d.enterState(e) },
        },
    )

    return d
}

// enterState 当进入新状态的回调
func (d *Door) enterState(e *fsm.Event) {
    fmt.Printf("The door to %s is %s\n", d.To, e.Dst)
}

func main() {
    door := NewDoor("heaven")

    // 发起 open 事件
    err := door.FSM.Event("open")
    if err != nil {
        fmt.Println(err)
    }

    // 发起 close 事件
    err = door.FSM.Event("close")
    if err != nil {
        fmt.Println(err)
    }
}

状态机本身只关心状态切换,他自己不关心这个事件生成;

参考

Golang fsm源码分析 可以理解成:某个事件(状态),由一系列其他的 事件(状态)转换而来;比如房门状态:事件名称为:开门事件,源状态:关;门只有在关闭的情况下才能转换为打开状态。在这个库文件里面,提供得有对应的代码示例;在这里,我选择其中的一个例子做个示范;在项目实践上,我们也有用到关于FSM。我的这篇文章就是对这个库文件的源码做一个分析。它定义了当前状态是如何装换的;在这个里面,最主要的是。中定义状态转换映射的缩写; 阅读详情

相关推荐

掌握Go语言中的有限状态机(FSM):fsm库深入应用

Go语言以其独特的并发模型而闻名,该模型基于goroutines和channels。goroutines是轻量级的线程,由Go运行时进行调度,channels则用于goroutines之间的通信。Go语言的并发模型为实现FSM提供了高效的并发执行环境,可以轻松地处理状态转换和事件通知。SIP(Session Initiation Protocol)是一种应用层控制协议,用于建立、修改、终止多媒体会话,如语音和视频通话。SIP是基于文本的协议,它运行在无连接的传输层协议如UDP和TCP之上。

weixin_29069575的博客 1307

有限状态机(FSM)golang的实现

有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态。当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态。任何一个FSM都可以用状态转换图来描述,图中的节点表示FSM中的一个状态,有向加权边表示输入字符时状态的变化。如果图中不存在与当前状态与输入字符对应的有向边,则FSM将进入“消亡状态(Doom State)”...

weixin_42117918的博客 4249

go-fsm:Golang的有限状态机

Golang的有限状态机(FSM) 简单版 遵循GoF状态模式: : 手工制作的FSM 基于触发器和规则(规则是map,其键为State,值是Trigger和State对的数组) 基于交换机的FSM 去做

22.有限状态机(一)go语言fsm库

有限状态机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

YouMing_Li的博客 1659

fsm:一个简单但强大的 golang FSM 库

密实度 一个简单但功能强大的 golang FSM 库。 最初开发用于 Gossip SIP 堆栈(参见的示例),但可以用于任何事情。 有关完整的包文档,请参阅。

智能家居DIY:用51单片机实现三合一环境监测(温湿度+烟雾+自动灭火)

本文详细介绍了如何利用STC89C52单片机打造智能家居三合一环境监测系统,集成温湿度检测、烟雾报警和自动灭火功能。从硬件选型、电路设计到软件编程,提供完整的DIY方案,帮助读者构建高性价比的家庭安全防护系统,特别适合智能家居爱好者和电子DIY初学者。

yhn4567890的博客 690

FSM有限状态机golang实战

FSM有限状态机 FSM:finite state machion,有限状态机。 两种实现方式: 简单switch case 适用于简单的状态机 int stateMachion(int event) { switch(curSate) { case sleeping: switch(event) { case hungary: eatIt(); curState = eating; ..

qq_40036519的博客 1455

OpenCV视频防抖算法实现与优化指南

本文详细解析了如何使用OpenCV实现视频防抖算法。通过特征点检测与光流跟踪估算帧间运动,利用滑动平均平滑运动轨迹,并应用仿射变换重塑视频帧。文章提供了完整的代码实现、参数调优指南及黑边处理等优化技巧,帮助开发者高效处理手持拍摄等场景下的视频抖动问题。

weixin_29062823的博客 339

【亲测免费】 FSM:轻量级的 Go 语言状态机解决方案

FSM:轻量级的 Go 语言状态机解决方案 在复杂的系统设计中,状态管理常常是一个挑战,尤其是在处理对象或系统的不同阶段行为时。今天,我们要向您推荐一个开源项目——FSM(有限状态机),它专为 Golang 设计,旨在简化状态逻辑的实现与维护。 项目介绍 FSM 是 Ryan Faerman 开发并维护的一个轻量级框架,用于在 Golang 应用程序中高效地实施有限状态机模型。该项目允许开发者以并...

gitblog_00020的博客 876

高通平台Android稳定性调试笔记:手把手教你用T32、Crash Utility分析Kernel Panic与RAM Dump

本文详细介绍了高通平台Android内核崩溃的分析方法,包括使用T32 Simulator和Crash Utility工具链解析Kernel Panic与RAM Dump。从环境配置、dump文件预处理到高级调试技巧,手把手教你如何定位和解决Android系统崩溃问题,特别适用于MSM/SA8155平台的开发者。

weixin_42543046的博客 525

SAP CEWB 高效批量调整工艺路线与BOM的实战指南

本文详细介绍了SAP CEWB工具在批量调整工艺路线与BOM中的高效应用。通过实战案例和操作指南,帮助制造业企业快速掌握批量修改技巧,显著提升工作效率,避免手工操作带来的错误和耗时。特别适合需要频繁更新工艺路线和BOM的企业用户。

weixin_42524708的博客 397

Go FSM源码解析:从状态机设计到并发安全的实现原理

想要在Go应用中优雅地管理复杂的状态流转吗?Go FSM(有限状态机)库提供了一个简单而强大的解决方案,帮助开发者构建可靠、可维护的状态驱动系统。这个轻量级库不仅支持同步和异步状态转换,还内置了完整的错误处理机制和并发安全保护,是现代Go应用开发中不可或缺的工具。 ## 🚀 Go FSM的核心设计理念 Go FSM的设计哲学是**简单、灵活、类型安全**。通过定义清晰的状态和事件,开发者可以

gitblog_00972的博客 446

Rockchip RK3566 Buildroot SDK构建与内核编译实战指南

嵌入式Linux开发中,交叉编译环境是系统启动的基础支撑。Buildroot作为轻量级嵌入式构建框架,通过配置驱动、自动化下载和分层编译机制,显著降低定制化Linux发行版的集成门槛。其核心价值在于将内核、根文件系统与工具链统一管理,兼顾资源约束下的确定性构建与工程可复现性。典型应用场景涵盖ARM64平台(如RK3566)的固件开发、IoT设备量产镜像生成及硬件Bring-up阶段的快速验证。本文围绕Buildroot SDK全流程实践,深入解析环境搭建、Repo源码同步、离线DL库预置及内核编译等关键环节

weixin_36047538的博客 134

FSM - 一个简单的有限状态机(Golang)

FSM - 一个简单的有限状态机(Golang) 基础介绍 FSM 是一个为 Golang 编写的简单有限状态机(Finite State Machine,FSM)。它允许您定义状态和状态之间的转换,并可以并行运行任意数量的转换检查。FSM 已经进行了测试和性能基准测试,以确保其稳定性和效率。 主要编程语言 Golang 新手常见问题及解决方案 问题一:如何初始化和设置状态机 问题描述:新手在...

gitblog_00466的博客 507

【本体】Protege高效批量导入实例(Individuals)的自动化实践

本文详细介绍了在Protege中高效批量导入实例(Individuals)的自动化实践方法。通过分析Protege本体文件结构,提供Python脚本示例,帮助用户快速处理大规模数据导入,显著提升知识图谱构建效率。特别适合需要处理数千个实例的医疗、制药等领域应用。

weixin_30275415的博客 408

用 Joule 点燃 ABAP 开发者的舞台感:SAP BTP 上的 ABAP AI 能力实战解读

摘要:SAP推出的Joule for developers和ABAP AI功能为开发者提供了智能辅助工具,旨在优化ABAP开发流程。主要功能包括上下文感知的代码预测补全、代码解释、单元测试生成和开发问题实时解答。这些能力特别适合应对Cloud环境下ABAP开发的复杂约束,如Clean Core原则和受限语法范围。通过减少重复劳动和提升代码理解效率,该工具帮助开发者将注意力集中在业务逻辑而非技术细节上。随着企业加速向S/4HANA迁移,这些AI功能将在遗留代码改造和云适配中发挥更大作用,建议团队将其纳入工程体

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 296

FSM(有限状态机)golang基本状态操作

golang中fsm(状态机)使用和简单状态转换

weixin_54433389的博客 1387

uniapp - 如何跟内嵌 web-view 组件内的网页交互,与 web-view 内嵌网页进行双向通信(uniapp 与 webview 网页之间的 “相互“ 传值)提供详细的示例代码及解决方案

uni-app如何实现在H5环境中与web-view中的网页交互通讯uniappuni-app 与 web-view内嵌网页 双向通信 如何跟内嵌web-view交互uniappAPP与webview子页面交互uniappAPP与webview子页面交互关于uni-app 使用 web-view 页面之间互相跳转、通信等问题uniapp的web-view嵌入网页,网页与uniapp通信webview如何与uniapp写的H5页面交互嵌套webview调用uniapp各种API组件实现H5和app通讯和交互

✅ 精选推荐文章 1万+

【亲测免费】 推荐开源项目:FSM —— 轻量级Go语言有限状态机

推荐开源项目:FSM —— 轻量级Go语言有限状态机 1、项目介绍 FSM是一个为Golang开发的轻量级有限状态机库,它支持并行运行任意数量的状态转换检查。该项目不仅经过了全面的测试,还进行了性能基准测试,确保在处理复杂业务逻辑时能够高效运行。 2、项目技术分析 FSM遵循Golang的设计哲学,提供了一个简单易用的接口。通过实现fsm.Stater接口,你可以轻松地将任何结构体转化为可管理的状...

gitblog_00017的博客 943

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

推荐一款强大的Go语言有限状态机库:FSM

在软件设计中,有限状态机(Finite State Machine, FSM)是一种用于建模计算过程的数学模型,它能够帮助我们清晰地定义和管理对象的状态变化。今天,我想要向你推荐一个出色的Go语言实现的FSM库——[FSM by looplab](https://github.com/looplab/fsm),这是一款高效且易用的工具,可以为你的项目带来极大的便利。 ## 1. 项目介绍 FS...

gitblog_00007的博客 703

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

go - FSM(有限状态机)初体验

FSM有限状态机 /** * @Author: wsp * @Time : 2018/4/11 16:45 * @Description: */ package fsmStrudy import ( "fmt" "github.com/looplab/fsm" ) type Door struct { To strin...

andiaoqiong6043的博客 628

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

「GoCN酷Go推荐」有限状态机库 fsm

01前言开发中,我们经常会遇到这种情况,服务模块有多种状态,它们有一定的顺序,先后执行,逐步切换。这时,fsm这个库可以帮助我们更好的管理多个状态。fsm库,它主要基于两个FSM实现,增加了golang版本的实现:Javascript Finite State Machine, https://github.com/jakesgordon/javascript-state...

Go中国 1955

Go FSM回调系统深度剖析:从入门到精通的状态管理

Go FSM(Finite State Machine for Go)是一个轻量级的状态管理库,专为Go语言设计,通过回调系统实现状态转换的精确控制。本文将带您全面了解Go FSM回调系统的核心机制、使用方法和最佳实践,帮助您构建可靠的状态管理逻辑。 ## 一、什么是FSM回调系统? FSM回调系统是Go FSM库的核心特性,它允许开发者在状态转换的关键节点插入自定义逻辑。通过回调函数,您可以

gitblog_00780的博客 376

Go fsm

package fsm import ( "log" ) type EvtIf interface { GetEvtType() string } type Action interface { //doAction(evt EvtIf, srcState *State, dstState *State) doAction(evt ...

weixin_30480583的博客 83

Go语言 有限状态机FSM

有限状态机又简称FSM(Finite-State Machine的首字母缩写)。这个在离散数学里学过了,它是计算机领域中被广泛使用的数学概念。是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。编译原理学得好的童鞋应该对FSM不陌生,因为编译器就用了FMS来做词法扫描时的状态转移。 FSM的概念在网上一搜可以搜一大堆出来,但估计您也看不大明白。本文将以不一样的方式来讲述FSM的概

Sunface撩技术 5777
上一篇: golang http post 实验
下一篇: go[2]-数据结构
erlang_hell
博客等级 码龄14年 57粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值