感觉 go 语法好诡异 - V2EX
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 8320 次点击
    这是一个创建于 2827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天学习了下 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
    声明的时候类型放后面就挺诡异的...
    DonaidTrump
        4
    DonaidTrump  
       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/td>
        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 比较,能学好我是不相信的。
    AV1
        33
    AV1  
       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  
    PRO
       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{}
    KgM4gLtF0shViDH3
        68
    KgM4gLtF0shViDH3  
       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  
    PRO
       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  
    PRO
       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     Solana     5441 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 05:52 PVG 13:52 LAX 22:52 JFK 01:52
    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