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

感觉 go 语法好诡异

  •  
  •   boywhp · 2018-01-23 11:38:44 +08:00 · 7667 次点击
    这是一个创建于 2257 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    个人用过 C 和 PYTHON

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    好操作,一下美观了不少!!
    Hellert
        76
    Hellert  
       2018-01-24 10:56:57 +08:00
    习惯问题
    XIVN1987
        77
    XIVN1987  
       2018-01-24 10:57:51 +08:00
    @Clarencep
    建议 Go 开发组直接将此加入标准库
    XIVN1987
        78
    XIVN1987  
       2018-01-24 10:59:10 +08:00
    @Kilerd

    深表赞同,,要是能把大小写区分 public 改成是否首字母下划线区分 public 就好了
    winglight2016
        79
    winglight2016  
       2018-01-24 11:31:47 +08:00
    @PureWhite
    @Tyanboot
    明白了,原来这就是切片啊,我一直以为切片只有两个参数
    PhilC
        80
    PhilC  
       2018-01-24 14:29:15 +08:00
    @Clarencep
    type Any = interface{}
    mysticzt123
        81
    mysticzt123  
       2018-01-24 23:32:44 +08:00
    刚开始我还觉得 a := 1 这种东西还很绕的 还有_ 表示忽略返回值,后来就习惯了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2822 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:39 · PVG 22:39 · LAX 07:39 · JFK 10:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.