V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
boywhp

感觉 go 语法好诡异

  •  
  •   boywhp · Jan 23, 2018 · 8610 views
    This topic created in 3020 days ago, the information mentioned may be changed or developed.

    昨天学习了下 go 语言,一开始画风还挺正常的,直到我看到数组和 MAP,感觉语法好绕人

    具体见 https://tour.golang.org/moretypes/22

    感觉 go 语言比 Python 绕脑子多了啊

    个人用过 C 和 PYTHON

    81 replies    2018-01-24 23:32:44 +08:00
    legendlzy
        1
    legendlzy  
       Jan 23, 2018   ❤️ 2
    用过 c 的人。。。会觉得 golang 绕吗。。。
    boywhp
        2
    boywhp  
    OP
       Jan 23, 2018 via Android
    @legendlzy 关键我还用过 Python
    Luckyray
        3
    Luckyray  
       Jan 23, 2018   ❤️ 1
    声明的时候类型放后面就挺诡异的...
    DonaidTrump
        4
    DonaidTrump  
       Jan 23, 2018 via iPhone
    @Luckyray 习惯就好,Scala 也这样
    aksoft
        5
    aksoft  
       Jan 23, 2018
    map[int]map[int]*Node
    还行。。。
    timothyye
        6
    timothyye  
       Jan 23, 2018
    @Luckyray swift 也这样
    JamesRuan
        7
    JamesRuan  
       Jan 23, 2018   ❤️ 4
    心里默念:make m a Map of int to string。写出来是`m := make(map[int]string)`,不知道有啥绕的
    janxin
        8
    janxin  
       Jan 23, 2018
    你就当 C 处理嘛~
    kevindu
        9
    kevindu  
       Jan 23, 2018   ❤️ 1
    其实写多了,就觉得还是 Python 爽。

    ```python
    " ".join([item[::-1] for item in s.split(' ')])
    ```

    像这种一句话写完的 Python 代码,用 go。。。
    SuperMild
        10
    SuperMild  
       Jan 23, 2018
    静态类型比动态类型绕,这不是很正常吗,与 Python 比明显不合适。另外,go 也不是典型的面向对象语言,如果硬要把面向对象那套思维往 go 上套,也会感觉怪异。
    PythonAnswer
        11
    PythonAnswer  
       Jan 23, 2018 via Android
    上面 python 是倒着来的。人家面向对象的看着就鄙视俺们。
    wekw
        12
    wekw  
       Jan 23, 2018
    @timothyye Swift 才不是这样,差别大了。

    golang 就是这个样子,带网络库的 C,写起来比较蛋疼。
    htfy96
        13
    htfy96  
       Jan 23, 2018 via Android   ❤️ 1
    其实我不是很懂:一门设计成 better C 的语言为什么经常被和 Python 和 JavaScript 比较,而且还经常有人推荐前端去学 Go😷
    enenaaa
        14
    enenaaa  
       Jan 23, 2018
    这两天也在看 go。
    我觉得定义 struct 时,前面的 type 真心多余啊。还有成员方法的定义方式, 也是蛋疼。
    SuperMild
        15
    SuperMild  
       Jan 23, 2018
    Golang 的优点是语言特性少,可以在很短时间内学完全部语言特性,看别人写的代码非常清晰易懂,运行效率高,编译速度极快,协程非常易用好用。

    这些才是 golang 最优先考虑的东西,为了优先实现这些特点,golang 现在的语法已经设计得非常好了。

    map 和 slice 之所以是现在这个样子,正是因为受到上述特点的限制。你无法一方面要求得到 golang 的全部主要优点,又同时得到 python 的优点,如果你能做到,你就超越的当今世上最顶尖的那一批语言专家了。
    eslizn
        16
    eslizn  
       Jan 23, 2018   ❤️ 1
    黑 go 的姿势不对,要黑得黑泛型
    boywhp
        17
    boywhp  
    OP
       Jan 23, 2018 via Android
    @SuperMild 我觉得你说的优势完全可以用 C 加一个好用的库搞定了!说实在的,我怎么觉得 C 语言语法都比 go 好理解
    XIVN1987
        18
    XIVN1987  
       Jan 23, 2018 via Android
    我是觉得 go 语法丑,,比如定义 method 的时候,,接收器、参数、返回值三个括号,挺丑
    SuperMild
        19
    SuperMild  
       Jan 23, 2018
    @boywhp 你是说的原生 C 的易学易用、编译速度、协程的易用好用程度比 go 好?????(此处省略一万个问好)
    至于用 C 写些库或者啥的能不能最终实现类似 golang 的各种特性,当然可以啊,但结果只是重新发明 golang 而已。
    JerryCha
        20
    JerryCha  
       Jan 23, 2018   ❤️ 1
    我觉得 C 要好理解,Go 的类型后置跟英语里用从句跟在后面补充描述一样
    C: This is an unsigned variable.
    Go: This is a variable which is unsigned.
    SuperMild
        21
    SuperMild  
       Jan 23, 2018
    C 连 gc 都没有,而且 C 是目前主流编程语言中罕见的弱类型,也就是说连完整类型系统都没有,高手可以用好 C,但说 C 易学易用是不是夸张了,golang 你看别人写的代码,比 python 还要清晰易懂,C 能达到这个效果?
    fuyufjh
        22
    fuyufjh  
       Jan 23, 2018
    其实 C 的语法更绕,不信你定义一个函数指针数组试试
    SuperMild
        23
    SuperMild  
       Jan 23, 2018
    @JerryCha 类型后置的其中一个目的是为了使指针声明更清晰,类型前置一旦和指针结合使用看起来更绕。
    boywhp
        24
    boywhp  
    OP
       Jan 23, 2018 via Android
    @SuperMild 我上面说得够清楚了! C 语法更好理解,效率更高,配合网络方面的库 开发高性能的代码只会比 go 更快!我想用 go 不就是图语法更易用么?性能差点也能接受,Python 这么流行和他语法设计优雅有很大关系,Python 语法才是正常人思考方式,go 不是
    cabing
        25
    cabing  
       Jan 23, 2018
    可以先用用 rust~~再回头看 go
    PureWhite
        26
    PureWhite  
       Jan 23, 2018
    等有一天,楼主需要写库造轮子的时候,就会知道 go 的好了。。。。
    用 Python 没有类型的痛啊。。。。
    boywhp
        27
    boywhp  
    OP
       Jan 23, 2018 via Android
    C 的核心语法规则比 go 容易学多了! go 的规则比 C 还多,我才看到 map 就已经记不住了
    PureWhite
        28
    PureWhite  
       Jan 23, 2018
    @boywhp Python 从语法优雅性上确实比 go 要好很多,但是毕竟 go 并非动态语言,还是比较看重性能的,所以语法上的设计也是不得已。
    有时候自己写一些小东西还是 Python 用的顺手,但是真正做一些大一些的东西 Python 就有点力不从心了。用 C 又太繁琐,特别是如果没有现成的东西给你用的时候。Go 正是适应这种场景。
    boywhp
        29
    boywhp  
    OP
       Jan 23, 2018 via Android
    @PureWhite 这么多语言,造的轮子还不够么? java 和 Python 的库不比 go 更丰富?为何 C 语言这么多年还能经久不衰?
    evilgod528
        30
    evilgod528  
       Jan 23, 2018
    go 的语法够简单了
    myself659410
        31
    myself659410  
       Jan 23, 2018
    学习 c 到 golang 我觉得很简单 三天基本上就可以上手写代码
    mason961125
        32
    mason961125  
       Jan 23, 2018   ❤️ 2
    说句不好听的,学一个语言的时候,如果你是真的想学,就要抛弃你以前有的那些语言习惯,尽最大努力去接受一门新语言的设定。但是以你目前的状态,抱着 C 的语言特性不放,处处和 Go 比较,能学好我是不相信的。
    AV1
        33
    AV1  
       Jan 23, 2018
    类型放在后面挺好的,用过 pascal 不会觉得难受。
    再看看类 C 语言把类型写在前面的,定义一个函数指针就知道有多蛋疼。
    mason961125
        34
    mason961125  
       Jan 23, 2018
    @boywhp C 经久不衰有它独特的原因,操作系统用啥写你我都知道。Java Python 在系统级上的能力基本为 0,你不用 C 你用什么?
    rockyou12
        35
    rockyou12  
       Jan 23, 2018
    LZ 要是有结论那发个帖干嘛?人家和你讨论你又撒泼打诨,golang 好不好,全球这么多开发者、这么多项目已经证明了。你主观喜不喜欢那是你自己的事,用得着发个帖找存在感?
    Mogugugugu
        36
    Mogugugugu  
       Jan 23, 2018
    @htfy96 一门设计成 better C 的语言把 Java 干趴下了,哈哈哈哈😄
    mengzhuo
        37
    mengzhuo  
       Jan 23, 2018
    @htfy96 #12 目标是 better C++
    不是 C

    Ken 老爷子自己发明了 C,Go 相当于重新来过,然后成了 better C。
    butaixianran
        38
    butaixianran  
       Jan 23, 2018
    go 就是输在了语法、错误处理 和 垃圾回收上,别的都很完美了。

    可以理解为,go 为了保持高性能,牺牲了语法上的便利。

    之前用 go 写网络服务,真心觉得不值得,网络服务几乎全是操作 Json,用 go 写起来累死,换 nodejs 开发快很多倍。

    go 还是用来折腾文件系统算了,和网络有关的,基本都是数据库添删改查,折腾 json,go 就没优势了。
    SuperMild
        39
    SuperMild  
       Jan 23, 2018
    @boywhp 看到你说学习 go 的原因了 “想用 go 就是图语法更易用”,不知道你从哪里看来得误会,go 的语法从来不是主要卖点,大多数言论对 go 的语法评价都是毁誉参半。

    如果目的是语法,建议学 Kotlin,这才是以语法为主要卖点的语言,而且得益于强大的 java 虚拟机,性能不能说差,至少比 python 好,还能利用 java 的生态,生态方面比 go 和 C 都好,貌似更符合你的要求。
    neoblackcap
        40
    neoblackcap  
       Jan 23, 2018
    Golang 的类型声明完全不是问题,说 C 简单的请看 void (*signal(int sig, void (*func)(int)))(int),这个函数到底是接收什么参数返回什么什么呢?
    boywhp
        41
    boywhp  
    OP
       Jan 23, 2018 via Android
    好吧!这里我还是要感谢各位朋友热情指点,我大致了解了 go 的优缺点,虽然我已经操起了 pycharm
    2225377fjs
        42
    2225377fjs  
       Jan 23, 2018
    哈哈,上面有人说:“ golang 你看别人写的代码,比 python 还要清晰易懂”
    这是真的么。。
    49gd
        43
    49gd  
       Jan 23, 2018
    c 基本是底层语言了吧 怎么替代他。。
    owenliang
        44
    owenliang  
       Jan 23, 2018
    你如果搞过 C,我觉得 GO 应该是你喜欢的东西吧?也许只是没有实际项目上手而已,写起来是很痛快的。
    zjsxwc
        45
    zjsxwc  
       Jan 23, 2018
    Go 语法还好吧,习惯就好,不过写的代码方法名首字母大小写混合起来用,逼死强迫症。。
    但起码 Go 写起来比 C 爽
    mooncakejs
        46
    mooncakejs  
       Jan 23, 2018
    我是不会懂 make(map[int]string) 还觉得方便的人的思维的
    为什么总喜欢自行一套,不支持泛型,对 array,map 开个后们也行啊,map<int,string>() 不好吗,又没有学习成本。
    wizardforcel
        47
    wizardforcel  
       Jan 23, 2018
    @boywhp 都是 AOT 的,谁也差不多。你需要自己提供 benchmark。
    PureWhite
        48
    PureWhite  
       Jan 23, 2018
    @boywhp 如果你永远想着躺在别人的轮子上工作,你是创造不出新的东西的。比如我现在工作中,很多东西是没有轮子可以用的,我们是在自己造轮子。
    人各有志,如果你只是想一辈子当一个普通程序猿,调用调用别人的 API,当个 API 搬运工,那欢迎使用 Python。
    或者如果你是精通系统底层大牛,追求极致性能或者喜欢自己动手管理内存等,那欢迎使用 C。
    每个语言有其设计出来的目的和取舍,没有东西是十全十美的,就像 C/C++,Python,Java 都有其各自的优劣,Go 也是如此。
    语言之争是没意义的,说到底,语言只是工具,关键就在于你能不能扬长避短,对于你的业务选择合适的语言。
    比如你既然觉得 Python 好,为什么不用 Python 写系统?你既然觉得 C 好,为什么不用 C 写你的所有项目?
    realpg
        49
    realpg  
    PRO
       Jan 23, 2018
    @htfy96 #13
    因为 google 装逼效应嘛
    就差让家里老太太扔了微信翻墙用 telegram 了
    chaselen
        50
    chaselen  
       Jan 23, 2018
    当初写 C# 转 Objective-C 的时候也是感觉很诡异。几个月后才适应
    koebehshian
        51
    koebehshian  
       Jan 23, 2018
    确实诡异,将数据放到管道的写法是 channel <- data, 从管道读一个值给变量还要加等号 data = <-channel
    miketeam
        52
    miketeam  
       Jan 23, 2018 via iPhone
    用过 oc 的表示 go 好亲切
    justfly
        53
    justfly  
       Jan 23, 2018
    我一开始也这样,过了一两年就习惯了。

    PS. 我现在觉得 Java 语法 + golang runtime 用起来会比较舒服。
    mason961125
        54
    mason961125  
       Jan 23, 2018
    @koebehshian 难道不是很形象吗?
    huclengyue
        55
    huclengyue  
       Jan 23, 2018 via Android
    @Luckyray kotlin 也这样。。。习惯就好
    WildCat
        56
    WildCat  
       Jan 23, 2018
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships.
    -- Torvalds, Linus (2006-06-27).
    koebehshian
        57
    koebehshian  
       Jan 23, 2018
    @mason961125 我觉得直接 data <- channel 就行了。可能赋值有 = 与 := 两种,所以变成 data = <- channel 这样两个运算符写在一起很奇怪
    muziki
        58
    muziki  
       Jan 23, 2018 via iPhone
    muziki
        59
    muziki  
       Jan 23, 2018 via iPhone
    @cabing 仅仅就楼里提的比较多的变量名来说,rust 的冒号显然可读性提高了不少,go 要靠用户自己去分词
    0915240
        60
    0915240  
       Jan 23, 2018
    javaer 表示还好 能接受

    scala 倒是放弃了
    winglight2016
        61
    winglight2016  
       Jan 23, 2018
    @kevindu item[::-1],这里两个冒号没看懂。。。为什么 str 直接就变成倒序了?
    searene
        62
    searene  
       Jan 23, 2018
    Python 一点也不绕
    C 就是坑多一些,容易犯错,也没有什么特别的地方

    要是比绕,还是得跟 Scala 比
    winglight2016
        63
    winglight2016  
       Jan 23, 2018
    @PureWhite 你要真觉得语言之争没意义,就不需要用搬运工来比喻应用开发,用大牛来比喻系统底层开发——大家都是程序员,搞鄙视链毫无意义
    SuperMild
        64
    SuperMild  
       Jan 23, 2018
    @koebehshian 如果采用你的方案,当看到 a <- b 时,有三种可能性!即:1.传消息进 a,2.从 b 传消息出来并赋值给 a,3.从 b 直接传消息进 a

    而原方案只有一种可能,明显更简洁、清晰、系统复杂度低、人脑负担轻。
    PureWhite
        65
    PureWhite  
       Jan 24, 2018
    @winglight2016 我的本意不是鄙视业务开发,应用开发未必就不是造轮子,毕竟各自的业务还是不同的,业务总不能也调 API 吧。。。。另外,我说的大牛,也未必是真正的大牛。我说这些的原因是因为楼主一直在强调,C 也有库可以用,java 和 python 库比 go 多 blabla。
    可能是我表达失误,在此道歉。

    另外,在 Python 里面,list 列表(就是你说的那玩意 item[::-1])的 中括号里面分为三个部分,分别是 [起始 index : 结束 index+1 : 步长],如果不写 起始 index 就默认是从第一个元素,如果不写 结束 index+1 就默认是到最后一个元素,那么如果说步长是 -1 就变成了倒序了,因为成了从最后一个元素到第一个元素。
    zonghua
        66
    zonghua  
       Jan 24, 2018
    @mooncakejs 哈哈你这不就是 C# 吗
    Clarencep
        67
    Clarencep  
       Jan 24, 2018
    还好吧,只是觉得 interface{} 写起来会很蛋疼,所以偶一般会定义个 any 类型:

    type any interface{}
    KgM4gLtF0shViDH3
        68
    KgM4gLtF0shViDH3  
       Jan 24, 2018
    @tulongtou #4 swift 好像也这样吧
    anasplrt34
        69
    anasplrt34  
       Jan 24, 2018
    @Clarencep 塞进来爽 取出来就傻逼了 要搞一大堆的类型断言
    sumu
        70
    sumu  
       Jan 24, 2018
    Go 的作者虽然都老牛逼了,但一看语法规范,我就知道这帮家伙,肯定都是强迫症重度患者加控制狂,尼玛的
    ps:scala 语法我觉得蛮好的,写多了 scala 代码,真的不愿意写 c++代码,就是代码的可读性差,不停的点下去,几个月不看代码,自己也懵逼
    Tyanboot
        71
    Tyanboot  
    PRO
       Jan 24, 2018
    @winglight2016 切片有第三个参数, 为步长, -1 的时候就是逆序 1 的步长. 也就是整个逆序了.
    Kilerd
        72
    Kilerd  
       Jan 24, 2018
    我觉得最难以接受的几点在于:
    1. 类和函数都是大写字母开头,这样就挺难分清楚的了
    2. 那个叫啥来着,用反引号 ` 做 json validation format。 这个感觉挺反人类的。
    Tyanboot
        73
    Tyanboot  
    PRO
       Jan 24, 2018
    @legendlzy 就是因为用 c/c++才会觉得 golang 很绕
    jseanj
        74
    jseanj  
       Jan 24, 2018
    我倒是觉得 go 的错误处理是个坑,if err != nil 真是满满登登啊
    XIVN1987
        75
    XIVN1987  
       Jan 24, 2018
    @Clarencep

    好操作,一下美观了不少!!
    Hellert
        76
    Hellert  
       Jan 24, 2018
    习惯问题
    XIVN1987
        77
    XIVN1987  
       Jan 24, 2018
    @Clarencep
    建议 Go 开发组直接将此加入标准库
    XIVN1987
        78
    XIVN1987  
       Jan 24, 2018
    @Kilerd

    深表赞同,,要是能把大小写区分 public 改成是否首字母下划线区分 public 就好了
    winglight2016
        79
    winglight2016  
       Jan 24, 2018
    @PureWhite
    @Tyanboot
    明白了,原来这就是切片啊,我一直以为切片只有两个参数
    PhilC
        80
    PhilC  
       Jan 24, 2018
    @Clarencep
    type Any = interface{}
    mysticzt123
        81
    mysticzt123  
       Jan 24, 2018
    刚开始我还觉得 a := 1 这种东西还很绕的 还有_ 表示忽略返回值,后来就习惯了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1235 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 196ms · UTC 17:12 · PVG 01:12 · LAX 10:12 · JFK 13:12
    ♥ Do have faith in what you're doing.