@
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 写纯粹是给自己找不痛快.