golang 语言学习有感 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
woahishui
V2EX    程序员

golang 语言学习有感

  •  
  •   woahishui 2020-01-15 11:24:07 +08:00 via Android 8311 次点击
    这是一个创建于 2106 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚开始学习 golang,越看越有 basic 语言的味道,但是有没有 basic 丰富,难道是简化的 basic 语言
    58 条回复    2020-01-17 21:45:31 +08:00
    zjsxwc
        1
    zjsxwc  
       2020-01-15 11:32:40 +08:00
    你加入 CSP 编程模式试试
    tt67wq
        2
    tt67wq  
       2020-01-15 11:33:28 +08:00
    难道不是 c 语言的味道?
    zcreg
        3
    zcreg  
       2020-01-15 11:37:08 +08:00
    难道不是 c 语言的味道?
    cmdOptionKana
        4
    cmdOptionKana  
       2020-01-15 11:37:49 +08:00   1
    对于喜欢奇巧淫技的人来说,golang 显得不够简洁、优雅、好玩。

    但其实 golang 的精简恰到好处,当你用 golang 写了程序,过一段时间回头去修改的时候就会发现 golang 的伟大,它让一切都井井有条一目了然,并且非常容易重构和扩展。
    lihongjie0209
        5
    lihongjie0209  
       2020-01-15 11:42:20 +08:00   13
    @cmdOptionKana #4 从来没听说使用了 xxx 语言就能把代码组织好的
    pursuer
        6
    pursuer  
       2020-01-15 12:17:49 +08:00
    c 语言有形成标准的 ABI (这使得 C 可以容易的热更新动态库),可以用宏,没有 GC,类型前置,类型隐式转换,不支持闭包,这些都是和 Go 不一样的地方,我觉得 go 和 C 差挺多的吧。
    wellsc
        7
    wellsc  
       2020-01-15 13:10:53 +08:00   4
    @cmdOptionKana 尤其是 error handler,简直独一无二
    ytll21
        8
    ytll21  
       2020-01-15 13:11:59 +08:00
    @cmdOptionKana 伟大都用上了。。。允许我吐一会儿。。。哈哈哈,抱歉,无恶意
    d0m2o08
        9
    d0m2o08  
       2020-01-15 13:16:58 +08:00
    golang: 我不相信你们的技术,就按我的条条框框来,别瞎鸡儿折腾
    qq316107934
        10
    qq316107934  
       2020-01-15 13:19:47 +08:00 via Android
    @cmdOptionKana 除了处理 json 数据麻烦的要死
    Hanggi
        11
    Hanggi  
       2020-01-15 13:21:19 +08:00
    我觉得 go 语言最大特点是在编写和编译层面都强制用户遵守他们的规则,使得 go 语言写出来的代码相比其他语言没有那么多的变种和奇葩。当其他语言在争吵这个地方要不要空格、那个地方要不要缩紧或是换行的时候,gofmt 已经给你强制格式化了。
    cmdOptionKana
        12
    cmdOptionKana  
       2020-01-15 13:27:10 +08:00
    @lihongjie0209 你误会了,我并不是说用 golang 就一定能让代码绝对组织得非常好。我的意思是,它对更好地组织代码有帮助,在我看来,帮助很大。
    cmdOptionKana
        13
    cmdOptionKana  
       2020-01-15 13:29:11 +08:00   1
    @qq316107934 再忍一会儿,马上就有改进了,因为那是由于缺少泛型而导致的麻烦,很快就会支持泛型。
    lewis89
        14
    lewis89  
       2020-01-1 13:31:02 +08:00
    @Hanggi #11 这些 空格 tab 换行 圣战者 都是一些根本不懂编程的初学者,好的语言根本不屑于在这上面提供一些条条框框的东西。
    k9982874
        15
    k9982874  
       2020-01-15 13:33:06 +08:00
    @wellsc #7 上来直接打脸就不好了啊
    lihongjie0209
        16
    lihongjie0209  
       2020-01-15 13:34:26 +08:00   1
    @Hanggi #11 你觉得代码的问题是格式化的问题? clean code 难道是教你怎么配置 editor config? effective java 教你怎么缩进?
    charlie21
        17
    charlie21  
       2020-01-15 13:34:27 +08:00   1
    学了汉语拼音就开始感叹中华文化博大精深.jpg
    cmdOptionKana
        18
    cmdOptionKana  
       2020-01-15 13:36:05 +08:00   2
    @wellsc 刚开始我也很烦它的错误处理,烦到炸。

    但是后来发现,这其实是因为错误处理本身就是个麻烦事,try catch 那种方式企图掩盖错误处理的麻烦本质,但是并不完美,也有很多缺陷。

    golang 那样设计是为了把这个麻烦本质暴露出来,如果根据 golang 的设计思想认真处理每一个 error,就会发现这对代码 debug 带来很大帮助。

    加上最近 errors 库的小改进以及即将到来的一些改进,这个一直被很多人诟病的缺点也会得到很大改善。
    Hanggi
        19
    Hanggi  
       2020-01-15 13:43:51 +08:00
    @lihongjie0209
    @lewis89
    代码格式化只是一个最直接的例子,这种设计体现在 GO 语言的方方面面,你们可以自行体会。

    简单说 GO 语言的优点有以下几点:
    强制的代码风格(仁者见仁)
    强大的标准库
    对操作系统极少的依赖
    优秀的性能

    这些东西可能其他语言也都能满足,但是合到一起就会对上某些人的胃口,自然会赞不绝口。
    wutiantong
        20
    wutiantong  
       2020-01-15 13:46:40 +08:00   2
    为啥国内 Golang 的信徒那么多啊?
    fanpei0121
        21
    fanpei0121  
       2020-01-15 13:48:45 +08:00
    lihongjie0209
        22
    lihongjie0209  
       2020-01-15 13:51:52 +08:00
    @Hanggi #19 你说的这些东西只要是现代语言都满足:

    Python:

    自带电池 -> 强大的标准库
    基于解释器的 -> 不依赖操作系统
    优秀的性能 -> 要性能的就是 C 来写

    Javascript

    npm -> 强大的标准库
    我有 V8 -> 对操作系统极少的依赖
    我有 V8 -> 优秀的性能

    Java
    我只管创建接口, 实现大厂来做 -> 强大的标准库
    我有 JVM -> 对操作系统极少的依赖
    我有 JVM -> 优秀的性能

    以上所有:
    强制的代码风格 -> editor config / ide 配置文件
    fanpei0121
        23
    fanpei0121  
       2020-01-15 13:52:32 +08:00
    @wutiantong 个人以为,golang 同时兼顾了开发效率与运行效率。其他语言都比较极端。
    bbao
        24
    bbao  
       2020-01-15 13:55:30 +08:00
    @Hanggi

    强大的标准库?兄弟你再搞笑?
    Hanggi
        25
    Hanggi  
       2020-01-15 14:05:37 +08:00
    @lihongjie0209
    你自己都承认了,
    java 要低系统依赖是不是要 jvm, 跑个服务器是不是还要用 tomcat、maven 之类的?
    跑 v8 你不需要装 node 吗?
    python 是不是还要借助 cpython ?
    ide 上的各种配置是不是每家公司都有些许的差异呢?

    而 GO 语言在语言层面就实现了这些。我并没有说 go 语言在所有这些方面都做到最好了,但确实给开发者带来了不一样的体验。并且出现了不少杀手级项目,其他语言也能开发出这些项目,那为什么要用 GO 语言呢?
    lihongjie0209
        26
    lihongjie0209  
       2020-01-15 14:11:10 +08:00
    @Hanggi #25 我懂了, 你说的系统依赖是不需要虚拟机, 直接编译产生机器码的那种.
    fiypig
        27
    fiypig  
       2020-01-15 14:16:23 +08:00
    我只知道我可能我会在 go 终老了
    VoidChen
        28
    VoidChen  
       2020-01-15 14:24:24 +08:00   1
    我以为真的写过代码或者用过 2 种或以上语言的人应该都不会说出这样的话。。。
    wutiantong
        29
    wutiantong  
       2020-01-15 14:51:48 +08:00
    @fanpei0121 为啥你回复里 at 我但我没收到 unread 提醒呢?
    guolaopi
        30
    guolaopi  
       2020-01-15 14:59:43 +08:00
    @lihongjie0209 孤陋寡闻了我,还没看过 go,难道 go 是直接拿记事本撸完就能跑了吗?(滑稽
    yukiloh
        31
    yukiloh  
       2020-01-15 15:08:46 +08:00 via Android   1
    一开始觉得 defer recover 牛逼,实际写起来要依靠 ide 比如 jb 的 template,iferr 也是,如果没有快捷输入真的烦…
    还有神一样的墙,感谢七云牛
    还有包管理…现在有 module 好多了
    smallyu
        32
    smallyu  
       2020-01-15 15:23:41 +08:00
    basic 的多线程是什么写的?
    zunceng
        33
    zunceng  
       2020-01-15 15:36:11 +08:00
    关于错误处理

    https://developer.aliyun.com/article/740696


    习惯用 try catry 的, 回头好好读一下自己代码 写了多少 bug ( PS: 可能也不容易看出来)
    lihongjie0209
        34
    lihongjie0209  
       2020-01-15 15:43:15 +08:00
    @zunceng #33 嗯, 找个机会把 JDK 源码中关于 try cache 的 BUG 找出来, 提个 issue
    hujianxin
        35
    hujianxin  
       2020-01-15 15:55:08 +08:00
    @cmdOptionKana 很快支持泛型,有多快呀
    xpresslink
        36
    xpresslink  
       2020-01-15 15:57:48 +08:00
    强制的代码风格(仁者见仁)
    强大的标准库
    对操作系统极少的依赖
    优秀的性能
    这些都不是语言的本质。
    @Hanggi 够浪的设计目标就是个有垃圾回收的 C 语言,减小开发难度和负担,所以比较适合 Go 的使用场景比 C 语言还要少。业务逻辑复杂度低又需要一定的性能服务后端开发,例如微服务。
    ChristopherWu
        37
    ChristopherWu  
       2020-01-15 16:20:03 +08:00
    来让我喷一下 go:

    1. 没有高性能好用的泛型,你说 interface{}?那个连 go 作者都受不了,因此导致没有抽象库可用如 reduce, map, flitter, any 等等函数;
    2. 错误处理,就算是用`product type`,也没有设置好用的语法糖将 error 迭代下去,导致大量重复冗余的 if else
    3. 自作主张的 golint, 你要是希望自己比较严谨,希望社区统一,就不要定死那么多可有可无的东西,大括号换行这些没所谓。cpu CPU Cpu 大小写没所谓,但,if else 我就喜欢用 else 显示标注,你连这要管我?? 我 export 函数就是不喜欢写注释你给我报错???还不能自定义??
    4. 一开始没有想做好 包管理器 给开源社区的人用。。导致现在一大堆。。
    想到再补充。。
    laravel
        38
    laravel  
       2020-01-15 16:28:12 +08:00
    我只想用 go 语言实现 raft 协议,但是现在还没有任何行动
    alphatoad
        39
    alphatoad  
       2020-01-15 16:34:14 +08:00 via iPhone
    讲道理 讲道理
    动态语言生成二进制或者打包一个运行时也是分分钟的事
    高级语言哪有真不依赖运行时的,libc、posix 之类的算?
    lihongjie0209
        40
    lihongjie0209  
       2020-01-15 16:37:41 +08:00
    @alphatoad #39 系统调用还是要依赖的
    charlie21
        41
    charlie21  
       2020-01-15 16:38:07 +08:00
    PHP:不配有姓名?
    dyllen
        42
    dyllen  
       2020-01-15 18:05:41 +08:00
    go 可以让你专注自己的代码吧,其他的就不用管太多了。
    这语言可以这样,也可以那样,你要花费时间精力去搞呀。
    blless
        43
    blless  
       2020-01-15 18:37:53 +08:00 via Android
    @lihongjie0209 #34 很多人喷 go 的错误处理,实际上程序执行起来就是这么多错误,try catch 给很多人根本不知道啥时候应该 catch 啥时候 throw。go 给新人一个要求,就是好好处理每个 error。比之前我司 java c#写的程序不知道稳定了多少
    CRVV
        44
    CRVV  
       2020-01-15 18:46:16 +08:00
    @lihongjie0209

    重点当然不是格式化的问题
    举一个另外的例子

    sync.Map 上没有 length 或者 size 方法,获取元素的数量要用 sync.Map.Range 遍历
    https://github.com/golang/go/issues/20680
    这个链接有解释说为什么不加这个方法,a Len method would either be misleading or inefficient

    类似这样的例子应该还有一些,所以有人觉得拿 Go 写的代码质量会更高,因为一些 misleading 或者 inefficient 的功能直接被删掉了



    > Python:
    > 优秀的性能 -> 要性能的就是 C 来写

    几乎所有的语言都能调用 C 代码,照你这个说法,任何一个语言都有优秀的性能

    > Javascript
    > npm -> 强大的标准库

    npm 不是标准库,而且我几乎没见过有人给 Javascript 的标准库说过好话

    > Java
    > 我有 JVM -> 优秀的性能

    性能指的不单是执行时间,内存占用量也是性能的一部分,而 JVM 在这方面的性能很渣
    即使单说执行时间,JVM 可能也只是在吞吐量上有优势
    blless
        45
    blless  
       2020-01-15 18:56:16 +08:00 via Android
    go 的优势就在于取舍得当,现在写代码的人完全没有其他工程领域的严谨性。别的行业搞工程图纸工具测量规划设计年限都整得妥妥的。软件工程里面单元测试,覆盖测试,性能测试能做好的都没有几个。没错,就是看多了别人的代码,事实证明别人的代码根本不能相信!就需要 Go 这种静态编译型语言强制性约束!
    fps23dot9999
        46
    fps23dot9999  
       2020-01-16 09:46:11 +08:00
    @cmdOptionKana 这段话好有翻译腔
    cmdOptionKana
        47
    cmdOptionKana  
       2020-01-16 09:54:08 +08:00
    @fps23dot9999 我故意的,现代汉语不用翻译腔总是感觉不够准确,容易有歧义。
    libook
        48
    libook  
       2020-01-16 10:41:50 +08:00   1
    个人感受 Go 是一个完全贴合工业化软件生产的语言,提供的特性精简、直达,让任何需求都有尽可能少的方案来实现(只有 1 种方案的话就不需要纠结了),让开发者将精力放在业务本身,把业务之外的问题都透明化解决。

    所以某种角度上来讲,“简”是 Go 的设计哲学之一。

    以上个人感受,不同人可能会有不同的感受。
    ChristopherWu
        49
    ChristopherWu  
       2020-01-16 11:27:02 +08:00
    @libook 一个问题,你写业务的时候,没有泛型用,都 copy-paste,看着一大坨逻辑都一样的代码,不觉得有难受的感觉吗
    o562dsRcFqYl375i
        50
    o562dsRcFqYl375i  
       2020-01-16 12:37:22 +08:00
    PHP:卑微如我
    bbao
        51
    bbao  
       2020-01-16 13:48:22 +08:00
    @blless
    try catch 给很多人根本不知道啥时候应该 catch 啥时候 throw

    那是你可能不会,并不是很多人根本不知道。
    Evilk
        52
    Evilk  
       2020-01-16 14:15:30 +08:00
    PHP:我在哪里?
    reus
        53
    reus  
       2020-01-16 14:59:02 +08:00
    @ChristopherWu 没有泛型你可以用反射,不是一定要用复制粘贴。
    blless
        54
    blless  
       2020-01-16 18:02:28 +08:00 via Android
    @bbao 得了吧,你把 java 每个 try catch throw 都处理一下照样不少,多少人直接有 catch 一下就当无事发生。你挨个处理就光数组越界空指针错误就处理不完。
    jin7
        55
    jin7  
       2020-01-16 20:33:38 +08:00
    java python 不香....吗
    bbao
        56
    bbao  
       2020-01-17 14:49:14 +08:00
    @blless 并没有此赶脚哦,可能你用的不好
    woahishui
        57
    woahishui  
    OP
       2020-01-17 15:06:41 +08:00 via Android
    @bbao 刚开始学习
    blless
        58
    blless  
       2020-01-17 21:45:31 +08:00 via Android
    @bbao 是我菜鸡了,用 go 的都是菜鸡 大佬无视我好吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1005 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 19:12 PVG 03:12 LAX 12:12 JFK 15:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86