V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
uniy
V2EX  ›  Go 编程语言

难道 Go 就没有好用的工作审批流框架吗

  •  
  •   uniy · 10 天前 · 3156 次点击
    47 条回复    2024-04-28 16:20:54 +08:00
    wujianhua22
        1
    wujianhua22  
       10 天前   ❤️ 1
    你可以使用这个库来自定义 https://github.com/ShiningRush/fastflow
    brom111
        2
    brom111  
       10 天前
    等 op 写一个(
    mshadow
        3
    mshadow  
       10 天前 via Android
    国内的话直接对接办公 IM 的审批流吧,企微飞书钉钉都有现成的。
    aababc
        4
    aababc  
       10 天前
    goer: 我们只用标准库
    lujiaxing
        5
    lujiaxing  
       10 天前 via Android   ❤️ 2
    说了一百遍了。。。Golang 不适合做复杂的业务流程。这东西设计出来是用来做一些基础设施方面的东西的。Golang 拿来做一些 tooling 或者 CPU 密集型的模块挺好的,但是拿来做 OA ERP WMS 这类极端复杂的业务系统就是给自己找不痛快。。。
    coolair
        6
    coolair  
       10 天前   ❤️ 1
    @wujianhua22 #1 楼主要的是类似 flowable 和 activiti 的东西。

    我自己写了个简单的基于 Django 的工作审批流模块,支持普通业务流程、各种网关,回退、撤回等操作,有空用 Go 重写一遍开源出来。
    TheWalkingDead
        7
    TheWalkingDead  
       10 天前
    写这个用 java 都比用 go 好
    456vv
        8
    456vv  
       10 天前
    来钱可以给你写一个,否则你自己写。
    abccccabc
        9
    abccccabc  
       10 天前
    go-flowwork ,没记错的话,这个应该够用了
    FightPig
        10
    FightPig  
       10 天前
    好像是真没看到
    uniy
        11
    uniy  
    OP
       9 天前
    @abccccabc 多年未更新了 🥲
    uniy
        12
    uniy  
    OP
       9 天前
    @coolair 对,类似开源模块,多是 java 写的
    dayeye2006199
        13
    dayeye2006199  
       9 天前 via Android
    感觉拿 go 搞这块的人太少,类似“为啥 haskell 没有一个工作审批流的库” 差不多
    zzhaolei
        14
    zzhaolei  
       9 天前
    @lujiaxing 也没有什么适合不适合吧,就是用它写的人少而已。为什么用它写会是给自己找不痛快,因为相关的生态少吗?
    bukekangli
        15
    bukekangli  
       9 天前
    可以看下 Temporal ,https://temporal.io/
    CloveAndCurrant
        16
    CloveAndCurrant  
       9 天前   ❤️ 1
    @lujiaxing 像个梗小鬼一样,动不动说一些人云亦云的话。有啥不合适的?
    Ayanokouji
        17
    Ayanokouji  
       9 天前
    zeebe + go-client ?
    xiaocaiji111
        18
    xiaocaiji111  
       9 天前
    其实没有不合适,就是生态需要建设,用 go 写了两个项目,合理规划很多地方比 java 方便太多太多。也轻便太多。线上项目基本没有再出现过空指针异常
    masterclock
        19
    masterclock  
       9 天前
    temporal, workflow as code 好用得很
    dapr 也刚刚支持 workflow
    需要 dsl 的可以用 serverlessworkflow 标准,用 temporal 做运行时
    gvison
        20
    gvison  
       9 天前
    https://github.com/wegoteam/weflow 它借鉴了 activiti 和钉钉的设计理念
    uniy
        21
    uniy  
    OP
       9 天前
    @masterclock temporal 看起来不错,但是资料好少,我去研究研究,不知道兼不兼容 bpmnjs
    uniy
        22
    uniy  
    OP
       9 天前
    @gvison 了解一下
    flyqie
        23
    flyqie  
       9 天前 via Android
    @lujiaxing #5

    从其他语言转,被泛型和 err 哲学折磨疯了?
    lujiaxing
        24
    lujiaxing  
       9 天前   ❤️ 1
    @CloveAndCurrant 泛型就不说了, 没有也不是不能写业务. 就说这个错误处理模式怎么搞业务? 所有的地方一层一层的 catch, 这种在一些基础设施软件上没多大问题, 本来跟具体执行有关的调用链就很短. 但是涉及到业务逻辑的时候, 业务逻辑的逻辑分支, 数据组合, 数据操作极其复杂, 一个 entrypoint 下去三四十个逻辑分支司空见惯. 其他语言可以直接在某个分支 throw 然后直接终止调用链. 然后怎么做都简单的很. go 就只能一层一层的来. 而且还有 panic 炸进程的问题. 大哥, Error 跟 Exception 不是一个概念 OK 好不好?

    还有 golang 的这个缺少抽象能力的情况, 写点算法之类的还行, 写业务? 现实世界的业务逻辑一层包一层, 你看下 Springboot 的源码就能理解了. 缺少 IoC, 而且这个开发语言的表达能力也不太好. 比如我在 Javascript 里可以:
    [5,6,7...[1,2,3,4]], 我知道有 append 函数, 但是远不如直接拼接方便.

    而且对数据的处理也远比 go 简单, 筛选, 映射, 合并都是一句话的事儿.
    [1,2,3,4,5,6,7,8,9].filter(a=> a <= 5).map(a => ({value: a})).reduce((a, b)=> ({value: a.value + b.value}))

    阶乘:
    const factorial = (val) => [...Array(val).keys()].map(i => i + 1).reduce((a, b)=> a * b)

    在 golang 下就要这样写:

    import (
    "fmt"
    "math/big"
    )

    func factorial(x *big.Int) *big.Int {
    n := big.NewInt(1)
    if x.Cmp(big.NewInt(0)) == 0 {
    return n
    }
    return n.Mul(x, factorial(n.Sub(x, n)))
    }

    再比如说:

    class Person
    {
    头;
    脖子;
    躯干;
    四肢;
    鸟;
    指甲盖;
    常见动作;
    }

    class Nigger : Person
    {
    override 头: 卷曲的头发下面漆黑的脸,
    override 脖子: 黑的,
    override 躯干: 黑的,
    override 四肢: 黑的
    }

    golang 就没法实现这种效果. 这在处理一些 "相似但不相同" 的业务逻辑时候就很头疼.

    所以说 golang 这东西从头到尾都是用来替代 C/C++ 来完成一些没有复杂业务逻辑但是涉及大量运算跟内存数据处理的基础组件, 比如 k8s, 比如 nginx 也可以用 go 来做 (e.g Kong) 但是业务往往不涉及到这么多算法跟数据处理, 取而代之的是需要对来自四面八方的业务数据进行判定, 决策, 筛选, 解散, 组合, 转化... go 这种缺少抽象语法过于简陋的语言处理来完成类似楼主说的 Workflow 这种东西 (涉及到 Workflow 基本都是 OA 或者类 OA 系统没跑了) 本身就逻辑极其复杂, 用 go 写纯粹是给自己找不痛快.
    lujiaxing
        25
    lujiaxing  
       9 天前
    @CloveAndCurrant 而且 golang 的生态跟 .net 一样贫瘠.
    DefoliationM
        26
    DefoliationM  
       9 天前 via Android
    为什么楼上觉得 k8s 不复杂,我看着就头疼,又能创建自己 resource ,又能自己实现 controller ,又能自定义容器运行时,自定义 load balancer 还能实现类似 bgp 的功能。。。。
    FrankAdler
        27
    FrankAdler  
       9 天前
    同样在找,从零开发太费时间了
    lujiaxing
        28
    lujiaxing  
       9 天前
    @DefoliationM 因为这些都只是实现一些策略或者算法. 我不是说算法本身不复杂, 逻辑复杂跟算法复杂不是一个概念. 就跟 "里德-所罗门纠错算法确实复杂, 中国大陆的医保结算逻辑也很复杂" 一样. 都复杂但这不是同一个复杂法. 适用的编程语言也就不一样.
    lqm
        29
    lqm  
       8 天前
    @lujiaxing 首先 go 有泛型
    gerefoxing
        30
    gerefoxing  
       8 天前
    没有的
    VVVYGD
        31
    VVVYGD  
       8 天前
    好多年前写的,不过有点庞大,参考下,基于 fsm 状态机实现的。https://github.com/yametech/echoer
    CloveAndCurrant
        32
    CloveAndCurrant  
       8 天前
    @lujiaxing 你举得例子,站在你的立场上,你可以说他难用,丑陋,缺少语法糖,但是实际你用 go 写业务逻辑,这写影响没那么大。影响一个语言能不能写业务其实就是生态。go 发展那么多年,生态一直在丰富,不像很多语言停止不前,当然依然不能和 java 这种生态建设更长久的语言比,毕竟年龄摆在那儿。如果 java 和 go 互换,我相信你们这群人依然会大声疾呼:“说了一百遍了。。。Java 不适合做复杂的业务流程”
    lujiaxing
        33
    lujiaxing  
       8 天前
    @CloveAndCurrant 那是啊, 我不关心你这个语言叫 go 还是叫 java, 是余胜军发明的还是 google 发明的. 对于一线开发来说能以最快的速度完成功能开发上线, 开发效率高才是最要紧的. go 这个玩意本身其设计初衷是用来替代 C/C++, 而不是 Java / C#. 你怎么不用 C++ 写 ERP 呢? 那你为什么要用 Go 来写呢? 这俩是同一个生态位的东西. 我知道只要是图灵完备的编程语言理论上没有什么业务是写不了的. C++ 都可以通过 CGI 来开发 Web 项目更别提 Go 了. 但是现实世界你看谁用 C++ 写 Web 呢? 这不一个道理?

    如果只是追求 go 因朴素而带来的规范性, 其实你用 .NET Core 然后把 C# 语法版本降低成 C# 2.0 (2005 年版) 也是一样的. 或者你把 JS 语法限制为 ECMAScript 4.0 然后用 Node 写业务差不多. 但这不纯粹找虐么?
    CloveAndCurrant
        34
    CloveAndCurrant  
       8 天前
    但是 go 开发效率很高,最起码只会比 Java 强,不会弱于 Java 。你到底用没用过 go ? go 生态不如 Java ,不等于现在 go 生态不行,开发业务绰绰有余。任何语言都是工具,你老是带着偏见看一个工具干什么?你有能力把 go 从地球上抹除?
    bill110100
        35
    bill110100  
       8 天前
    @CloveAndCurrant go 开发效率高?微服务可能还凑合,到了 oa 系统,绝没有 java 效率高。不是代码写得简单就效率高了。oa erp 各种复杂的业务特性,耦合,各种面对实际需求的改造,go 也就编码时快一点,到了后期维护,各种改不动。
    CloveAndCurrant
        36
    CloveAndCurrant  
       8 天前
    @bill110100 好吧,你说是那就是。建议用 Python 或 PHP ,Java 比这两个是个 jb 啊? Python 还有杀手锏应用 odoo 。
    bill110100
        37
    bill110100  
       8 天前
    @CloveAndCurrant 做 oa ,erp 的,java 就是比别的强,至少银行保险业这类的大厂商没几个敢用 python 和 PHP 的,清一色 java 。就一条,能经得起人员和代码的迭代和替换,php ,python 的代码,就是原始开发者几年后也不愿意改了。
    wssy001
        38
    wssy001  
       8 天前
    @CloveAndCurrant Go 开发效率比 Java 高?恕我不敢苟同 举个最简单的例子 用户登录 你可千万别觉得用户登录只需要写条 SQL 判断用户名和密码是否对得上。用 Go 写可能需要码 300 行,而用 Java 写,只需要 100 行,剩下 200 行代码别人帮你写好了
    CloveAndCurrant
        39
    CloveAndCurrant  
       8 天前
    @wssy001 认同你,你马上说 go 需要 1 万行,Java 一行不写,我也认同你🤣🤣🤣
    mightybruce
        40
    mightybruce  
       8 天前
    你先把什么样的工作流说清楚再说, 要什么样的效果。
    mightybruce
        41
    mightybruce  
       8 天前
    业务开发如果公司是基于 go 的话,那么还是自研这些业务工作流, 这个不像 java 都是搞业务开发的多

    运维开发的工作流就是完全基于 go 的。
    uniy
        42
    uniy  
    OP
       7 天前
    感谢各位老兄,好像有点跑题了,😄😄,我只是想找一个能够支持审批的工作流,支持 bpmnjs 可视化的这种,比如,请假审批,订单审批等。
    349865361
        43
    349865361  
       7 天前
    @lujiaxing 你说的这些不如用 rust 了? 在 rust 区问同样的问题 答复说 rust 不适合做复杂的业务流程 要用 go 合适
    349865361
        44
    349865361  
       7 天前
    @bill110100 谁说的 java 被银行保险用只是因为编译后不容易被篡改还 你说的这些 php python 哪个语言没有 而且基本上知识外行认知问题
    Createsequence
        45
    Createsequence  
       6 天前
    hhhh 虽然楼主问的是 go ,但是我没点进来就知道里面肯定要有好多楼会围着 java 展开
    lujiaxing
        46
    lujiaxing  
       5 天前
    @349865361 rust go c++ 是同一个生态位的语言, 都不适合做业务层的东西. 当然, 我不是说不能做. 但是开发效率, 稳定性会受很大影响.
    xsen
        47
    xsen  
       5 天前
    https://github.com/go-workflow/go-workflow.git

    这个可以用,只是没维护了。我们就是基于这个做了些调整
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2364 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:09 · PVG 23:09 · LAX 08:09 · JFK 11:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.