V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
passer9527
V2EX  ›  程序员

我怎么感觉 Golang 并不简单,也很复杂

  •  
  •   passer9527 · 2022-12-30 13:21:19 +08:00 · 10939 次点击
    这是一个创建于 704 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近实在顶不住 go 的各种宣传诱惑,准备学下 go

    我根据 go 的官网( https://tour.go-zh.org/welcome/1 )过了一遍 go 的语法。

    第一感受就是 go 并不是网上说的那种极简、什么大道至简。不知道是不是因为一直被宣传成 go 简单,让我潜意识觉得,就是比 python 更简单才叫简单。

    下面我说说我觉得很复杂的点:

    1. 指针、函数指针(闭包)等等各种指针用法
    2. interface 用法。

    这两个东西组合起来,写出来的代码可以极其复杂。(感觉都能赶上以前看的那种 C 语言混乱代码大赛了)。

    然后我感觉好的点:

    1. defer
    2. 并发编程和同步,就是被吹爆的 go 协程
    3. 没有 while 关键字了,都用 for 来搞定,也算变相提升了 for 复杂性。

    感觉要学好 go ,写出能和人协作给人看的代码,而不是自嗨的代码,也不是一件很容易的事。也许相对 c/c++,要容易点,但也并不是什么有手就行的极简,完全就是忽悠啊。

    71 条回复    2023-01-01 16:27:39 +08:00
    cmhonker
        1
    cmhonker  
       2022-12-30 13:34:07 +08:00   ❤️ 1
    没有时代的语言,只有语言的时代。

    Go 赶上了云计算、弹性计算、容器、超大规模虚拟化、调度等
    Go 适合 C 、C++ / Python 转来的。
    zhangtest
        2
    zhangtest  
       2022-12-30 13:42:34 +08:00   ❤️ 3
    java:你是不是对复杂有什么误解?
    BugCry
        3
    BugCry  
       2022-12-30 13:44:31 +08:00 via Android   ❤️ 1
    易语言就很简单了,那才叫有手就行
    k9982874
        4
    k9982874  
       2022-12-30 13:45:15 +08:00 via Android   ❤️ 2
    你去看看 js ,能把标准搞明白就不错了
    zhengjianyang
        5
    zhengjianyang  
       2022-12-30 13:49:23 +08:00   ❤️ 1
    python 转过来的、感觉挺好的
    musi
        6
    musi  
       2022-12-30 13:55:19 +08:00
    @k9982874 #4 浏览器:就算你把标准搞明白了,也不见得我就要按照标准来 (狗头
    346673164
        7
    346673164  
       2022-12-30 14:28:18 +08:00
    @zhangtest java,因为需求写过一点 go 。其实个人感觉
    java 有一套框框,所有的都要求面向对象,所以很复杂,一个简单的东西需要做的“臃肿”(个人感觉用 go 实现,小且快很方便)
    但是大一点的项目,感觉用 go 少了框框,比如接口实现什么的,多人协作没有统一的约定的话 反而会很杂乱。
    刚刚写了一点 go ,个人不成熟的一些感受。 还有一点,go 写出来的 不需要想 java 一样 一堆 jar 包和依赖,真的很清爽
    hahadaxigua834
        8
    hahadaxigua834  
       2022-12-30 14:28:33 +08:00
    go 的简单是因为他 code style 吧,做啥操作都只有几个固定写法,所以所有人写的都大差不差。

    python 的简单是他的对外接口简单,语言本身封装了很多操作。

    如果用 bnf 写他们的语法,python 的长度应该起码是 10 倍的 go 吧
    tairan2006
        9
    tairan2006  
       2022-12-30 14:30:38 +08:00   ❤️ 4
    这有啥复杂的,要不你看看 rust
    Mexion
        10
    Mexion  
       2022-12-30 14:36:48 +08:00
    go 确实简单,语法简单,但是东西太少,写起来很啰嗦
    securityCoding
        11
    securityCoding  
       2022-12-30 14:39:48 +08:00
    该有的问题协程泄漏、内存泄漏一样都不会少
    anonymous2351d00
        12
    anonymous2351d00  
       2022-12-30 14:41:07 +08:00   ❤️ 1
    @k9982874 eslint ,babel ,tslint ,prettier ,less ,scss ,postcss ,webpack ,vite ,rollup ,gulp ,各种 plugins ,各种 loader ,各种 chain ,有时候搭项目,搭着搭着就不知道自己在做什么了(完全投入到一团乱麻里无法自拔)
    anonymous2351d00
        13
    anonymous2351d00  
       2022-12-30 14:42:21 +08:00
    @k9982874 什么是 CommonJS ?什么是 UMD ?什么是 ES ?疯了。
    yfwl
        14
    yfwl  
       2022-12-30 14:53:08 +08:00
    确实,你说的对,我也是和你一样的感觉,但是我觉得 go.dev 里的包,大多数 99.99%没中文,没示例,完全看不懂。。。
    janxin
        15
    janxin  
       2022-12-30 15:05:37 +08:00   ❤️ 5
    Easy to learn, hard to master
    linvaux
        16
    linvaux  
       2022-12-30 15:22:07 +08:00
    js 才是魔鬼的语言
    boshok
        17
    boshok  
       2022-12-30 15:25:18 +08:00
    借楼请问一下大家,有没有比 go 更容易上手且实用的,对于 coding 新手而言。
    allgy
        18
    allgy  
       2022-12-30 15:41:25 +08:00
    RUST:要不来尝尝我编译器的厉害?
    qingo
        19
    qingo  
       2022-12-30 15:49:35 +08:00
    以 C 语音为基础,go 的 runtime 绝对比 python 的 runtime 要简单很多,go 是语法简单但是,不等于使用简洁,相对来说,个人感觉 go 到 master 应该比 python 更简单。
    wheeler
        20
    wheeler  
       2022-12-30 15:49:44 +08:00 via iPhone
    不比 python 简单吗?!
    Crawping
        21
    Crawping  
       2022-12-30 15:57:37 +08:00
    一般咱么说一个 语言简单 并不是只是说 语法简单.
    1.语法是否符合直觉,从其他语言转过来亲和力高
    2.常见编程模型非常通用
    3.类库够完全,易用,易管理 (import 一下即可 go get)
    4.语法糖不要太多..免得歧义, 类似 茴字的 N 种写法 就很恶心人
    5.编译部署是否简单.. 包括 交叉编译,跨平台的部署...

    还有好多方面....
    就上面提到的几点...
    作为一个 C/C++开发兼运维 常年配置各种编译环境,各种编译库,各种部署不一致的人来说...
    go 真是 简单到爆炸了...
    iyaozhen
        22
    iyaozhen  
       2022-12-30 16:06:24 +08:00
    大道至简 其实有时候是贬义词
    yolee599
        23
    yolee599  
       2022-12-30 16:07:58 +08:00
    我一个写 C 觉得 Go 的语法比较松散,像一个脚本语言,喜欢不来
    Seanfuck
        24
    Seanfuck  
       2022-12-30 16:16:18 +08:00
    @boshok php ?
    fregie
        25
    fregie  
       2022-12-30 16:17:44 +08:00
    interface 才是 golang 最成功的部分,在便准库的指导下,做个比喻,把模块间的组合方式,由拼图变成了积木.
    拼图是必须要两块要完全吻合才能放到一起,基本上一块拼图只能插在固定的另一块上.而积木是,只要你两块长得差不多就拼在一起用.
    当然以上说法仅限于某些好的实践,实际上也存在很多差的实践,甚至某些大的主流框架这一点做的很差.(既然是积木,为什么要做大的框架呢?)
    Jony4Fun
        26
    Jony4Fun  
       2022-12-30 16:20:01 +08:00   ❤️ 3
    the ultimate go -> 最近在看的一个系列视频,感觉很有意思,老外的编程思想以及 go 语言里的一些细节的东西。
    我个人还是比较喜欢 go 的,我感觉 C++,python 就是给人的选择太多了,有时候就导致了混乱。
    yekern
        27
    yekern  
       2022-12-30 17:12:25 +08:00
    抛开业务谈语言复杂度都是刷流氓.

    你看哪个语言写 hello world 复杂 都不复杂
    Nazz
        28
    Nazz  
       2022-12-30 17:15:07 +08:00
    指针和 interface{}相当简单了, 业务开发用不到 unsafe. channel 稍微复杂点
    yuancoder
        29
    yuancoder  
       2022-12-30 17:23:34 +08:00
    go 语法本身很简单,真正掌握 go 要了解一些底层的原理,不然写出的代码都是坑。
    kiripeng
        30
    kiripeng  
       2022-12-30 17:33:42 +08:00
    go 基本搞懂指针就大家都差不多了
    openmm
        31
    openmm  
       2022-12-30 17:50:50 +08:00
    go 写起来怎么排版我都感觉乱 比 c++还乱 不知道是不是我的问题
    bruce0
        32
    bruce0  
       2022-12-30 18:01:13 +08:00   ❤️ 1
    学会用不难, 想要用好 需要一定功力
    PlanZ
        33
    PlanZ  
       2022-12-30 18:10:32 +08:00
    必须要用到的时候才学,即便这样,也学不动了。
    fxxkgw
        34
    fxxkgw  
       2022-12-30 18:15:27 +08:00
    我写了很多年的 C 和 python 现在接手了 go 项目变看项目变学 感觉 go 的真谈不上简单 比 python 复杂多的
    securityCoding
        35
    securityCoding  
       2022-12-30 20:09:08 +08:00 via Android
    @Jony4Fun 这个系列非常非常棒,这老外太有激情了
    GiantHard
        36
    GiantHard  
       2022-12-30 20:13:48 +08:00 via Android   ❤️ 2
    @boshok C#
    PTLin
        37
    PTLin  
       2022-12-30 20:32:55 +08:00
    看个 tour 肯定简单,但是实际上用的话要记住各种细节,比如什么情况下可以自动进行什么优化,什么用法是常见的语言陷阱,常用的库都是什么,最佳实践是什么,这些加起来好像 go 也没那么简单。
    Kilerd
        38
    Kilerd  
       2022-12-30 21:59:51 +08:00
    Rust: 什么? 复杂?
    lepig
        39
    lepig  
       2022-12-30 22:09:57 +08:00
    哈哈 同感。 写简单的小应用小工具确实很快很简单
    pengtdyd
        40
    pengtdyd  
       2022-12-30 23:45:27 +08:00
    能写出这个标题的人,估计没学过 rust
    webcape233
        41
    webcape233  
       2022-12-31 00:16:50 +08:00 via iPhone   ❤️ 1
    @boshok python ,bash (如果你认可的话) js 也简单 ,但是你要是新手又过早去接触前端工程化那些你也会觉得他不简单(语言好理解,工具链复杂得要死
    ahdark
        42
    ahdark  
       2022-12-31 01:36:41 +08:00
    说难听点,Go 的很多设计有点反行业,就是和行业普遍认定的标准相违背。
    比如那个泛型,目前我知道的只有 Go 是用 `[T=any]`,别的普遍都是 `<T=any>`。
    还有独特的以文件夹为单位的 package 。我之前需要在 service/payment 写 interface ,然后实现。为了方便就想着给每个 impl 单独开文件夹,即 service/payment/credit 等。问题来了,很多数据定义在 service/payment 里,但 New 函数又要调用 impl ,构成了循环依赖,这个方案就寄了……
    ahdark
        43
    ahdark  
       2022-12-31 01:38:17 +08:00
    @Crawping 第四条是不是想骂 Kotlin 和 Rust (
    ysc3839
        44
    ysc3839  
       2022-12-31 01:57:32 +08:00 via Android
    个人觉得 Golang 的协程很复杂,个人还是更喜欢 async await 这种协程。
    TWorldIsNButThis
        45
    TWorldIsNButThis  
       2022-12-31 02:05:21 +08:00 via iPhone
    @ahdark scala
    gowl
        46
    gowl  
       2022-12-31 04:38:40 +08:00   ❤️ 1
    Java is almost perfect; C# is perfect; F# is beyond perfection.
    netabare
        47
    netabare  
       2022-12-31 08:10:58 +08:00   ❤️ 1
    @ahdark 泛型的语法这个反而没那么重要吧……scala 也是用方括号的,我自己构思的语言打算用竖线来分割(

    以文件夹为单位这个设定倒是没听说过别的语言有……听你这么描述,感觉确实是个很坏的,opinionated 到强迫用户照着一种思路去做的设计。
    urnoob
        48
    urnoob  
       2022-12-31 10:52:59 +08:00 via Android
    @346673164
    @zhangtest
    二位没理解 JAVA 或者是被各种框架玩出花弄晕了
    JAVA 的世界里做开发 就是类 ,new 出来 调用方法或者静态方法。传递的参数除了基本类型就是引用。内部类 接口 枚举都是可选项。其他基本为了面向对象这个理念做的特性可以抛弃。这种二,三选一的框框让你完全忘掉了 struct union 指针 引用 这里用.那里用-> 要加& 等等细节
    yyf1234
        49
    yyf1234  
       2022-12-31 11:09:22 +08:00 via iPhone
    什么样的人才会觉得一门语言简单呢
    wangyu17455
        50
    wangyu17455  
       2022-12-31 11:16:57 +08:00
    语法简单可不代表写出来的代码简单,go 要是允许 java/js 那样的 lambda ,代码就会好看很多,但是 go 就是为了语法简单,方法前边必需放上 func 这四个字母,导致 go 版的 lodash 整个就一不伦不类的怪物
    EldersJavas
        51
    EldersJavas  
       2022-12-31 11:29:55 +08:00
    没有简单的语言,只有短浅的思想.
    挺搞笑的,每天都在议论一门语言的长短
    管他好坏,能挣钱的语言才是好语言,能创造价值的才是好语言
    每个人对好语言的定义都是不一样的
    因为每个语言给不同人创造的价值是不一样的
    有些人因为会很多语言而沾沾自喜,吹牛逼,
    是因为这些行为能给他带来价值,虚荣心的价值,
    和你们赚的钱是等值的
    简单和难是相对的,需要时间空间的洗礼,
    就像你高中时候学数学想跳楼,等到考研时再看发现自己是沙比一样.
    你说你顶不住 go 的宣传诱惑
    那是 go 给别人创造的价值,别人想让你用他也创造价值,
    你当然可以用 python 创造你的价值,或者其他语言
    我想,假如你学 go 能获得 1 个亿,
    那你肯定不是在抱怨,更别说在这里发帖抱怨了
    就是这样,如果你感觉对你有价值,就学
    没什么换的理由,就用原来的
    每天都在说某某语言很流行,某某语言很挣钱,
    如果他没法给你创造任何价值,
    如果他学习的价值跟创造的价值差的太远,
    那他就是答辩,别学了,还不如睡会觉


    最搞笑的是,连个符号都要分三六九等,长见识了
    iseki
        52
    iseki  
       2022-12-31 11:45:28 +08:00 via Android   ❤️ 7
    复杂度不会凭空消失,只会从一种形式转换到另一种形式
    chendl111
        53
    chendl111  
       2022-12-31 14:34:21 +08:00   ❤️ 1
    脱离业务谈语言复杂度毫无意义
    seakingii
        54
    seakingii  
       2022-12-31 14:44:11 +08:00
    简单不简单,是相对的.
    相对 C,C++,RUST 来说,GO 非常简单.

    另外 GO 的简单,还体现在工具链上.一个 GO 命令完成所有,包括复杂的交叉编译.
    最后还体现在生成物,一个二进制程序随便发布,很少有依赖问题.
    wangritian
        55
    wangritian  
       2022-12-31 15:16:09 +08:00
    我对所有语言都没有特别的喜恶,不同项目有不同的最优解,工具罢了,多关注它们的优势和擅长的领域
    wjx0912
        56
    wjx0912  
       2022-12-31 15:48:46 +08:00
    如果说 haskell ,rust 是在矿上挖煤; golang 就是在白领在办公室吹空调
    Breacher
        57
    Breacher  
       2022-12-31 16:11:29 +08:00 via iPhone
    首份工作是 Android 开发,在公司的内部机会开始 Go 后端开发。做 Android 差不多 3 年还是一名 Java 和 Android 菜鸟,换工作时果断转到 Go 后端,至此头也不回转了 Go ,从未有过使用 Java 工作的想法,除非以后需要开发大数据产品。
    Leviathann
        58
    Leviathann  
       2022-12-31 16:38:28 +08:00
    @Breacher
    go 是流水线打螺丝
    haskell 是实验室做实验
    Leviathann
        59
    Leviathann  
       2022-12-31 16:39:14 +08:00
    @wjx0912

    @Breacher @点错了
    xsen
        60
    xsen  
       2022-12-31 17:25:25 +08:00
    折腾过 C/C++,还有跨平台的,才会真心觉得 Go 是真简单。C/C++一大堆依赖库,若还要支持多平台的话——如 Window/Linux/iOS/Android 诸如此类,是真的会死人的
    zagfai
        61
    zagfai  
       2022-12-31 18:48:37 +08:00
    int 不是默认大数系统的都复杂。
    geekzhu
        62
    geekzhu  
       2022-12-31 19:05:04 +08:00
    @Jony4Fun #26 699 刀的那个么?
    dog82
        63
    dog82  
       2022-12-31 19:56:07 +08:00
    go 有一个非常大的难点:有缓存的 chanel ,你的脑子得像 cpu 一样运行才行
    Aaron7Amelia
        64
    Aaron7Amelia  
       2022-12-31 20:00:49 +08:00
    我也觉得,GO 实际上应该对于有 c/c++ 深厚功底的人来说,会比较简单。如果之前只会 Java ,我觉得要真正理解 Go 背后的原理还是需要更多的努力
    Boyce
        65
    Boyce  
       2022-12-31 20:19:26 +08:00
    go 的语法,我很喜欢“支持多返回值”,很讨厌“通过大小写来控制访问级别”。
    likunyan
        66
    likunyan  
       2023-01-01 00:17:50 +08:00
    现代化的语言,我觉得很不错了。
    maigebaoer
        67
    maigebaoer  
       2023-01-01 00:52:49 +08:00 via Android
    @gowl 我最近就在看 F#,确实 beyond perfection
    loloxwg
        68
    loloxwg  
       2023-01-01 01:13:42 +08:00 via iPhone
    @tairan2006 rust 一直入不了门
    AItsuki
        69
    AItsuki  
       2023-01-01 01:54:32 +08:00 via iPhone   ❤️ 1
    go 的简单在于语法和工具链。另一层面就是特性简单,难听点就是缺失,比如很重要的范型也是最近才补上。另外还有方法重载,异常捕获等……
    但是在并发编程方面我愿称之为最强……
    mayli
        70
    mayli  
       2023-01-01 04:27:48 +08:00 via Android
    并行方面…我一个 python asyncio 吊打 go 携程的实现…
    Rooger
        71
    Rooger  
       2023-01-01 16:27:39 +08:00
    你对简单的确有误解,没有人规定比 XX 简单就是简单,因为你了解 Python 比较多就用 Python 比较,如果是这样,用 Python 就行啦,干嘛听别人忽悠?所以的东西都是相对而言的,说到底水平不行,看什么都是极其复杂的,语言的底层没有一个是简单的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5568 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:00 · PVG 14:00 · LAX 22:00 · JFK 01:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.