此文主要对GO语言的简单语法做了详细描述,并与C、C++、Java作了比较,以下为译文。
我正在读由Brian Kernighan和Alan Donovan编写的《The Go Programming Language》这本书。 这是一本在语义、编排和例程选取方面都勘称完美的语言类书籍。 没有华而不实,而是精简设计,摒除长篇阔论。
作为一个C ++和Java的狂热开发者,并不是衷情于所有语言。这似乎是对C的一个改进版本,所以我宁愿使用GO而不是C,但我仍然向往C ++的强大表达力。 我甚至怀疑,由于安全功能,Go无法实现C或C ++的原始性能,尽管这可能取决于编译器优化。 但是,明智地选择性能安全是非常有效的,特别是如果想获得比Java更多的安全性和更高的性能。
我将选择使用GO而不是C ++来实现一个使用并发和网络的概念程序的简单证明。我会在以后的帖子中提及 Goroutines和 channels,一种方便的抽象,Go有HTTP请求的标准API。 并发性很强,在编写网络代码时,很容易选择安全性。
下面是一些本人关于简单功能的肤浅见解,其中大部分看起来都是对C的简单改进。在
第2部分中,我将提到更高级的功能,我希望可以做一个关于并发的第3部分。 我强烈建议您阅读本书以便正确理解这些问题。
欢迎友善的纠正和澄清。 免不了有几个错误,希望没有重大失误。
行尾没有分号我们从简单的入手。 与C,C ++或Java不同,Go在代码行的末尾不需要分号。 所以出现下面的情形:
a = b c = d这对于将GO作为第一门编程语言来学的人来说可能更好。 对于分号问题可能需要一段时间来适应。
if 和 for 语句没有括号
这是另一个区别。 与 C 或 Java 不同,Go不将其条件放在括号内。 这是一个小小的变化,感觉很随意,可能会使C程序员感觉不舒服。
例如,在Go中,我们可以这样写:
for <>i := 0; i < 100; i++ { ... } if a == 2 { ... }用C语言是这样:
for (int i = 0; i < 100; i++) { ... } if (a == 2) { ... } 类型推断Go有类型推断,从文本值或函数返回值,所以你不需要声明编译器能识别的类型。 这有点像C++的auto关键字(从C ++ 11开始)。 例如:
var a = 1 // An int. var b = 1.0 // A float64. var c = getThing()还有一个 := 语法, 避免了 var 的需要, 虽然我不认为在语言中都需要:
a := 1 // An int. b := 1.0 // A float64 d := getThing()我喜欢使用C ++中的auto关键字进行类型推理,感觉使用没有这个语法的语言真的很痛苦。 相比之下, java显得有点繁琐, 但也许 java 会实现这种用法。 我不明白为什么C不能这样做。 毕竟,它们最终允许在函数开始时声明变量,所以改变是可能的。
名称后的类型GO 有变量/参数/函数名称后的类型, 感觉相当随意,尽管我猜想是有原因的,我个人可以适应。所以,在 C中可以这样:
Foo foo = 2;但是GO语言却这样写:
var foo Foo = 2保持一个更类似于 C 的语法将会使 C 开发人员轻松地入门。这些人往往不会接受语言的细微变化。
没有隐式转换Go不存在类型之间的隐式转换,例如int和uint,或者float和int。 == 和 != 也是如此。
因此,这不会被编译:
var a int = -2 var b uint = a var c int = b var d float64 = 1.345 var e int = cC编译器警告可以捕获其中的一些,但是 a)人们通常不会打开所有这些警告,并且它们不会将警告作为错误,b)警告不是严格的。
请注意,Go的类型是在变量 (或参数或函数) 名称之后, 而不是之前。