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

新 Idea PHP 转 GO 福音

  •  
  •   xiangdong1987 · 134 天前 · 5535 次点击
    这是一个创建于 134 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    背景

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

    过程

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

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

    优化

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

    结果

    总结

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

    第 1 条附言  ·  132 天前

    Go mod

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

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

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

    随着长时间的维护,Golang 代码也一样可以一坨屎,语法上的限制并没有啥用
        29
    nguoidiqua   134 天前 via Android
    问题当然都是人的问题,只是人的问题有时候不好解决,于是就用工具弥补人的问题。

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

    没错,再好的工具都会被人用烂,但没那么烂也是好些。
        30
    cheneydog   134 天前
    golang 依赖总是下不下来啊,怎么建立私有仓库? dep 这东西一出来就要死了?
        31
    ylsc633   134 天前   ♥ 1
    > "随着长时间的维护,发现了 php 这种野路子开发快,但是规范上真的差"

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

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

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

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

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

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

    实事求是脚踏实地才是硬道理,别把锅甩给语言
        42
    victor   134 天前
    @abcbuzhiming 你这回复,我表示赞同。
        43
    bugsnail   134 天前
    其实,PHP 7 已经支持 参数和函数返回值类型声明, 数据类型的定义完全可以像某些静态语言一样

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

    单元测试就更不用说了,只要你愿意写,都是有的
        44
    xiangdong1987   134 天前
    @chinvo #41 我同意我这个人就是有点懒,没办法人性嘛就是趋利避害嘛。我只是感受到了危险而已,不给自己找借口了,还是多点时间去码代码吧!
        45
    encro   133 天前
    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 都是框架自动生成。
        46
    shingle   133 天前
    golang 里有 template, 而不是用你这种字符串拼接来生成模板
        47
    impl   133 天前 via Android
    用 go 的容易遇到猪队友
        48
    mamahaha   133 天前
    与其拼命夸语言,不如推荐点应用该语言的大神让大家学习了解一下。
        49
    v2hub   133 天前
    这和语言没有关系,只和开发人员有关系,更和速成班有关系。我见过写的一坨翔的 JAVA 代码,难道是 JAVA 语言有问题?
        50
    ruyuejun   133 天前 via iPhone
    需要都是相通的,来学微服务呀

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

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

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

    如果用不惯 EF,可以用 NHibernate

    一定要纯 SQL 的话,可以考虑直接用 Mysql.Data / MySqlConnector
        60
    abmin521   133 天前
    var ModelPath = "d:/data/go/src/easyGin/models/"
    var RouterPath = "d:/data/go/src/easyGin/router/"
    var ApiPath = "d:/data/go/src/easyGin/handle/"

    这?
        61
    charlie21   133 天前
    @chinvo 就是 纯 sql 结果读取+展示,让网站跑起来 model 层直接跳过,用 数据库 直接抓出来数据 展示
    ( 就是 极简陋 PHP 留言板的 toy demo 的感觉 ) 不用 model
    当然这个流程是很不规范的 有没有什么教程可以参考
        62
    xiangdong1987   133 天前
    @abmin521 哈哈 时间紧任务重一个人好累 哈哈
        63
    chinvo   133 天前
    @charlie21 #61 看 Mysql.Data 或者 MySqlConnector 的官方文档,里面有范例
        64
    chinvo   133 天前
    @charlie21 #61 另外可以不用 Razor,这样就不需要 ViewModel 层,asp net core 官方 simple / template 有
        65
    Actrace   133 天前
    楼主惨了,公然引战。
        66
    skymei   133 天前
    PHP 是世界上最好的语言
        67
    fancyhan   133 天前 via iPhone
    说到底是动态类型和静态类型的区别
        68
    xiangdong1987   132 天前
    @cheneydog #30 go mod proxy 了解一下 项目已经上 go mod
        69
    compareInt   132 天前
    php 是世界上最好的语言,别打我
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2256 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 32ms · UTC 10:19 · PVG 18:19 · LAX 02:19 · JFK 05:19
    ♥ Do have faith in what you're doing.