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

新 Idea PHP 转 GO 福音

  •  
  •   xiangdong1987 · 2019-07-26 13:16:19 +08:00 · 8234 次点击
    这是一个创建于 1952 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近两周一直在做公司的 Go 项目,从 PHP 转 Go 是一个不算那么痛苦的精力,今天就来讲讲这两周的体会吧。

    背景

    • 我们是长期使用 php 并且实现了 swoole service 架构的服务
    • 随着长时间的维护,发现了 php 这种野路子开发快,但是规范上真的差
    • 业务的复杂度和规范性越来越成了一个维护难题
    • 小组学习 Go 相关内容

    过程

    • 为了减少趟坑造成巨大损失,只能找一些不太重要的小项目进行重构。
    • 对于一个从 PHP 转 Go 最大的难题就是规范性。
      • 数据类型的定义要求
      • 资源业务的抽象
      • 单元测试的编写

    对于一个被 PHP 养成的一个懒汉来说,初期真的是痛苦无比,但是慢慢的我发现,其实 Go 的设计模式就是为了在规范和速度上取一个平衡,开始我是一点一点写的,后来发现各种的包可以大大缩短我们早轮子的时间,轮子小还可以自己改,所以我就萌生了一个想法。自己做一个脚手架,自动代码生成。做为一个懒散的程序员这就是福音。

    优化

    • 我们选择的是 Gin 框架,原因是轻量,我觉得没什么比轻量可控更好的选择了。
    • Restful 协议真的是好东西,规范可自动生成不错的选择
    • 并不需要高深的代码套路,curd 模板直接保存文件

    结果

    总结

    感觉 go 真的真的很不错,在快速和规范中有一个舒适的平衡点。后续加上 docker,在弄个 k8s 稳稳的后端,前端的事就叫前端去做吧!业余时间快乐的玩耍。还有欢迎提各种 pr 集思广益。

    第 1 条附言  ·  2019-07-28 02:43:26 +08:00

    Go mod

    • 11 版本以上
    • 设置环境变量
    //开启mod
    export GO111MODULE=on
    
    //设置代理
    export GOPROXY=https://gocenter.io
    
    
    70 条回复    2020-05-13 11:40:13 +08:00
    ztxcccc
        1
    ztxcccc  
       2019-07-26 13:17:42 +08:00   ❤️ 9
    “随着长时间的维护,发现了 php 这种野路子开发快,但是规范上真的差” —— 人或者管理有问题
    xiangdong1987
        2
    xiangdong1987  
    OP
       2019-07-26 13:22:02 +08:00
    @ztxcccc #1 项目时间拉到 3-5 年,一波一波人来人去真的不是说能管理的的好的,毕竟人的水平是稂莠不齐的,真的很难规范。毕竟 php 就是以快速灵活号称的,对于一些发展长远的公司来说,都是会摒弃的。太多的大公司越来越不待见 php 了
    Binks
        3
    Binks  
       2019-07-26 13:25:18 +08:00
    "数据类型的定义要求
    资源业务的抽象
    单元测试的编写"
    这些跟语言没关系吧
    ben1024
        4
    ben1024  
       2019-07-26 13:26:33 +08:00
    项目的规范受影响方面太多,这一方面弱类型语言也确实比强类型差
    人员频繁变动和个人开发者的水平,需求合理性,项目紧急性等。。。
    xiangdong1987
        5
    xiangdong1987  
    OP
       2019-07-26 13:31:04 +08:00
    @Binks #3 完全有关系 php 你就不会定义一个结构体,Go 里面你不定义好结构体就不能玩了 你可以用下体会体会,感觉从语言的设计路上他们就是有天然的区别的,比如 php 就是想让你懒,想让你随性,想让你慢慢的爱上他,最后你发现这就是溺爱啊,我觉得 php 设计者真的太坏了
    agdhole
        6
    agdhole  
       2019-07-26 13:31:22 +08:00   ❤️ 1
    福音:转 dotnet core
    nigelvon
        7
    nigelvon  
       2019-07-26 13:32:52 +08:00
    服务端用 PHP 和 Node.js 都有同一个问题,不同水平的人写出来的东西相差太多。不像 JAVA 这种强类型语言容易形成团队规范,更容易协作。
    如果团队水平够的话,PHP、Node.js 都可以写出漂亮易于维护并高效的工程。
    xiangdong1987
        8
    xiangdong1987  
    OP
       2019-07-26 13:38:29 +08:00   ❤️ 1
    @nigelvon #7 是这个道理,就像我写 php 的时候我是万万不会写单元测试的,以你为我太懒了,但是在 Go 里你代码不写单元测试,你线上完全不能改,只能硬抗这个 bug,不得已我也开始写单元测试了,写了发现也太好了吧,直接 ide 运行监测,只要单元测试都过关,整个程序也不会出什么问题,这就是语言层面带来的一些好处,真的感触挺深
    askfilm
        9
    askfilm  
       2019-07-26 13:40:36 +08:00   ❤️ 1
    随着长时间的维护,发现了 go 这种野路子在快速和规范中舒适平衡点,越来越不平衡了同时也不舒适了
    xiangdong1987
        10
    xiangdong1987  
    OP
       2019-07-26 13:43:38 +08:00
    @askfilm #9 哈哈 比 PHP 强点
    skiy
        11
    skiy  
       2019-07-26 13:43:41 +08:00
    居然不用 go mod. 新项目很少不用 go mod 的了吧?
    laojiaqing
        12
    laojiaqing  
       2019-07-26 13:56:26 +08:00
    @xiangdong1987 为什么 go 不写单元测试线上不能改啊?
    Felldeadbird
        13
    Felldeadbird  
       2019-07-26 13:58:18 +08:00
    说到底楼主是喜欢上 GO 了,即使明明是管理问题,全懒在 PHP 身上了。
    abcbuzhiming
        14
    abcbuzhiming  
       2019-07-26 13:58:24 +08:00
    @ztxcccc 少扯淡,任何问题从根源上说都可以说是人的问题,但是人是会利用工具的生物,工具好坏能决定生产效率,语言是工具的一种
    victor
        15
    victor  
       2019-07-26 14:04:01 +08:00
    @abcbuzhiming 同样的工具(语言)有的团队用得好,有的团队用的差。不是人的问题是谁的问题?
    alexmy
        16
    alexmy  
       2019-07-26 14:11:11 +08:00
    easyGin 现在不是有 go module 管理包了吗,我看你把整个 vendor 都传上去了。
    haohappy
        17
    haohappy  
       2019-07-26 14:14:05 +08:00
    楼主怎么没提性能 是提升不大吗
    iyaozhen
        18
    iyaozhen  
       2019-07-26 14:14:44 +08:00 via Android   ❤️ 1
    呵呵,抛开历史包袱,用啥都是爽。写了 3-5 年,换了几波人再来说。你看过 10 几年的项目就知道了,什么语言都是扯,一坨坨的代码乱的不行。

    [是在 Go 里你代码不写单元测试,你线上完全不能改]为啥不能改?是不敢改吧,PHP 也有单测呀,改完单测都过了,上线心不慌(这个和语言有啥关系)。现在哪个语言没单测,哪个语言不能 IDE 运行检测?

    你可能是需要企业级业务框架,给你规定的死死的只能这样搞,这个哪个语言都有
    lifeintools
        19
    lifeintools  
       2019-07-26 14:15:25 +08:00
    我也理解不了这种莫名其妙对 PHP 的吐槽。 就你这个 GO 的项目,只要管理不到位 代码质量一样。。
    N1ceHua
        20
    N1ceHua  
       2019-07-26 14:26:04 +08:00
    PHP 野路子?用了 Go 就规范了?主观客观原因可以分析下嘛?请问 LZ 对自己的 PHP 学的是什么样的深度可以做个总结嘛?
    iyaozhen
        21
    iyaozhen  
       2019-07-26 14:30:02 +08:00
    https://github.com/xiangdong1987/easyGin/blob/master/test/scffold_test.go#L12
    就你这单测写的,用啥语言都一样
    调用一个方法还有会失败的吗?测试、调试全靠输出?
    func TestGenerateCURD(t *testing.T) {
    println(scaffold.GenerateCURD("Person", "id"))
    }
    ztxcccc
        22
    ztxcccc  
       2019-07-26 14:36:44 +08:00
    @abcbuzhiming 就问你,写 php 不写单元测试,换了 go 就写了,这是什么问题?
    xiangdong1987
        23
    xiangdong1987  
    OP
       2019-07-26 15:24:04 +08:00
    @laojiaqing #12 PHP 可以直接改代码 go 是需要重新编译在提交代码 可能我说的不太清楚
    xiangdong1987
        24
    xiangdong1987  
    OP
       2019-07-26 15:26:15 +08:00
    @iyaozhen #21 看样子对我意见很大啊,来来欢迎来提 pr go 还没上代码覆盖那套呢 输出就够了 你提醒我了 下一步上代码测试覆盖
    xiangdong1987
        25
    xiangdong1987  
    OP
       2019-07-26 15:27:03 +08:00
    @alexmy #16 用的 govender go mod 还没了解最忌你一直在 curd 回去学习学习
    dawn009
        26
    dawn009  
       2019-07-26 15:29:21 +08:00
    @ztxcccc #1 可以认为,一个有针对性设计的语言,已经帮你做了一部分规范和管理工作。
    xiangdong1987
        27
    xiangdong1987  
    OP
       2019-07-26 15:34:57 +08:00
    @N1ceHua #20 php 可以看看 这个 https://github.com/xiangdong1987/tinys
    oneonesv
        28
    oneonesv  
       2019-07-26 15:38:05 +08:00   ❤️ 1
    “随着长时间的维护,发现了 php 这种野路子开发快,但是规范上真的差”

    随着长时间的维护,Golang 代码也一样可以一坨屎,语法上的限制并没有啥用
    nguoidiqua
        29
    nguoidiqua  
       2019-07-26 15:51:01 +08:00 via Android
    问题当然都是人的问题,只是人的问题有时候不好解决,于是就用工具弥补人的问题。

    比如人的问题就是不喜欢面对事实,事实是有些语言确实更容易用出问题,大家都很明白这点,但是就是要硬着头皮说都是人的问题,仿佛他平时用得很顺当一样,完全忘了遇到时候自己是怎么吐槽的。

    没错,再好的工具都会被人用烂,但没那么烂也是好些。
    cheneydog
        30
    cheneydog  
       2019-07-26 15:53:39 +08:00
    golang 依赖总是下不下来啊,怎么建立私有仓库? dep 这东西一出来就要死了?
    ylsc633
        31
    ylsc633  
       2019-07-26 15:54:56 +08:00   ❤️ 1
    > "随着长时间的维护,发现了 php 这种野路子开发快,但是规范上真的差"

    我之前也是写 php 的,现在也是写 Go 的

    规范真的差,只能说明 你们当初领导或者项目主导者 根本 没有管理的意识 我记得当时我们写 php 的项目,用的 Laravel 框架, 大家规定使用 PSR 规范 (好像是 PSR-4) 不知道的,当时我们自己看, 然后项目里, 我们先把项目分好模块,然后拆分好,
    比如在 model 层中拆出 Repository, 这里专写 model 操作,以前 model 里 只有数据结构和关联关系! 把 controller 拆出 service 层等等, 还有入口表单校验 和出口数据格式化, 都分好模块, 后续加入的同事 只要根据这个规则写, 一旦有问题,方便查错!

    即使用了 Go,大家不按照规矩来,一样还是乱的... 跟语言关系真的不是很大!

    比如 你们这个脚手架里 文件有大写的,有小写的, 注释有直接中文的,又有英文的..... 跟人有关, 别怪语言了..
    set01
        32
    set01  
       2019-07-26 15:57:12 +08:00
    同 php,我也想转 go。但是做 Go 的话,小一点的城市是完全没有就业机会的,悲伤的故事
    xiangdong1987
        33
    xiangdong1987  
    OP
       2019-07-26 16:06:40 +08:00   ❤️ 1
    @ylsc633 #31 完全赞同对于人的管理可以做到良好的代码框架和使用规范,我并不是抨击 PHP 是不好的语言,我反而会说写业务逻辑 PHP 是最好的语言不接受任何反驳,我只是想说语言在设计的出发点上就有所不同,像 PHP 是削减了程序员的心智负担让,程序员更多的精力放在逻辑的编写上,这种出发点是好的,但是对于程序员本身的发展,有可能是一个陷阱,沉迷也简单的东西无法自拔,而有些语言设计上考虑的可能比较平衡,在上手难度和规范上做了一个平衡,其实 GO 的主要强项是 goroutine CSP 编程,是高效的使用多线程,降低程序员对于多线程编程的心智负担,每个语言都是有每个语言的优劣,我只能说我真没抨击语言
    AngryPanda
        34
    AngryPanda  
       2019-07-26 16:08:30 +08:00
    php 写不好,我感觉你们 go 也一样写不好。
    mrgeneral
        35
    mrgeneral  
       2019-07-26 16:10:40 +08:00
    因为编码规范而换语言?

    编码规范和语言有关系吗?
    abcbuzhiming
        36
    abcbuzhiming  
       2019-07-26 16:19:07 +08:00   ❤️ 1
    @victor 任何问题从根源上说都是人的问题,然而优秀的工具能够挽救水平不怎么样的人,让它发挥在平均线附近。当然我知道技术 geeker 们只喜欢那种能对高手增幅超多的工具,不会用用不好就可以说那是人的问题了。全然不顾现代软件工程的意义就是让更多“水平不怎么样的人也能写代码”
    abcbuzhiming
        37
    abcbuzhiming  
       2019-07-26 16:24:11 +08:00   ❤️ 1
    @ztxcccc 因为在楼主的应用场景里,PHP 明显更自由,因此楼主他们可以不写单元测试就上线,换了 Go 变成了不得不写。所以你看,“约定”无法代替“约束”,你当然可以说他们人有问题;工具这东西就是用来解决人的问题的
    abcbuzhiming
        38
    abcbuzhiming  
       2019-07-26 16:25:40 +08:00
    @mrgeneral 没有关系,但区别是有的语言可以用报错拒不执行逼着你执行编码规范,而有的语言则决定给用户“更多自由”,哪个更好就见仁见智
    chinvo
        39
    chinvo  
       2019-07-26 16:28:07 +08:00 via iPhone
    @xiangdong1987 #24 很遗憾,你这样写覆盖率会很高,然而并不能达到测试的目的
    xiangdong1987
        40
    xiangdong1987  
    OP
       2019-07-26 16:31:16 +08:00
    @chinvo #39 哈哈 知道我没用断言 毕竟 PHP 养成的习惯一时半会改起来还挺痛苦,这个痛苦就是我想说的也感谢 @abcbuzhiming 理解万岁
    chinvo
        41
    chinvo  
       2019-07-26 16:36:26 +08:00 via iPhone   ❤️ 2
    @xiangdong1987 #40 说实话别给 PHP 招黑了,这些习惯不是语言的问题,而是个人和工作环境的问题

    我是从 asp 做到 PHP 然后到 .net core 的,写了至少七年 PHP,也没有养成不用断言硬说是测试的“习惯”

    实事求是脚踏实地才是硬道理,别把锅甩给语言
    victor
        42
    victor  
       2019-07-26 16:37:39 +08:00
    @abcbuzhiming 你这回复,我表示赞同。
    bugsnail
        43
    bugsnail  
       2019-07-26 17:15:33 +08:00
    其实,PHP 7 已经支持 参数和函数返回值类型声明, 数据类型的定义完全可以像某些静态语言一样

    至于资源业务的抽象,这不是考验编写代码的人吗?设计模式 /框架 /架构

    单元测试就更不用说了,只要你愿意写,都是有的
    xiangdong1987
        44
    xiangdong1987  
    OP
       2019-07-26 17:15:36 +08:00
    @chinvo #41 我同意我这个人就是有点懒,没办法人性嘛就是趋利避害嘛。我只是感受到了危险而已,不给自己找借口了,还是多点时间去码代码吧!
    encro
        45
    encro  
       2019-07-26 18:24:58 +08:00
    PHP 7 支持类型定义等等,和按照规范来写和强类型语言没有基本什么区别了;
    GO 的话适合些各种并发应用的服务端,比如自己实现 web server,websocket server, client manager,还有就是需要打包的小程序,比如 lantern,goproxy,frp 之类
    相比 Python,我更喜欢 Typescript,.net core,golang 甚至 PHP,无赖 Python,java,c 历史太悠久了。
    简单的 restful 个人觉得还是用 django restful framework 自动生成好了,对性能要求高点可以用 go,对 PHP 熟悉可以用 YII 都是框架自动生成。
    shingle
        46
    shingle  
       2019-07-26 18:39:03 +08:00
    golang 里有 template, 而不是用你这种字符串拼接来生成模板
    impl
        47
    impl  
       2019-07-26 19:18:26 +08:00 via Android
    用 go 的容易遇到猪队友
    mamahaha
        48
    mamahaha  
       2019-07-26 19:36:28 +08:00
    与其拼命夸语言,不如推荐点应用该语言的大神让大家学习了解一下。
    v2hub
        49
    v2hub  
       2019-07-26 19:45:15 +08:00
    这和语言没有关系,只和开发人员有关系,更和速成班有关系。我见过写的一坨翔的 JAVA 代码,难道是 JAVA 语言有问题?
    ruyuejun
        50
    ruyuejun  
       2019-07-26 19:45:37 +08:00 via iPhone
    需要都是相通的,来学微服务呀

    http://github.com/overnote/golang/tree/master/12-Go 与微服务
    lsls931011
        51
    lsls931011  
       2019-07-26 19:46:47 +08:00
    你们这些人啊,人家就是想说 PHP 与 GO 语言在设计上的区别, 在语言层次上 Go 比 PHP 的确具有规范性, PHP7 出了这么久,你们这些使用 PHP7 在自己项目有全部用类型定义,还不是使用 PHP5 时代那一套。
    任何编程语言都是给程序员使用的, 所以无论使用啥语言,最后还是归结到人身上, 注意审题.
    JaguarJack
        52
    JaguarJack  
       2019-07-26 19:48:07 +08:00 via iPhone
    我觉得不用说楼主了 楼主只是使用新语言的后新鲜感罢了
    zjsxwc
        53
    zjsxwc  
       2019-07-26 20:00:17 +08:00 via Android
    我写 go 一律无脑 interface 路过,真香!

    不过还好只是写点自己用的工具,
    这种代码别人肯定是无法接手的,
    2333333333
    towser
        54
    towser  
       2019-07-26 20:30:00 +08:00   ❤️ 1
    路子野写什么语言都野。PHP 主要还是从业者平均水平偏低,土法炼钢玩惯了,规范化在团队内推广不开。
    c466934322
        55
    c466934322  
       2019-07-26 20:39:41 +08:00
    说到底,这个锅 php 不背。公司考虑使用 php 就应该考虑到这个问题,如果是规范问题,那么管理者应该给出一套自己的合作书写管理规范,比如统一使用驼峰,比如,之后要有空格,比如写完之后必须要有 unit 代码上到 git 会有脚本进行判断。
    说到底,时间紧,任务重。都是借口,写 go 的时候,你也可以安装 php 的写法去搞,无非是怎么来的怎么挂回去,而 php 不会让你挂回去。。。我们在享受人家便利性的同时也不要一味的说人家不好
    Ann5527
        56
    Ann5527  
       2019-07-26 23:43:38 +08:00   ❤️ 1
    我先不说语言的“优劣”,语言只是工具,用来赚钱的就是好语言。要不是 PHP 的草根语言,多少草根公司能够活到有人来浇水啊,多少公司就三五条枪,要不是靠着 PHP 帮你跑马圈地才活到下一个阶段。这次让公司活过了头七,有点钱了,能多招几条兵了,开始讲排面吹牛逼了,开始扯 PHP 没有其他语言有“脸面”了,为啥这时候不下功夫把自己一开始乱搞的一坨坨 PHP 治理一下呢。
    KasuganoSoras
        57
    KasuganoSoras  
       2019-07-26 23:51:25 +08:00   ❤️ 1
    用 PHP 一时爽,一直用 PHP 一直爽(
    charlie21
        58
    charlie21  
       2019-07-27 09:35:38 +08:00
    @chinvo 搭车问一下大佬,现在 dotnet Core 做小型 CRUD 网站 ( 数据库 mysql ) 的技术栈是什么?
    前端用 Razor 模板引擎吗,有像 Procedural PHP 一样直接简单组装 sql 作 crud 的路子吗,如果没有则 ORM 可以用哪个
    chinvo
        59
    chinvo  
       2019-07-27 10:27:04 +08:00
    @charlie21 Asp.Net Core 全家桶,数据库用 EF Core ( MySQL 需要安装 Pomelo.EntityFrameworkCore.MySql / Mysql.Data.EntityFrameworkCore 驱动)

    EF 也可以直接写 SQL (要准备好 Model 以用于 SELECT 等操作)

    如果用不惯 EF,可以用 NHibernate

    一定要纯 SQL 的话,可以考虑直接用 Mysql.Data / MySqlConnector
    abmin521
        60
    abmin521  
       2019-07-27 10:50:39 +08:00
    var ModelPath = "d:/data/go/src/easyGin/models/"
    var RouterPath = "d:/data/go/src/easyGin/router/"
    var ApiPath = "d:/data/go/src/easyGin/handle/"

    这?
    charlie21
        61
    charlie21  
       2019-07-27 10:54:17 +08:00
    @chinvo 就是 纯 sql 结果读取+展示,让网站跑起来 model 层直接跳过,用 数据库 直接抓出来数据 展示
    ( 就是 极简陋 PHP 留言板的 toy demo 的感觉 ) 不用 model
    当然这个流程是很不规范的 有没有什么教程可以参考
    xiangdong1987
        62
    xiangdong1987  
    OP
       2019-07-27 12:02:00 +08:00
    @abmin521 哈哈 时间紧任务重一个人好累 哈哈
    chinvo
        63
    chinvo  
       2019-07-27 12:28:31 +08:00
    @charlie21 #61 看 Mysql.Data 或者 MySqlConnector 的官方文档,里面有范例
    chinvo
        64
    chinvo  
       2019-07-27 12:29:22 +08:00
    @charlie21 #61 另外可以不用 Razor,这样就不需要 ViewModel 层,asp net core 官方 simple / template 有
    Actrace
        65
    Actrace  
       2019-07-27 12:30:18 +08:00
    楼主惨了,公然引战。
    skymei
        66
    skymei  
       2019-07-27 12:55:43 +08:00
    PHP 是世界上最好的语言
    fancyhan
        67
    fancyhan  
       2019-07-27 14:53:52 +08:00 via iPhone
    说到底是动态类型和静态类型的区别
    xiangdong1987
        68
    xiangdong1987  
    OP
       2019-07-27 19:02:25 +08:00
    @cheneydog #30 go mod proxy 了解一下 项目已经上 go mod
    compareInt
        69
    compareInt  
       2019-07-28 15:35:18 +08:00
    php 是世界上最好的语言,别打我
    default7
        70
    default7  
       2020-05-13 11:40:13 +08:00
    @towser 土法炼钢 …… 你这词太。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1499 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 23:57 · PVG 07:57 · LAX 15:57 · JFK 18:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.