我是从 PHP 转 Go 的,用 PHP 时是用 Laravel 框架写的 web 程序,且极度依赖 Laravel ;转了 Go ,用 Gin 框架 写 web 程序。
目前体验下来,感觉比较烦躁,一个模块至少要有 3 个近乎一样的结构体:HTTP 请求创建 /更新用的、HTTP 响应用的、Gorm 用的。
PHP 是弱类型语言,Go 是强类型语言且啰嗦,确实不能用相同的思维设计程序。
但有没有什么方法或工具能优化其开发体验?以及有没有优秀的 Go Web 程序设计模式可以参考下?
1
rekulas 2021-12-13 20:58:16 +08:00
这样才够规范,强类型语言确实会预定义很多类型,写的时候感觉麻烦点但是可读性可维护性都优于 php python 的万能结构,我也是写 php 转的,不过之前也写过 c Java ,在编译语言中对比起来感觉 go 真的足够简洁了,你应该转变下自己的思维,不能想同时要 go 的强大和 php 的灵活
另外你说的近乎一样的机构体不清楚你是怎么规划的,如果遇到接近的我一般倾向于复用,最好能展示下示例代码 |
2
liuxu 2021-12-13 21:08:16 +08:00
其实你可以用强类型写 php 适应一下再去写 go /doge
|
3
weirdo 2021-12-13 21:19:15 +08:00
gin 请求用的结构体 可以对应一下 laravel 里的 各种 request 类 里的 验证
gin 响应用的结构体 可以对应一下 laravel 里的 各种 api resource gorm 用的结构体 就可以当成 laravel 里限定了 hidden / fillable 的 eloquent model laravel 写严格点的话,个人感觉和 gin 没啥大的区别 |
4
JohnH 2021-12-13 21:19:17 +08:00
那就试试 goframe
|
5
rccoder 2021-12-13 21:26:00 +08:00
试试 copilot 这个 vscode 插件
|
6
bghtyu 2021-12-13 21:46:12 +08:00 via Android 2
可以试试 Java ,再用 go ,就不觉得啰嗦了 /doge
|
9
FrankFang128 2021-12-13 21:54:54 +08:00
看我的 go 直播咯,周一到周五每晚十点: http://live.bilibili.com/8989585
|
10
imkerberos 2021-12-13 22:18:11 +08:00 1
用 go 写一个 exec 函数调用 .NetCore 写的服务.
|
11
chaodada 2021-12-13 22:20:52 +08:00
习惯就好了 ,我最近在拿 Laravel 的程序改到 go 。很爽啊
|
12
chaodada 2021-12-13 22:21:22 +08:00
写习惯了之后 在写 php 感觉都变规范了 哈哈哈哈
|
13
kwanzaa 2021-12-13 23:02:46 +08:00
听着就很有问题,怎么写这么多 struct 。
|
14
Buges 2021-12-13 23:08:33 +08:00 via Android
@imkerberos dotnet+f#确实还挺优雅,可惜是二等公民。
|
15
Kylin30 2021-12-14 00:25:38 +08:00 5
换成 C#
|
16
cxsz 2021-12-14 00:43:22 +08:00
Java 也很啰嗦,每层分开,controller ,service ,dao ,mapper ,然后每个响应接收再建一个类来处理,复杂返回的还要多个整合一下,也是写一堆重复的
|
17
yazinnnn 2021-12-14 08:53:20 +08:00
优雅同熟悉正交。
—Rich Hickey go 怎么看也不像是一个能优雅起来的语言 |
18
alexkkaa 2021-12-14 09:17:41 +08:00 via Android
输入优雅就不要用静态语言。不过 c#也慢慢越来越像动态语言了
|
19
WytheHuang 2021-12-14 09:26:32 +08:00
慢慢习惯吧
|
20
abigeater 2021-12-14 09:29:28 +08:00
同 PHP 用 Gin 写有一样的感觉 (然后就想自己封装 但对 Go 还不太熟练有些地方串不起来
打算用 go-zero 试写一下 |
21
zoharSoul 2021-12-14 10:48:20 +08:00
你都用 go 了, 就别讲究优雅了.
干就完事了 |
23
linshenqi 2021-12-14 10:51:39 +08:00
我们自研框架
|
24
eurry 2021-12-14 11:07:11 +08:00
用 Go 写了几个项目觉得体验不太好,适合写一些小工具,业务逻辑复杂的就算了太痛苦
|
25
qq976739120 2021-12-14 11:08:09 +08:00
用 go 写..真的就是刀耕火种
|
26
stach 2021-12-14 11:10:24 +08:00
go 开发 web 项目是无法和 php 比优雅的,放弃吧兄弟。
|
27
lasuar 2021-12-14 11:33:13 +08:00
标准项目中 req & rsp 必须要单独定义,如果一定要复用 struct ,可以通过匿名字段。rpc 项目中是没法复用的。
|
28
hwef 2021-12-14 12:04:23 +08:00
|
30
zjsxwc 2021-12-14 12:08:00 +08:00
不是你的错觉,而是不管什么语言过来的,
用 Go 都会觉得啰嗦 |
31
dallaslu 2021-12-14 12:17:22 +08:00
Go 输出 JSON 的大小写问题没有劝退你吗
|
32
Joker123456789 2021-12-14 12:18:16 +08:00
很好奇,php 如果要返回 json ,不需要实体吗? 将参数传给 service 不需要先封装到实体里面吗?
如果你在 php 里用的是 map ,那当我没说。 |
33
ZeroDu 2021-12-14 13:26:13 +08:00
接口的返回、请求参数。对应的实体是应该分开的。不然瞎写谁受得了。还是说只接 req 里面 getParm 连封装都没有吗?
|
34
ccppgo 2021-12-14 13:58:44 +08:00
@Joker123456789 php 叫数组, 不是 map, 面向数组编程
|
35
LoNeFong 2021-12-14 14:07:23 +08:00 1
只要一提语言你们就争论个不停, 有趣
|
36
SleipniR 2021-12-14 14:21:24 +08:00
先试试用 c 写,就不会觉得 go 啰嗦了。。
|
37
Yoock 2021-12-14 14:26:29 +08:00
自己封装一下,或者等我出一个最佳实践 (doge
|
38
brader 2021-12-14 14:32:21 +08:00
@Joker123456789 不需要,PHP 这点还是非常牛的,比如:`echo json_encode($array)`,我们根本不关心$array 里面有哪些字段,要不要预定义。
|
39
Joker123456789 2021-12-14 14:49:46 +08:00 1
@brader 这种写法 任何语言都支持,go 可以用 map ,java 也可以,c#也可以。 只是维护起来 要把人搞死,所以没人用。
相反,你在 php 里用实体 也是可以的,只是 php 基本上面向快速建站,所以很多为了后期维护而存在的规范,在 php 里都基本上不被重视。 |
40
brader 2021-12-14 15:06:03 +08:00
@Joker123456789 不同的,PHP 也可以显式赋值定义出另一个数组来,但是和你说的其他语言的代码写法,你写一个比对就知道了,即使 PHP 显式赋值出来,代码的简洁性还是比其他语言好
|
41
Joker123456789 2021-12-14 15:14:35 +08:00
java:
public class Demo { public int id; public String name; } go: type Demo struct { id int, name string } php: class NewsMapper { public $id=0; public $name=""; } 请问 更方便在哪??? 你说 php 更方便,应该是说的这种把? $news=new NewsMapper(); $news->name=”xxx”; $news->id=xxx; 但是这跟 map 有啥区别? go: news := make(map[string]string) news["id"] = 0; news["name"] = "xxx"; java, c# 我就不写了。。。 都差不多。 |
42
Chad0000 2021-12-14 15:16:02 +08:00 via iPhone
@imkerberos #10 没毛病,而且还可以继续对外声称使用 go 。
|
43
userforg2021 2021-12-14 15:37:29 +08:00
不考虑修改的话,C#可以使用匿名类型
var news = new { id = xxx, name = "xxx", }; |
44
mainjzb 2021-12-14 15:41:30 +08:00
大多数人根本没写过 C C++ rust 理解不了 go 的优雅。。
不过 error 确实 sb 写起来很啰嗦 |
45
Valid 2021-12-14 15:48:46 +08:00
语言的本质都一样,哪个开发效率高,哪个轮子多用哪个。
|
46
liuhuansir 2021-12-14 15:54:19 +08:00
@cxsz 这是 MVC 的规范吧,跟 Java 有啥关系?你直接在 servlet 里写 SQL 也能实现功能,Java 的啰嗦又不是指这方面
|
48
MidGap 2021-12-14 16:31:36 +08:00
Go 写原生 sql 就可以省一个结构体了(狗头
|
49
openp2p 2021-12-14 16:33:01 +08:00
众所周知,php 是全世界最好的语言。我好奇为啥楼主弃明投暗搞 go 呢?
|
51
yazinnnn 2021-12-14 16:46:53 +08:00
中国人学啥都没救
|
52
lizuoqiang 2021-12-14 17:02:01 +08:00
|
53
lizuoqiang 2021-12-14 17:02:47 +08:00
@Joker123456789
echo json_encode(['id' => 0, 'name' => "xxx"]); |
54
rophie123 2021-12-14 17:07:22 +08:00 via iPhone
说说我吧,之前写 php 的,有段时间混合 go ,后来纯 go ,现在能 php 就不会用其他的。重要的是做出来先不考虑多优雅,过度设计,挣到钱才是王道,btw 我不上班
|
55
Joker123456789 2021-12-14 17:10:51 +08:00
|
56
virgil1988 2021-12-14 17:12:54 +08:00 via iPhone
比 go 还啰嗦的语言确实不多,但是 go 的好处是没那么多花活儿所以比较好读。
|
57
lizuoqiang 2021-12-14 17:16:56 +08:00 2
@Joker123456789 我发现你是个杠精,不会 php 就别乱说。
echo json_encode(compact('id', 'name')); 变量动态了不? |
58
Joker123456789 2021-12-14 17:21:20 +08:00
@lizuoqiang 你完整的写下来,我看看。 你最后发的这个例子,没有赋值的步骤。
|
59
Joker123456789 2021-12-14 17:24:27 +08:00
@lizuoqiang 还有,不要开口闭口就杠精,不想争论就别说话。 想争论 就好好争论。 你最后发的这个例子就是没头没尾。 连赋值都没了
|
60
Joker123456789 2021-12-14 17:26:15 +08:00
@lizuoqiang 简单点。
数据库是这样的: id name 1 zhangsan 2 lisi 3 wangwu 你用你引以为傲的 php ,写个例子出来,把这个数据 查询到一个变量里,然后转成 json 返回给前端。 你写一个,我也写一个,我用 map ,你用你引以为傲的 php ,最后对比下 差异有多大,可以吗??? |
61
lizuoqiang 2021-12-14 17:30:24 +08:00
@Joker123456789
$input = file_get_contents('https://tool.bitefu.net/jiari/?d=2021-12-14&info=1'); $arr = json_decode($input, true); echo json_encode($arr, 256); $input 可以是任何 io 资源的返回 你看的明白不? |
62
Joker123456789 2021-12-14 17:33:31 +08:00
真是重复啰嗦,先解码成 json ,再转成 json 字符串。
你看看 java 怎么做的。 Map input = selectOne(); return JSONUtil.toJSONString(input); 而且你的这个例子 并没有 展现出,你刚才说的那种语法 |
63
Joker123456789 2021-12-14 17:34:55 +08:00
@lizuoqiang 还有,麻烦你 把我的帖子全部看完整,我一直都是在 跟另一个人说话,告诉他 语言之间没有什么大的差异,基本上都能做到。
是你一直在跟我杠,非要说 php 简单吧?? 我是真的 明白了,为什么会有 “php 是世界上最好的语言” 这句调侃了 |
64
Joker123456789 2021-12-14 17:36:27 +08:00
@lizuoqiang 还有,任意 IO 资源,java 不可以吗? 还重点说明一下。真是服了。
|
65
lizuoqiang 2021-12-14 17:38:28 +08:00
@Joker123456789
杠精你好 这个就是查库返回 json $data = Content::query()->select(['id', 'title'])->limit(3)->get(); echo json_encode($data, JSON_UNESCAPED_UNICODE); |
66
lizuoqiang 2021-12-14 17:39:52 +08:00
|
67
lizuoqiang 2021-12-14 17:42:03 +08:00
|
68
Joker123456789 2021-12-14 17:42:33 +08:00
不就是一个 sql 吗??
Map data = selectOne("select id, title limit 3") JSONUtil.toJSONString(input); 我是用 sql 写的,代码量就跟你不相上下了,甚至还少一些。 java 也有框架可以实现这种写法,我只是懒得去给你找了。 |
69
Joker123456789 2021-12-14 17:43:52 +08:00
@lizuoqiang 我们一直在比较 代码量 的差异,方便性把?? 跟我会不会 php 有什么关系??
我能用跟你差不多的代码量 实现跟你一样的 效果,不就可以证明 我的观点了?? 非要会 php 干嘛??? 你这逻辑有点感人啊 |
70
lizuoqiang 2021-12-14 17:44:26 +08:00
|
71
Joker123456789 2021-12-14 17:45:37 +08:00
@lizuoqiang 别说服不了我,就气急败坏的骂人。 不想争论可以滚蛋,别来网上撒泼。
|
72
Joker123456789 2021-12-14 17:47:36 +08:00
|
73
Joker123456789 2021-12-14 17:50:35 +08:00
|
74
lizuoqiang 2021-12-14 17:50:48 +08:00
|
75
Joker123456789 2021-12-14 17:53:00 +08:00
|
76
monkeyWie 2021-12-14 17:53:16 +08:00 1
有一说一我没用过 php ,感觉 php 就这个箭头符合敲代码效率就慢了一半
|
77
Rache1 2021-12-14 18:02:24 +08:00
@lizuoqiang 这里你可以 get() 后直接 toJson(JSON_UNESCAPED_UNICODE) 😆
|
78
TypeError 2021-12-14 18:09:29 +08:00
python 转 go ,多写几个 struct 倒不是痛点,很多可以生成
企业微服务开发,grpc+grpc-gateway 反而很爽,http 请求响应也用 protobuf 约束上了,减少字段类型之类的错误、自动生成 swagger 接口文档 个人项目继续用 python ,语法舒服 |
79
yrj 2021-12-14 18:25:13 +08:00 via iPad
没太理解,一样的结构体不是可以复用嘛,为什么要定义三个,如果有细微不同,可以继承一下呀
|
81
james122333 2021-12-14 19:01:02 +08:00
@Joker123456789
php 数组很方便没错 $a = [ "abc" => 123, "bcd" => [ "a", "b", "c" ], "cde" => [ abc:class => 123 ] ]; 优点写的快结构清晰还可以无脑当设定使用 然后查一下 https://stackoverflow.com/questions/9803317/multilevel-associative-array-in-java-like-php |
82
james122333 2021-12-14 19:02:02 +08:00
果然我不太会发程序码
|
83
james122333 2021-12-14 19:08:19 +08:00
abc::class
|
84
wonderfulcxm 2021-12-14 19:15:42 +08:00 via iPhone
该来的还是来了,楼上几位已经吵起来了,热度不减当年,我就说 PHP 是最好的语言,谁支持,谁反对?
|
85
sciel 2021-12-14 19:22:22 +08:00
goframe ,用了就停不下来了。 https://goframe.org/display/gf
|
86
wonderfulcxm 2021-12-14 19:24:20 +08:00 via iPhone
很多人不知道为什么 PHP 变量要用$前缀,这个跟 Perl 的语法,还有 nginx 配置语言也使用了同样的方法,在 perl 这种技术叫“变量插值”,它让专门的字符串拼接运算符变得不那么必要。比如 echo "foo:$foo"
|
87
james122333 2021-12-14 21:05:12 +08:00
楼上说的很好 这种方式也可以应用至数组 动态就是带入变量或者可以在数组里写三元运算 而三元运算也可以取用变量 输出可以数字 字串 数组
|
88
james122333 2021-12-14 21:10:00 +08:00
布林值或物件 blahblahblah. 可惜 key 有限制
|
89
james122333 2021-12-14 21:14:50 +08:00
可以不用写十几二十行以上就为了凑个输出结构 或者写一堆类再来序列化 整天映射来映射去还不能很确定结果 完全就是 996 帮凶
|
90
JosephHan 2021-12-15 05:52:21 +08:00
Laravel 转 Go 强烈推荐用 GoFrame, 这个框架可以看做是用 Go 写的 Laravel, 除了要适应 Go 的语法, 转换过去几乎没有啥痛苦
官网地址: https://goframe.org/display/gf |
91
Macolor21 2021-12-15 09:08:58 +08:00 via iPhone
@cxsz 你试一下全部写在一个文件里,业务写复杂点
如基本的参数校验:限制字符串长度,数字限制在 1-10 写多点 service 层写点校验逻辑,如判断缓存在不在,或者布隆过滤器用来判断是否需要查库,过滤无效请求。 然后业务上,写多几个请求,如 A 依赖 b ,c ,d 的结果然后才能执行,所有 bcd 都用异步去做 最后到了 dao 层,需要做分布式事务,原子写入多个表。 这些写完之后,你看看你的代码还能不能迭代? |
92
fregie 2021-12-15 10:04:36 +08:00
不建议用 go 写业务,开发效率慢,也发挥不出 go 的优势
|
93
Akiya 2021-12-15 12:06:00 +08:00
当然是换 C#啦
|
94
securityCoding 2021-12-15 14:51:45 +08:00
多看看各种中间件的源码就知道 go 的源码有多好读了,没那么多花活。
java 的开源项目看源码能把你整吐 |
95
FightPig 2021-12-15 15:31:56 +08:00
这怎么还争起来了,好吧,我用最多还是 rails ,直接 render json: User.all ,go 我也写,啰嗦些,不过直接按 rails 写了个生成工具,几乎前端 后端都是我用代码生成的,感觉还好,编译成一个包,直接丢服务器上就能用,给客户演示也不用担心源码问题。语言嘛,各有各的优点,哪个方便用哪个呗。话说我挺想用 rust 的,奈何学了好几回了,都没用到生产上。
|
96
sanggao 2021-12-15 16:22:08 +08:00
用 go 代替 php 写业务,就是自找不痛快
|
97
elevioux 2021-12-15 16:22:51 +08:00
又吵了起来,php 果然是最好的语言。
其实 php 也可以写的很严格,很规范,特别是 8.0 之后。但这样代码量又多了不少,对于不少 php 开发来说都是多一事不如少一事,直接干就好。 例如楼上的返回 json ,可以 直接 echo json_encode(db_select(...)),也可以严格的先定义一个实现__toString 方法的类后直接 echo new 类(...)。 实际第二种我在工作中没见过,毕竟都懒。 |
98
JaguarJack 2021-12-16 16:57:16 +08:00
别想不开用 Go 开发 Web 了!纯粹没事找事做,早点做完早下班。
PHP 也是以前的 PHP 了,性能完全可以满足 Web |
100
JosephHan 2021-12-18 13:07:04 +08:00
@349865361 #99 我本职就是干了 14 年的 php 开发,Laravel 用了 5 年, 原有的 Laravel 项目转用 go 重构时, 调研了好久选中了这个框架, 用过后觉得这个框架适合 Laravel 转, 推荐给其他 phper, 怎么就变成广告了?
当初调研了好久, gin 这类的比较像 http server 框架而不是 laravel 这种全功能的框架. beego 的给我的感觉更像 thinkphp. GoFrame 框架功能齐全, 本身又不重,用起来的感觉最接近 Laravel 将自己实践出来的经验告诉给同行, 怎么就被说成是广告了呢? 你本身是用过踩过坑? 还是因为我推荐的内容不符合你的预期? 你认别人推荐的不对可以讲经验,列数据来反驳,但不应该上来就扣帽子. 怎么跟某乎里的套路一样, 上来什么也不说,第一件事就是给别人定性? |