昨天学习了下 go 语言,一开始画风还挺正常的,直到我看到数组和 MAP,感觉语法好绕人
具体见 https://tour.golang.org/moretypes/22
感觉 go 语言比 Python 绕脑子多了啊
个人用过 C 和 PYTHON
1
legendlzy 2018-01-23 11:46:41 +08:00 2
用过 c 的人。。。会觉得 golang 绕吗。。。
|
3
Luckyray 2018-01-23 11:53:36 +08:00 1
声明的时候类型放后面就挺诡异的...
|
5
aksoft 2018-01-23 11:55:53 +08:00
map[int]map[int]*Node
还行。。。 |
7
JamesRuan 2018-01-23 11:56:51 +08:00 4
心里默念:make m a Map of int to string。写出来是`m := make(map[int]string)`,不知道有啥绕的
|
8
janxin 2018-01-23 11:59:45 +08:00
你就当 C 处理嘛~
|
9
kevindu 2018-01-23 12:00:51 +08:00 1
其实写多了,就觉得还是 Python 爽。
```python " ".join([item[::-1] for item in s.split(' ')]) ``` 像这种一句话写完的 Python 代码,用 go。。。 |
10
SuperMild 2018-01-23 12:02:32 +08:00
静态类型比动态类型绕,这不是很正常吗,与 Python 比明显不合适。另外,go 也不是典型的面向对象语言,如果硬要把面向对象那套思维往 go 上套,也会感觉怪异。
|
11
PythonAnswer 2018-01-23 12:02:52 +08:00 via Android
上面 python 是倒着来的。人家面向对象的看着就鄙视俺们。
|
13
htfy96 2018-01-23 12:03:22 +08:00 via Android 1
其实我不是很懂:一门设计成 better C 的语言为什么经常被和 Python 和 JavaScript 比较,而且还经常有人推荐前端去学 Go😷
|
14
enenaaa 2018-01-23 12:07:54 +08:00
这两天也在看 go。
我觉得定义 struct 时,前面的 type 真心多余啊。还有成员方法的定义方式, 也是蛋疼。 |
15
SuperMild 2018-01-23 12:12:39 +08:00
Golang 的优点是语言特性少,可以在很短时间内学完全部语言特性,看别人写的代码非常清晰易懂,运行效率高,编译速度极快,协程非常易用好用。
这些才是 golang 最优先考虑的东西,为了优先实现这些特点,golang 现在的语法已经设计得非常好了。 map 和 slice 之所以是现在这个样子,正是因为受到上述特点的限制。你无法一方面要求得到 golang 的全部主要优点,又同时得到 python 的优点,如果你能做到,你就超越的当今世上最顶尖的那一批语言专家了。 |
16
eslizn 2018-01-23 12:17:43 +08:00 1
黑 go 的姿势不对,要黑得黑泛型
|
17
boywhp OP @SuperMild 我觉得你说的优势完全可以用 C 加一个好用的库搞定了!说实在的,我怎么觉得 C 语言语法都比 go 好理解
|
18
XIVN1987 2018-01-23 12:28:18 +08:00 via Android
我是觉得 go 语法丑,,比如定义 method 的时候,,接收器、参数、返回值三个括号,挺丑
|
19
SuperMild 2018-01-23 12:35:35 +08:00
@boywhp 你是说的原生 C 的易学易用、编译速度、协程的易用好用程度比 go 好?????(此处省略一万个问好)
至于用 C 写些库或者啥的能不能最终实现类似 golang 的各种特性,当然可以啊,但结果只是重新发明 golang 而已。 |
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. |
21
SuperMild 2018-01-23 12:41:34 +08:00
C 连 gc 都没有,而且 C 是目前主流编程语言中罕见的弱类型,也就是说连完整类型系统都没有,高手可以用好 C,但说 C 易学易用是不是夸张了,golang 你看别人写的代码,比 python 还要清晰易懂,C 能达到这个效果?
|
22
fuyufjh 2018-01-23 12:43:47 +08:00
其实 C 的语法更绕,不信你定义一个函数指针数组试试
|
24
boywhp OP @SuperMild 我上面说得够清楚了! C 语法更好理解,效率更高,配合网络方面的库 开发高性能的代码只会比 go 更快!我想用 go 不就是图语法更易用么?性能差点也能接受,Python 这么流行和他语法设计优雅有很大关系,Python 语法才是正常人思考方式,go 不是
|
25
cabing 2018-01-23 12:54:04 +08:00
可以先用用 rust~~再回头看 go
|
26
PureWhite 2018-01-23 12:54:17 +08:00
等有一天,楼主需要写库造轮子的时候,就会知道 go 的好了。。。。
用 Python 没有类型的痛啊。。。。 |
27
boywhp OP C 的核心语法规则比 go 容易学多了! go 的规则比 C 还多,我才看到 map 就已经记不住了
|
28
PureWhite 2018-01-23 12:59:02 +08:00
@boywhp Python 从语法优雅性上确实比 go 要好很多,但是毕竟 go 并非动态语言,还是比较看重性能的,所以语法上的设计也是不得已。
有时候自己写一些小东西还是 Python 用的顺手,但是真正做一些大一些的东西 Python 就有点力不从心了。用 C 又太繁琐,特别是如果没有现成的东西给你用的时候。Go 正是适应这种场景。 |
29
boywhp OP @PureWhite 这么多语言,造的轮子还不够么? java 和 Python 的库不比 go 更丰富?为何 C 语言这么多年还能经久不衰?
|
30
evilgod528 2018-01-23 13:13:02 +08:00
go 的语法够简单了
|
31
myself659410 2018-01-23 13:56:12 +08:00
学习 c 到 golang 我觉得很简单 三天基本上就可以上手写代码
|
32
mason961125 2018-01-23 14:02:15 +08:00 2
说句不好听的,学一个语言的时候,如果你是真的想学,就要抛弃你以前有的那些语言习惯,尽最大努力去接受一门新语言的设定。但是以你目前的状态,抱着 C 的语言特性不放,处处和 Go 比较,能学好我是不相信的。
|
33
DOLLOR 2018-01-23 14:03:52 +08:00
类型放在后面挺好的,用过 pascal 不会觉得难受。
再看看类 C 语言把类型写在前面的,定义一个函数指针就知道有多蛋疼。 |
34
mason961125 2018-01-23 14:17:03 +08:00
@boywhp C 经久不衰有它独特的原因,操作系统用啥写你我都知道。Java Python 在系统级上的能力基本为 0,你不用 C 你用什么?
|
35
rockyou12 2018-01-23 14:24:58 +08:00
LZ 要是有结论那发个帖干嘛?人家和你讨论你又撒泼打诨,golang 好不好,全球这么多开发者、这么多项目已经证明了。你主观喜不喜欢那是你自己的事,用得着发个帖找存在感?
|
36
Mogugugugu 2018-01-23 14:25:50 +08:00
@htfy96 一门设计成 better C 的语言把 Java 干趴下了,哈哈哈哈😄
|
37
mengzhuo 2018-01-23 14:35:51 +08:00
|
38
butaixianran 2018-01-23 14:51:44 +08:00
go 就是输在了语法、错误处理 和 垃圾回收上,别的都很完美了。
可以理解为,go 为了保持高性能,牺牲了语法上的便利。 之前用 go 写网络服务,真心觉得不值得,网络服务几乎全是操作 Json,用 go 写起来累死,换 nodejs 开发快很多倍。 go 还是用来折腾文件系统算了,和网络有关的,基本都是数据库添删改查,折腾 json,go 就没优势了。 |
39
SuperMild 2018-01-23 14:53:15 +08:00
@boywhp 看到你说学习 go 的原因了 “想用 go 就是图语法更易用”,不知道你从哪里看来得误会,go 的语法从来不是主要卖点,大多数言论对 go 的语法评价都是毁誉参半。
如果目的是语法,建议学 Kotlin,这才是以语法为主要卖点的语言,而且得益于强大的 java 虚拟机,性能不能说差,至少比 python 好,还能利用 java 的生态,生态方面比 go 和 C 都好,貌似更符合你的要求。 |
40
neoblackcap 2018-01-23 15:29:40 +08:00
Golang 的类型声明完全不是问题,说 C 简单的请看 void (*signal(int sig, void (*func)(int)))(int),这个函数到底是接收什么参数返回什么什么呢?
|
41
boywhp OP 好吧!这里我还是要感谢各位朋友热情指点,我大致了解了 go 的优缺点,虽然我已经操起了 pycharm
|
42
2225377fjs 2018-01-23 15:33:15 +08:00
哈哈,上面有人说:“ golang 你看别人写的代码,比 python 还要清晰易懂”
这是真的么。。 |
43
49gd 2018-01-23 15:42:47 +08:00
c 基本是底层语言了吧 怎么替代他。。
|
44
owenliang 2018-01-23 15:49:12 +08:00
你如果搞过 C,我觉得 GO 应该是你喜欢的东西吧?也许只是没有实际项目上手而已,写起来是很痛快的。
|
45
zjsxwc 2018-01-23 16:00:23 +08:00
Go 语法还好吧,习惯就好,不过写的代码方法名首字母大小写混合起来用,逼死强迫症。。
但起码 Go 写起来比 C 爽 |
46
mooncakejs 2018-01-23 16:15:58 +08:00
我是不会懂 make(map[int]string) 还觉得方便的人的思维的
为什么总喜欢自行一套,不支持泛型,对 array,map 开个后们也行啊,map<int,string>() 不好吗,又没有学习成本。 |
47
wizardforcel 2018-01-23 16:41:13 +08:00
@boywhp 都是 AOT 的,谁也差不多。你需要自己提供 benchmark。
|
48
PureWhite 2018-01-23 17:00:50 +08:00
@boywhp 如果你永远想着躺在别人的轮子上工作,你是创造不出新的东西的。比如我现在工作中,很多东西是没有轮子可以用的,我们是在自己造轮子。
人各有志,如果你只是想一辈子当一个普通程序猿,调用调用别人的 API,当个 API 搬运工,那欢迎使用 Python。 或者如果你是精通系统底层大牛,追求极致性能或者喜欢自己动手管理内存等,那欢迎使用 C。 每个语言有其设计出来的目的和取舍,没有东西是十全十美的,就像 C/C++,Python,Java 都有其各自的优劣,Go 也是如此。 语言之争是没意义的,说到底,语言只是工具,关键就在于你能不能扬长避短,对于你的业务选择合适的语言。 比如你既然觉得 Python 好,为什么不用 Python 写系统?你既然觉得 C 好,为什么不用 C 写你的所有项目? |
50
chaselen 2018-01-23 18:30:39 +08:00
当初写 C# 转 Objective-C 的时候也是感觉很诡异。几个月后才适应
|
51
koebehshian 2018-01-23 19:06:59 +08:00
确实诡异,将数据放到管道的写法是 channel <- data, 从管道读一个值给变量还要加等号 data = <-channel
|
52
miketeam 2018-01-23 19:12:14 +08:00 via iPhone
用过 oc 的表示 go 好亲切
|
53
justfly 2018-01-23 19:56:29 +08:00
我一开始也这样,过了一两年就习惯了。
PS. 我现在觉得 Java 语法 + golang runtime 用起来会比较舒服。 |
54
mason961125 2018-01-23 20:03:27 +08:00
@koebehshian 难道不是很形象吗?
|
55
huclengyue 2018-01-23 20:10:37 +08:00 via Android
@Luckyray kotlin 也这样。。。习惯就好
|
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). |
57
koebehshian 2018-01-23 20:17:07 +08:00
@mason961125 我觉得直接 data <- channel 就行了。可能赋值有 = 与 := 两种,所以变成 data = <- channel 这样两个运算符写在一起很奇怪
|
59
muziki 2018-01-23 20:30:01 +08:00 via iPhone
@cabing 仅仅就楼里提的比较多的变量名来说,rust 的冒号显然可读性提高了不少,go 要靠用户自己去分词
|
60
0915240 2018-01-23 20:44:45 +08:00
javaer 表示还好 能接受
scala 倒是放弃了 |
61
winglight2016 2018-01-23 20:59:50 +08:00
@kevindu item[::-1],这里两个冒号没看懂。。。为什么 str 直接就变成倒序了?
|
62
searene 2018-01-23 21:12:36 +08:00
Python 一点也不绕
C 就是坑多一些,容易犯错,也没有什么特别的地方 要是比绕,还是得跟 Scala 比 |
63
winglight2016 2018-01-23 21:29:21 +08:00
@PureWhite 你要真觉得语言之争没意义,就不需要用搬运工来比喻应用开发,用大牛来比喻系统底层开发——大家都是程序员,搞鄙视链毫无意义
|
64
SuperMild 2018-01-23 22:16:14 +08:00
@koebehshian 如果采用你的方案,当看到 a <- b 时,有三种可能性!即:1.传消息进 a,2.从 b 传消息出来并赋值给 a,3.从 b 直接传消息进 a
而原方案只有一种可能,明显更简洁、清晰、系统复杂度低、人脑负担轻。 |
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 就变成了倒序了,因为成了从最后一个元素到第一个元素。 |
66
zonghua 2018-01-24 00:41:16 +08:00
@mooncakejs 哈哈你这不就是 C# 吗
|
67
Clarencep 2018-01-24 08:53:32 +08:00
还好吧,只是觉得 interface{} 写起来会很蛋疼,所以偶一般会定义个 any 类型:
type any interface{} |
68
KgM4gLtF0shViDH3 2018-01-24 09:12:43 +08:00
@tulongtou #4 swift 好像也这样吧
|
69
anasplrt34 2018-01-24 09:50:00 +08:00
@Clarencep 塞进来爽 取出来就傻逼了 要搞一大堆的类型断言
|
70
sumu 2018-01-24 10:08:39 +08:00
Go 的作者虽然都老牛逼了,但一看语法规范,我就知道这帮家伙,肯定都是强迫症重度患者加控制狂,尼玛的
ps:scala 语法我觉得蛮好的,写多了 scala 代码,真的不愿意写 c++代码,就是代码的可读性差,不停的点下去,几个月不看代码,自己也懵逼 |
71
Tyanboot 2018-01-24 10:40:06 +08:00
@winglight2016 切片有第三个参数, 为步长, -1 的时候就是逆序 1 的步长. 也就是整个逆序了.
|
72
Kilerd 2018-01-24 10:40:25 +08:00
我觉得最难以接受的几点在于:
1. 类和函数都是大写字母开头,这样就挺难分清楚的了 2. 那个叫啥来着,用反引号 ` 做 json validation format。 这个感觉挺反人类的。 |
74
jseanj 2018-01-24 10:52:40 +08:00
我倒是觉得 go 的错误处理是个坑,if err != nil 真是满满登登啊
|
76
Hellert 2018-01-24 10:56:57 +08:00
习惯问题
|
79
winglight2016 2018-01-24 11:31:47 +08:00
|
81
mysticzt123 2018-01-24 23:32:44 +08:00
刚开始我还觉得 a := 1 这种东西还很绕的 还有_ 表示忽略返回值,后来就习惯了
|