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

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

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

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

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

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

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

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

7852 次点击
所在节点    Go 编程语言
59 条回复
ic3z
2022-05-29 10:34:03 +08:00
别问,问就是语言特性。
不过 golang 的定义变量方式甩 JAVA 一条街。
liuxu
2022-05-29 10:39:44 +08:00
这就好比在问为什么胡萝卜是黄色的,白菜明明是绿色的为什么叫白菜
pastor
2022-05-29 10:39:48 +08:00
好家伙,我直呼好家伙!

你要是先学的 go 后学的其他语言,那你的这种问题是不是会更多?
Mohanson
2022-05-29 10:51:40 +08:00
你的问题就好像 "猫为什么要长的和狗不一样?"
cmdOptionKana
2022-05-29 10:54:20 +08:00
没有完美的设计,一切设计都是一种选择,都有得有失。

举个例子 “什么定义变量的方式有这么多?” 这个问题,你想象一下,如果让你来来设计语言,你只能选择:

1. 只提供一种定义变量的方式(优点是规则更少更清晰、更易理解,缺点是不方便)
2. 提供多种定义变量的方式(优点是方便,缺点是规则相对稍稍复杂一点)

你还有第三种选择吗?没有吧。

那么,你应该能发现,你无法做到完美、面面俱到,任何一种选择,都有缺点,你只能选择一种缺点。

顺着这个思路,你可以思考一下你的其他问题,这种选择它有什么优点,有什么缺点?(只要你愿意思考,不可能一个缺点、一个优点都找不到吧)
lsry
2022-05-29 10:56:48 +08:00
我的评价是非要标新立异,引起关注,增加使用者。
cmdOptionKana
2022-05-29 10:57:36 +08:00
@liuxu
@Mohanson

植物、动物、人类语言都是生长出来的,不是被设计出来的。生长与设计,是事物形成的两种截然不同的方式,区别很大,不能类比。
whenov
2022-05-29 10:59:43 +08:00
OP 问的明明是语言内部不一致的地方,而不是与其他语言不同的地方
none
2022-05-29 11:05:11 +08:00
你先去学习下 Rust ,就不会觉得 Go 的语法奇怪了
cmdOptionKana
2022-05-29 11:08:39 +08:00
@whenov 没想到是问内部不一致,因为我初看没有这个问题。

比如 package main 与 import 一个是声明本页代码属于哪个包,一个是引用其他包,完全是不同的功能,有不同的表现就很自然,反而如果让不同的功能用相同的表现才奇怪。因此没往内部不一致的方向想。
Lighthughjiajin
2022-05-29 11:14:00 +08:00
@cmdOptionKana 谢谢大佬,你的回答解决了我对 1 、2 、3 的疑虑。4 、5 的疑虑我在后续的学习,看看能不能自己悟道?
anxn
2022-05-29 11:14:18 +08:00
入乡随俗
SMGdcAt4kPPQ
2022-05-29 11:23:28 +08:00
先去学习下 Rust ,就觉得 Go 的语法更奇怪了
wdwwtzy
2022-05-29 11:26:59 +08:00
就是很奇怪啊,有些地方不严谨
cmdOptionKana
2022-05-29 11:34:55 +08:00
@Lighthughjiajin

4. 用 := 定义变量其实相当于一种语法糖,这种语法糖的好处是方便,缺点是类型不够明显,传统的写明类型的方式的优点是类型很明显,可以减少 “不小心” 造成的错误。

同时,Go 语言的创造者是 C 语言的老玩家了,像这样的老玩家有一个思想是:如果定义的地方与调用的地方离得远,就需要更清晰,如果定义的地方与调用的地方离得近,就可以更追求简化与方便。比如变量名,如果定义完马上就用,并且在很小范围内用,超出范围就不用了,这样的变量就可以用 i, x, y 之类的单字母,而使用范围越大的变量,就越倾向于用更长的名字。

因此, := 限制在函数内使用就很合理了。

5. const 不是变量,是常量。常量的用途通常是全局性的,而且数量通常也很少,并且通常会集中在一个地方定义,因此不容易出现 “因忘记使用变量而产生 bug” 的情况,而且常量还涉及较长远的设计,有时会先定义一堆常量,后续再慢慢用。

但变量不一样,绝大多数情况下变量定义完都是马上就要用的,如果忘了用,极大可能产生 bug 。
linglin0924
2022-05-29 11:52:41 +08:00
周经贴,没意思了都
surbomfla
2022-05-29 11:55:30 +08:00
别钓了,鱼塘里全是钩子,没有鱼了
xxfye
2022-05-29 12:19:28 +08:00
讲真,吐槽这些没意思,不如吐槽 interface {} 满天飞,绝对一大波人赞同你。
dacapoday
2022-05-29 12:20:48 +08:00
问题 1 ,go 是特意设计 import 后跟字符串的,将包导入与实现方式解耦
adoal
2022-05-29 12:25:54 +08:00
你标题“为什么我觉得 GO 有些语法很奇怪”,内文问的实际上是“为什么 GO 有些语法很奇怪”😄
如果是针对你在标题里的字面提问,那回答就是因为你习惯了其它语言,暂时不适应 go 呗。大部分编程语言为了实用的考虑或者因为有历史局限总会有不少不一致的地方,只不过适应了就不觉得了。

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

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

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

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

© 2021 V2EX