C++程序员是如何评价GO语言的(2)

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

没有type声明的隐式转换

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

type Meters int type Feet int var a Meters = 100 var b Feet = a

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

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

type Meters int var a Meters = 100 // No problem. var i int = 100 var b Meters = i // Will not compile. 没有枚举(enum)

GO语言没有枚举,应该使用带 iota关键字的常量代替,虽然C ++代码可能有这样的:

enum class Continent { NORTH_AMERICA, SOUTH_AMERICA, EUROPE, AFRICA, ... }; Continent c = Continent::EUROPE; Continent d = 2; // Will not compile

在GO语言中,应该这样:

type continent int const ( CONTINENT_NORTH_AMERICA continent = iota CONTINENT_SOUTH_AMERICA // Also a continent, with the next value via iota. CONTINENT_EUROPE // Also a continent, with the next value via iota. CONTINENT_AFRICA // Also a continent, with the next value via iota. ) var c continent = CONTINENT_EUROPE var d continent = 2 // But this works too.

请注意, 与 c++ 枚举 (尤其是 C++11) 相比, 每个值的名称必须有一个显式前缀,并且编译器不会阻止您将枚举值分配给枚举类型的变量。如果在switch/case模块中漏写,编译器不会警告你,因为GO编译器不会将这些值视为一组关联的数值。

Switch/Case: 默认没有fallthrough

译者注:go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch,但是可以使用fallthrough强制执行后面的case代码,fallthrough不会判断下一条case的expr结果是否为true。

在C和C ++中,您几乎需要每个case之后有break语句。 否则,下面case块中的代码也将运行。 这可能是有用的,特别是当您希望相同的代码响应多个值运行时,但这不是常见的情况。 在Go中,您必须添加一个明确的fallthrough关键字来获取此行为,因此代码在一般情况下更为简洁。

Switch/Case: 不仅仅是基本类型

与C和C ++不同,在Go中,您可以切换任何可比较的值,而不仅仅是编译时已知的值,如int,enums或其他constexpr值。 所以你可以打开字符串,例如:

switch str { case "foo"doFoo() case "bar"doBar() }

这很方便,我想它仍然被编译为高效的机器代码,当它使用编译时值。 C ++似乎已经抵制了这种方便,因为它不能总是像标准的 switch/case一样有效,但是我认为当人们希望更加意识到映射,不必要地将switch/case语法与C的原始含义联系起来。

指针,但没有间接引用运算符(->),没有指针运算

Go具有普通类型和指针类型,并使用C和C ++中的*和&。 例如:

var a thing = getThing(); var p *thing = &a; var b thing = *p; // Copy a by value, via the p pointer

与C ++一样,new关键字返回一个指向新实例的指针:

var a *thing = new(thing) var a thing = new(thing) // Compilation error

这类似于C ++,但不同于Java,其中任何非基本类型(例如,不是int或booleans)都可以通过引用(它只是看起来像一个值)被有效地使用,刚开始可能会使使用者混淆,通过允许这种疏忽的共享机制。

与C ++不同,您可以使用相同的点运算符调用值或指针上的方法:

var a *Thing = new(Thing) // You wouldn't normally specify the type. var b Thing = *a a.foo(); b.foo();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/798747d98c4f04f7c0dc7463441c19a6.html