为什么我觉得 GO 有些语法很奇怪?

2022-05-29 10:27:10 +08:00
 Lighthughjiajin

我是初学者,刚开始学习 Go ,遇到了下面这些问题…有没大佬给我讲讲 Go 为什么这么设计…

1 、为什么导入包的时候,需要使用双引号引起来,使用的时候确直接是包名(像 Java, Python 导入时不需要双引号,使用时也不需要,可以明确的知道导入对象后,给一个变量指向它)

2 、为什么 package main 的时候又不需要双引号引起来了?

3 、为什么定义变量的方式有这么多?

4 、为什么在函数体外又不能使用 := 定义变量?

5 、为什么使用 var 或者 := 定义的变量不使用,无法通过编译?但是 const 定义的变量却可以?

8191 次点击
所在节点    Go 编程语言
59 条回复
monetto
2022-05-29 20:37:24 +08:00
@pastor C/C++/Java 他们三个的语法大体是很像的。三者加起来市场占比也是最高的。Go 的语法个人感觉像是 C + Python 结合体。
gamexg
2022-05-29 20:38:15 +08:00
第一点,导入路径用引号。
我以前学某语言的时候,不记得是什么语言了,也是导入,但是导入库不需要引号。
当时就在想,这里不灵活了,不能动态生成导入路径。

嗯,这么看,应该是 python
印象 python 又有个专门的函数来实现变量作为导入路径。

不过其实也就是一个选择而已,
而且 go 时便已级别的,目前没看到有需要像 python 一样动态导入库的需求。


我比较赞同楼上说的,为了解决路径的转义问题。
直接用字符串,那么可以直接用现成的字符串转义表标准,不用再重新设计了。
AItsuki
2022-05-29 20:41:20 +08:00
问的很好,但大多都是语言设计的问题。有些写法单纯就是为了编译器好解析,偷懒了,最典型的偷懒例子就是 go 不支持函数重载。
gogogo1203
2022-05-29 20:41:32 +08:00
@acehowxx 出错了就包含这一层的 err ,往外抛,一直丢到该处理错误的那一层。这个方法放到哪里都是没有错的。再写个处理 err 的中间件,没毛病
Lighthughjiajin
2022-05-29 20:42:25 +08:00
@gamexg 你指的应该是 python 的 importlib
gogogo1203
2022-05-29 20:43:15 +08:00
每个星期都有一些自称“刚入门“go 的人开贴 diss 一下 go 的各种不足。有没有一种可能,他们是 100%对的呢?
Lighthughjiajin
2022-05-29 20:44:36 +08:00
谢谢大佬们的回答~
我平时主要写 Python ,偶尔写 JS 。
这次想学习 Go 是因为听说 Go 生成可执行文件方便,并且不好反编译(也就是保护源码)。
刚开始接触,遇到的这些情况,只是自己的思考,并没有批判的意思。
ZE3kr
2022-05-29 20:49:46 +08:00
很明显楼主最先接触的是 C 或是类 C 的语言

楼主可以看看 SML/NJ 、Ruby 、Lisp ,这些编程语言更奇怪(但也都非常有意思)
jiangzm
2022-05-29 20:52:03 +08:00
我的感觉 go 的语法是想出奇推新, 为了不一样而不一样, 你底层怎么设计无所谓,但是语法层面没必要一定要和类 C 语言不一样
iosyyy
2022-05-29 22:42:13 +08:00
@koebehshian 就是给偷懒找个接口 java 的 import 也不是有特殊字符吗..也是不很难解析啊
maigebaoer
2022-05-29 23:07:12 +08:00
go 团队说习惯了就不会奇怪
ragnaroks
2022-05-30 00:24:13 +08:00
用现在的话来说叫做粉丝提纯
pastor
2022-05-30 10:59:52 +08:00
@monetto c++的语法语义复杂度已经是编程语言天花板了,应该改名叫 Mediterranean Lang 。。。
RickyC
2022-05-30 12:28:40 +08:00
你这种写作格式很值得肯定, 分行分段, 自带行号.
koujianshusheng
2022-05-30 13:41:14 +08:00
语法不奇怪如何对的起新兴编程语言呢
zhanlanhuizhang
2022-05-30 13:51:32 +08:00
语法就是定义。创始者,觉得这样方便。
chrisia
2022-06-01 16:44:17 +08:00
我的评价是 go 简约但不优雅,另一个极端是 kotlin 优雅但不简约,java 是既不优雅也不简约
Lighthughjiajin
2022-06-03 22:18:30 +08:00
追加新问题
在我开始接触 Go 之前,有许多朋友跟我说,
1 、Go 的语法严格(例如 { 不能单独换行,结构体里的最后一项要有 , )
2 、Go 写的代码具有更好的可维护性 (和 Python 对比)

最近刚学到 struct ,感觉 struct 和 方法 分离的方式,不太利于代码维护,很可能会出现这个文件里定义了 struct ,另一个文件里定义了 方法,那读代码的时候就很麻烦。 虽然这种情况是认为造成的,但是为什么不设计的 struct 数据 和 方法在一起。 还是说 Go 这么设计有什么原因,或者其他有益的地方?
Lighthughjiajin
2022-06-03 22:23:56 +08:00
为什么解引用需要加括号?是因为 * 的优先级比 . 低 吗?
```
(*person).name. // <=> person.name
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855980

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX