Golang Go语言中如何舒服、优雅地开发Web项目?
Golang Go语言中如何舒服、优雅地开发Web项目?
我是从 PHP 转 Go 的,用 PHP 时是用 Laravel 框架写的 web 程序,且极度依赖 Laravel ;转了 Go ,用 Gin 框架 写 web 程序。
目前体验下来,感觉比较烦躁,一个模块至少要有 3 个近乎一样的结构体:HTTP 请求创建 /更新用的、HTTP 响应用的、Gorm 用的。
PHP 是弱类型语言,Go 是强类型语言且啰嗦,确实不能用相同的思维设计程序。
但有没有什么方法或工具能优化其开发体验?以及有没有优秀的 Go Web 程序设计模式可以参考下?
更多关于Golang Go语言中如何舒服、优雅地开发Web项目?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
这样才够规范,强类型语言确实会预定义很多类型,写的时候感觉麻烦点但是可读性可维护性都优于 php python 的万能结构,我也是写 php 转的,不过之前也写过 c Java ,在编译语言中对比起来感觉 go 真的足够简洁了,你应该转变下自己的思维,不能想同时要 go 的强大和 php 的灵活
另外你说的近乎一样的机构体不清楚你是怎么规划的,如果遇到接近的我一般倾向于复用,最好能展示下示例代码
更多关于Golang Go语言中如何舒服、优雅地开发Web项目?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
其实你可以用强类型写 php 适应一下再去写 go /doge
gin 请求用的结构体 可以对应一下 laravel 里的 各种 request 类 里的 验证
gin 响应用的结构体 可以对应一下 laravel 里的 各种 api resource
gorm 用的结构体 就可以当成 laravel 里限定了 hidden / fillable 的 eloquent model
laravel 写严格点的话,个人感觉和 gin 没啥大的区别
那就试试 goframe
试试 copilot 这个 vscode 插件
可以试试 Java ,再用 go ,就不觉得啰嗦了 /doge
用 Java 的思维写 PHP 一样更啰嗦,这种代码我见过……
看我的 go 直播咯,周一到周五每晚十点: http://live.bilibili.com/8989585
用 go 写一个 exec 函数调用 .NetCore 写的服务.
习惯就好了 ,我最近在拿 Laravel 的程序改到 go 。很爽啊
写习惯了之后 在写 php 感觉都变规范了 哈哈哈哈
听着就很有问题,怎么写这么多 struct 。
dotnet+f#确实还挺优雅,可惜是二等公民。
换成 C#
Java 也很啰嗦,每层分开,controller ,service ,dao ,mapper ,然后每个响应接收再建一个类来处理,复杂返回的还要多个整合一下,也是写一堆重复的
优雅同熟悉正交。
—Rich Hickey
go 怎么看也不像是一个能优雅起来的语言
输入优雅就不要用静态语言。不过 c#也慢慢越来越像动态语言了
慢慢习惯吧
同 PHP 用 Gin 写有一样的感觉 (然后就想自己封装 但对 Go 还不太熟练有些地方串不起来
打算用 go-zero 试写一下
你都用 go 了, 就别讲究优雅了.
干就完事了
#6
用过 Java 其实觉得 Go 更啰嗦……
毕竟特性 less, 代码 more
我们自研框架
用 Go 写了几个项目觉得体验不太好,适合写一些小工具,业务逻辑复杂的就算了太痛苦
用 go 写…真的就是刀耕火种
go 开发 web 项目是无法和 php 比优雅的,放弃吧兄弟。
标准项目中 req & rsp 必须要单独定义,如果一定要复用 struct ,可以通过匿名字段。rpc 项目中是没法复用的。
#16 啰嗦是啰嗦了,但是也降低了心智负担…
不是你的错觉,而是不管什么语言过来的,
用 Go 都会觉得啰嗦
Go 输出 JSON 的大小写问题没有劝退你吗
很好奇,php 如果要返回 json ,不需要实体吗? 将参数传给 service 不需要先封装到实体里面吗?
如果你在 php 里用的是 map ,那当我没说。
接口的返回、请求参数。对应的实体是应该分开的。不然瞎写谁受得了。还是说只接 req 里面 getParm 连封装都没有吗?
php 叫数组, 不是 map, 面向数组编程
先试试用 c 写,就不会觉得 go 啰嗦了。。
自己封装一下,或者等我出一个最佳实践 (doge
不需要,PHP 这点还是非常牛的,比如:echo json_encode($array)
,我们根本不关心$array 里面有哪些字段,要不要预定义。
这种写法 任何语言都支持,go 可以用 map ,java 也可以,c#也可以。 只是维护起来 要把人搞死,所以没人用。
相反,你在 php 里用实体 也是可以的,只是 php 基本上面向快速建站,所以很多为了后期维护而存在的规范,在 php 里都基本上不被重视。
不同的,PHP 也可以显式赋值定义出另一个数组来,但是和你说的其他语言的代码写法,你写一个比对就知道了,即使 PHP 显式赋值出来,代码的简洁性还是比其他语言好
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# 我就不写了。。。 都差不多。
#10 没毛病,而且还可以继续对外声称使用 go 。
不考虑修改的话,C#可以使用匿名类型
var news = new
{
id = xxx,
name = “xxx”,
};
大多数人根本没写过 C C++ rust 理解不了 go 的优雅。。
不过 error 确实 sb 写起来很啰嗦
语言的本质都一样,哪个开发效率高,哪个轮子多用哪个。
这是 MVC 的规范吧,跟 Java 有啥关系?你直接在 servlet 里写 SQL 也能实现功能,Java 的啰嗦又不是指这方面
这个跟语言似乎没有什么关系,只是一个规范,一个类走这几个层也没毛病
Go 写原生 sql 就可以省一个结构体了(狗头
众所周知,php 是全世界最好的语言。我好奇为啥楼主弃明投暗搞 go 呢?
+1 学 go 救不了中国人
中国人学啥都没救
echo json_encode([‘id’ => 0, ‘name’ => “xxx”]);
说说我吧,之前写 php 的,有段时间混合 go ,后来纯 go ,现在能 php 就不会用其他的。重要的是做出来先不考虑多优雅,过度设计,挣到钱才是王道,btw 我不上班
这种方式,你打算怎么动态? 如果直接写死,其他语言也都可以
每个程序都有的字符串转实体的函数({"id":0, "name":"xxx"}
)
比 go 还啰嗦的语言确实不多,但是 go 的好处是没那么多花活儿所以比较好读。
还有,不要开口闭口就杠精,不想争论就别说话。 想争论 就好好争论。 你最后发的这个例子就是没头没尾。 连赋值都没了
简单点。
数据库是这样的:
id name
1 zhangsan
2 lisi
3 wangwu
你用你引以为傲的 php ,写个例子出来,把这个数据 查询到一个变量里,然后转成 json 返回给前端。
你写一个,我也写一个,我用 map ,你用你引以为傲的 php ,最后对比下 差异有多大,可以吗???
$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 资源的返回 你看的明白不?
真是重复啰嗦,先解码成 json ,再转成 json 字符串。
你看看 java 怎么做的。
Map input = selectOne();
return JSONUtil.toJSONString(input);
而且你的这个例子 并没有 展现出,你刚才说的那种语法
还有,麻烦你 把我的帖子全部看完整,我一直都是在 跟另一个人说话,告诉他 语言之间没有什么大的差异,基本上都能做到。
是你一直在跟我杠,非要说 php 简单吧??
我是真的 明白了,为什么会有 “php 是世界上最好的语言” 这句调侃了
还有,任意 IO 资源,java 不可以吗? 还重点说明一下。真是服了。
杠精你好
这个就是查库返回 json
$data = Content::query()->select([‘id’, ‘title’])->limit(3)->get();
echo json_encode($data, JSON_UNESCAPED_UNICODE);
不会写 php 就别出来瞎 bb 好吗?
php 也不是世界上最好的语言
但是在开发 web 效率上来说是最高的
建议你先学习下 php
别动不动会写个 echo 你就可以来指点江山了
不就是一个 sql 吗??
Map data = selectOne(“select id, title limit 3”)
JSONUtil.toJSONString(input);
我是用 sql 写的,代码量就跟你不相上下了,甚至还少一些。
java 也有框架可以实现这种写法,我只是懒得去给你找了。
我们一直在比较 代码量 的差异,方便性把?? 跟我会不会 php 有什么关系??
我能用跟你差不多的代码量 实现跟你一样的 效果,不就可以证明 我的观点了??
非要会 php 干嘛???
你这逻辑有点感人啊
请不要跑题,
这个主题是 go 和 php ,
你还会 java 啊,真 tm 厉害!
你说 go ??
data := selectOne(“select id, title limit 3”)。
json.Marshal(data)
告诉我几行代码??
我无意贬低 php ,我一直都是在说 语言的差异不大, 你突然冒出来 非要说服我 php 简单,但是又拿不出什么杀手锏。
说不过我,就气急败坏的骂人,我也是醉了。 您自便把
别把无知当做自以为是。
都怪这该死的 php ,开发太快了。让我还有时间在这和你争论~
说不过我可以闭嘴,有本事拿出杀手锏。 拿不出来就闭嘴。
靠骂人 来 争面子,只会让你更丢人
有一说一我没用过 php ,感觉 php 就这个箭头符合敲代码效率就慢了一半
这里你可以 get() 后直接 toJson(JSON_UNESCAPED_UNICODE) 😆
python 转 go ,多写几个 struct 倒不是痛点,很多可以生成
企业微服务开发,grpc+grpc-gateway 反而很爽,http 请求响应也用 protobuf 约束上了,减少字段类型之类的错误、自动生成 swagger 接口文档
个人项目继续用 python ,语法舒服
没太理解,一样的结构体不是可以复用嘛,为什么要定义三个,如果有细微不同,可以继承一下呀
Single-Responsibility Principle 的一种实践吧
php 数组很方便没错
$a = [
“abc” => 123,
“bcd” => [
“a”, “b”, “c”
],
“cde” => [
abc:class => 123
]
];
优点写的快结构清晰还可以无脑当设定使用
然后查一下
https://stackoverflow.com/questions/9803317/multilevel-associative-array-in-java-like-php
果然我不太会发程序码
abc::class
该来的还是来了,楼上几位已经吵起来了,热度不减当年,我就说 PHP 是最好的语言,谁支持,谁反对?
很多人不知道为什么 PHP 变量要用$前缀,这个跟 Perl 的语法,还有 nginx 配置语言也使用了同样的方法,在 perl 这种技术叫“变量插值”,它让专门的字符串拼接运算符变得不那么必要。比如 echo “foo:$foo”
楼上说的很好 这种方式也可以应用至数组 动态就是带入变量或者可以在数组里写三元运算 而三元运算也可以取用变量 输出可以数字 字串 数组
布林值或物件 blahblahblah. 可惜 key 有限制
可以不用写十几二十行以上就为了凑个输出结构 或者写一堆类再来序列化 整天映射来映射去还不能很确定结果 完全就是 996 帮凶
Laravel 转 Go 强烈推荐用 GoFrame, 这个框架可以看做是用 Go 写的 Laravel, 除了要适应 Go 的语法, 转换过去几乎没有啥痛苦
官网地址: https://goframe.org/display/gf
你试一下全部写在一个文件里,业务写复杂点
如基本的参数校验:限制字符串长度,数字限制在 1-10 写多点
service 层写点校验逻辑,如判断缓存在不在,或者布隆过滤器用来判断是否需要查库,过滤无效请求。
然后业务上,写多几个请求,如 A 依赖 b ,c ,d 的结果然后才能执行,所有 bcd 都用异步去做
最后到了 dao 层,需要做分布式事务,原子写入多个表。
这些写完之后,你看看你的代码还能不能迭代?
不建议用 go 写业务,开发效率慢,也发挥不出 go 的优势
当然是换 C#啦
多看看各种中间件的源码就知道 go 的源码有多好读了,没那么多花活。
java 的开源项目看源码能把你整吐
这怎么还争起来了,好吧,我用最多还是 rails ,直接 render json: User.all ,go 我也写,啰嗦些,不过直接按 rails 写了个生成工具,几乎前端 后端都是我用代码生成的,感觉还好,编译成一个包,直接丢服务器上就能用,给客户演示也不用担心源码问题。语言嘛,各有各的优点,哪个方便用哪个呗。话说我挺想用 rust 的,奈何学了好几回了,都没用到生产上。
用 go 代替 php 写业务,就是自找不痛快
又吵了起来,php 果然是最好的语言。
其实 php 也可以写的很严格,很规范,特别是 8.0 之后。但这样代码量又多了不少,对于不少 php 开发来说都是多一事不如少一事,直接干就好。
例如楼上的返回 json ,可以 直接 echo json_encode(db_select(…)),也可以严格的先定义一个实现__toString 方法的类后直接 echo new 类(…)。
实际第二种我在工作中没见过,毕竟都懒。
别想不开用 Go 开发 Web 了!纯粹没事找事做,早点做完早下班。
PHP 也是以前的 PHP 了,性能完全可以满足 Web
别发广告了。。。受不了 这种广告越多越没人用
#99 我本职就是干了 14 年的 php 开发,Laravel 用了 5 年, 原有的 Laravel 项目转用 go 重构时, 调研了好久选中了这个框架, 用过后觉得这个框架适合 Laravel 转, 推荐给其他 phper, 怎么就变成广告了?
当初调研了好久, gin 这类的比较像 http server 框架而不是 laravel 这种全功能的框架.
beego 的给我的感觉更像 thinkphp.
GoFrame 框架功能齐全, 本身又不重,用起来的感觉最接近 Laravel
将自己实践出来的经验告诉给同行, 怎么就被说成是广告了呢?
你本身是用过踩过坑? 还是因为我推荐的内容不符合你的预期?
你认别人推荐的不对可以讲经验,列数据来反驳,但不应该上来就扣帽子.
怎么跟某乎里的套路一样, 上来什么也不说,第一件事就是给别人定性?
在Go语言中,开发Web项目可以既舒服又优雅,关键在于选择合适的工具和框架,并遵循良好的编码实践。
首先,推荐使用现代的Web框架,如Gin、Echo或Fiber。这些框架提供了简洁的API和强大的功能,能够大幅提升开发效率。例如,Gin框架以其高性能和易用性著称,非常适合快速构建Web应用。
其次,利用Go语言的并发特性,可以轻松地处理大量并发请求,从而提高Web应用的性能和响应速度。同时,Go语言内置的net/http包也非常强大,为开发者提供了丰富的HTTP客户端和服务器功能。
在开发过程中,注重代码的可读性和可维护性至关重要。采用模块化的设计,将代码拆分为多个独立的模块,每个模块负责特定的功能。此外,使用Go语言的接口和类型系统来定义清晰的边界和契约,有助于降低模块之间的耦合度。
最后,不要忽视测试的重要性。编写单元测试、集成测试以及端到端测试,可以确保代码的正确性和稳定性。Go语言提供了强大的测试框架,使得编写和运行测试变得非常简单。
总之,在Go语言中开发Web项目时,选择合适的框架、利用并发特性、注重代码质量以及编写全面的测试,都是实现舒服、优雅开发的关键。通过这些实践,你可以构建出高性能、可扩展且易于维护的Web应用。