C程序员是如何评价GO的

作者丨Murray

翻译丨王江平

此文主要对GO语言的简单语法做了详细描述,并与C、C++、Java作了比较,以下为译文。

我正在读由BrianKrnighan和AlanDonovan编写的《ThGoProgrammingLanguag》这本书。这是一本在语义、编排和例程选取方面都勘称完美的语言类书籍。没有华而不实,而是精简设计,摒除长篇阔论。

作为一个C++和Java的狂热开发者,并不是衷情于所有语言。这似乎是对C的一个改进版本,所以我宁愿使用GO而不是C,但我仍然向往C++的强大表达力。我甚至怀疑,由于安全功能,Go无法实现C或C++的原始性能,尽管这可能取决于编译器优化。但是,明智地选择性能安全是非常有效的,特别是如果想获得比Java更多的安全性和更高的性能。

我将选择使用GO而不是C++来实现一个使用并发和网络的概念程序的简单证明。我会在以后的帖子中提及Goroutins和channls,一种方便的抽象,Go有HTTP请求的标准API。并发性很强,在编写网络代码时,很容易选择安全性。

下面是一些本人关于简单功能的肤浅见解,其中大部分看起来都是对C的简单改进。在

第2部分中,我将提到更高级的功能,我希望可以做一个关于并发的第3部分。我强烈建议您阅读本书以便正确理解这些问题。

欢迎友善的纠正和澄清。免不了有几个错误,希望没有重大失误。

行尾没有分号

我们从简单的入手。与C,C++或Java不同,Go在代码行的末尾不需要分号。所以出现下面的情形:

a=b

c=d

这对于将GO作为 门编程语言来学的人来说可能更好。对于分号问题可能需要一段时间来适应。

if和for语句没有括号

这是另一个区别。与C或Java不同,Go不将其条件放在括号内。这是一个小小的变化,感觉很随意,可能会使C程序员感觉不舒服。

例如,在Go中,我们可以这样写:

fori:=0;i;i++{

...

}

ifa==2{

...

}

用C语言是这样:

for(inti=0;i;i++){

...

}

if(a==2){

...

}

类型推断

Go有类型推断,从文本值或函数返回值,所以你不需要声明编译器能识别的类型。这有点像C++的auto关键字(从C++11开始)。例如:

vara=1//Anint.

varb=1.0//Afloat64.

varc=gtThing()

还有一个:=语法,避免了var的需要,虽然我不认为在语言中都需要:

a:=1//Anint.

b:=1.0//Afloat64

d:=gtThing()

我喜欢使用C++中的auto关键字进行类型推理,感觉使用没有这个语法的语言真的很痛苦。相比之下,java显得有点繁琐,但也许java会实现这种用法。我不明白为什么C不能这样做。毕竟,它们最终允许在函数开始时声明变量,所以改变是可能的。

名称后的类型

GO有变量/参数/函数名称后的类型,感觉相当随意,尽管我猜想是有原因的,我个人可以适应。所以,在C中可以这样:

Foofoo=2;

但是GO语言却这样写:

varfooFoo=2

保持一个更类似于C的语法将会使C开发人员轻松地入门。这些人往往不会接受语言的细微变化。

没有隐式转换

Go不存在类型之间的隐式转换,例如int和uint,或者float和int。==和!=也是如此。

因此,这不会被编译:

varaint=-2

varbuint=a

varcint=b

vardfloat64=1.

varint=c

C编译器警告可以捕获其中的一些,但是a)人们通常不会打开所有这些警告,并且它们不会将警告作为错误,b)警告不是严格的。

请注意,Go的类型是在变量(或参数或函数)名称之后,而不是之前。

注意一点,与Java不同,Go仍然具有无符号整数。与C++的标准库不同,Go使用带符号整数的大小和长度。真心希望C++也能做到这一点。

没有typ声明的隐式转换

Go甚至不允许类型之间进行隐式转换,在C中,只能是typdf。所以,这不会编译:

typMtrsint

typFtint

varaMtrs=

varbFt=a

在使用typdf时,我想在c和c++编译器中看到这是一个警告。

但是,允许隐式地将文本(非类型化)值赋给类型变量,但不能从基础类型的实际类型变量中分配:

typMtrsint

varaMtrs=//Noproblm.

variint=

varbMtrs=i//Willnot







































鍖椾含鍝噷娌荤枟鐧界櫆椋庢渶濂芥渶缁欏姏
鏈変粈涔堟不鐤楃櫧鐧滈鐨勬柟娉?



转载请注明:http://www.xxcyfilter.com/zyfl/6995.html