laravel 转 golang 最佳实践是?

2020-04-14 10:40:37 +08:00
 skyworker
各位大神, 目前我司的后台系统是 php 的 laravel 框架, 目前体验非常好, 本来没必要换 golang, 不过有如下痛点, golang 能解决:

1. 我司的产品是私有化部署给客户的, PHP 由于是动态语言, 天生加密性不好

2. PHP 作为 web 语言目前在企业端口碑没有 JAVA 之类的"企业级"名声好听(很多客户反馈,PHP 不是做网站的, 还能做系统?), 这个其实无所谓的,希望不要拿这一点批判我...

2. golang 所谓的"高并发"对我们目前的项目而言, 意义不大. 16GB 内存的服务器, 一天的 PV 可能不超过 100. 主要是数据结构复杂和业务逻辑复杂.

大致看了 golang 的一些 web 框架(主要是 ORM),发现一些问题:

1. 毕竟是强类型语言, 在定义 model 的时候, 还要定义类型, 略微麻烦. 在 laravel 的项目中, 因为是弱类型, 所以客户在系统中可以自定义新字段, 直接 post 到后台, laravel 就能直接保存了, 例如:

POST 内容:

{
"name": "tom",
"age": 12,
"content": "1111"
}

在 laravel 中, 只需:

$data = $request->all();
$user = new User($data);
$user->save();

在 golang 的 ORM 中, 好像没有这么简单(实际案例中, POST 字段可能有 30 多个), 一个一个字段设置, 麻烦.

2. 在 laravel 中,为了便于扩展, model 有很多 json 类型的数据(mysql 支持 json 类型字段), 例如 user.extra 是 json 类型. 只需要在 larave 的 model 中设定:

protected $casts = [
'extra' => 'array',
];

在 CRUD 的时候, 都可以自动将 输入 /输出 信息,保存为 json 字符串 /或者 php arrray 类型. golang 现有的 orm 好像都不支持.


3. 其他的小功能. 例如我们的系统中, 需要将每个 model 被修改的内容记录下(例如, update 的时候, 知道哪些字段被修改了), 例如 user 的 name 被从'tom', 修改成了 'joe', 在 laravel 中, 只需要:

$newData = ['name' => 'joe'];
$user->update($newData );

//修改内容

$change = $user->getDirty();

['name']

$orign = $user->getOriginal('name') // tom

在 golang 的 ORM 中, 类似功能也是没有的.


举了几个小例子, 感觉 golang 的相关 tools 中,至少 orm 这块内容, 相对于 laravel 来说, 还是不完善的. 基础的 CRUD 肯定没问题, 不过相对于 laravel 的 orm 来说, 就有点 奔驰 换 桑塔纳 的感觉了.
6991 次点击
所在节点    Go 编程语言
60 条回复
zjsxwc
2020-04-14 12:17:20 +08:00
@skyworker
找几个核心代码转 zephir 就行,没必要全部变 zephir
nonfu
2020-04-14 12:17:44 +08:00
@ArJun 我不是转 go,是觉得微服务场景 go 更合适,在不想引入 Java 技术栈的情况下。每个语言都有其适用场景
JohnSmith
2020-04-14 12:35:03 +08:00
找有经验的 golang 大牛带队
noobsheldon
2020-04-14 13:04:22 +08:00
霸天虎变形就行了 /doge
loading
2020-04-14 13:30:22 +08:00
goframe,了解一下。
buffzty
2020-04-14 13:46:41 +08:00
我也是尝试用 go 写 api. 总体来说,没有泛型很难受. 其他的还好.
安全性变高,灵活度变低,复杂度变高
1:
```go
d := &AddUserData{}
if err := c.ShouldBindJSON(d); err != nil {
app.ValidError(err)
return
}
user := &models.User{
Account: d.Account,
Gender: d.Gender,
Name: d.Name,
Age: d.Age,
Level: d.Level,
}
if err := models.Add(user); err != nil {
app.ErrorMsg(err.Error())
return
}
app.Success()
```
2:
json 注解中加入 sql:"TYPE:json"
类型是先 Value 和 Scan 接口
3:
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18,})

db.Model(&user).Updates(User{Name: "hello", Age: 18})
skyworker
2020-04-14 13:50:15 +08:00
@buffzty 原来用 laravel 10 行代码搞定的, 用 go 的话, 估计要 100 行也不止
tairan2006
2020-04-14 13:50:34 +08:00
你这不如转 Java,go 写 curd 没啥优势的
lvsemi1
2020-04-14 13:57:05 +08:00
你的这些需求 go 并没有解决啊
那既然大家都是高仿,不妨试试 goby on grails
ben1024
2020-04-14 14:02:35 +08:00
一些 socket 服务用 go,其他业务用 PHP 一起使用不影响
gochat
2020-04-14 14:05:54 +08:00
只想说一句:动态一时爽,重构火葬场,你说的那些优势某种意义上来说就是劣势,系统最终只会变的更糟,最终不可维护。
charlie21
2020-04-14 14:10:12 +08:00
laravel 转 golang ...
Rekkles
2020-04-14 14:19:00 +08:00
等于是好好的现代化工厂不要,非要自己组装个小厂开始造车。
skyworker
2020-04-14 14:25:14 +08:00
@tairan2006 java 的啰嗦实在恶心, 不打算用 java
buffzty
2020-04-14 14:28:21 +08:00
@skyworker 不至于.我觉得 go 多了百分之二十代码左右 这百分之 20 都是为了 orm 获取列表 写接口写的.等泛型有了 我觉得基本没什么差距了,或者 go 的代码更少些
tairan2006
2020-04-14 15:00:33 +08:00
@skyworker 代码量差不多…go 没有 oop/泛型,有时候抽象业务代码有点麻烦,等 go2 出来倒是可以考虑。

直接上 Java11 的话,代码量应该比 go 还少一点。go 的优势在无痛并发上,你们用不上的话,没必要上。
yanzixuan
2020-04-14 15:10:09 +08:00
@skyworker 我去,程序员这么不值钱么。按下按钮也不止一块吧。。。
skyworker
2020-04-14 15:27:33 +08:00
@yanzixuan 一块钱是夸张的说法, 他们是按文件数量收费的. 你传一个 200 个 php 的压缩包, 人家收 200 块钱这样子. PHP 解密有专门的工具, 文件夹丢进去,就全部解密了
skyworker
2020-04-14 15:28:59 +08:00
讨论到这里, 看来转 go 没啥意义了, go 的唯一的优势 和 带来的缺点比, 不算什么
buffzty
2020-04-14 16:17:47 +08:00
为什么要转 go 啊, 哪个程序员不会几个语言啊 一起写不就行了吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662203

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX