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

我喜欢这个。毕竟,编译器知道这个类型是一个指针还是一个值,所以为什么抱怨一下 a.。哪里应该有 a-> 反之亦然?然而,随着类型推断,这可能会轻而易举地掩盖您的代码是否处理指针(可能与其他代码共享值)或值。我想在C ++中看到这一点,尽管智能指针会很尴尬。

Go中不能做指针运算。例如,如果您有一个数组,则不能通过自加到指针值并取消引用该数组。你必须通过索引来访问数组元素,我认为这涉及边界检查。这避免了C和C ++代码中可能发生的一些错误,当您的代码访问应用程序内存的意外部分时,会导致安全漏洞。

Go函数可以通过值或指针获取参数。这就像C ++,但不同于Java,它总是使用非基本类型(非const)引用,尽管它可以看起来像初学者程序员一样被值复制。我宁愿使用代码显示通过函数签名发生的事情的两个选项,如C ++或Go。

像Java一样,Go没有const指针或const引用的概念。因此,如果您的函数将参数作为指针,为了提高效率,您的编译器无法阻止您更改其指向的值。在Java中,这通常是通过创建不可变类型来完成的,并且许多Java类型(例如String)是不可变的,所以即使你愿意也不能改变它们。但是我更喜欢语言支持,如C ++中的常量,指针/引用参数以及在运行时初始化的值。

References(引用), sometimes

Go似乎有引用(类似于值的指针),但仅适用于内置的slice,map和channel类型。 所以,例如这个函数可以改变其输入的滑动参数,即使参数没有被声明为一个指针,调用者也可以看到这个改变:

func doThing(someSlice []int) { someSlice[2] = 3; } 在C ++中,这将是一个明显的引用: void doThing(Thing& someSlice) { someSlice[2] = 3; }

我不知道这是否是语言的基本特征,或者只是关于这些类型的实现方式。 对于某些类型的行为来说, 这似乎有些混乱,我发现这个解释有点凌乱。 方便固然很好,但一致性更加重要。

常量(const)

Go的const关键字不像C(很少有用)或C ++中的const,它表示在初始化后不应该更改变量的值。 它更像C ++的constexpr关键字(自C ++ 11),它在编译时定义了值。 所以这有点像在C中通过#define定义的宏,而且是类型安全。 例如:

const pi = 3.14

请注意,我们不为const值指定类型,因此该值可以根据值的语法使用各种类型,有点像C宏#define。 但是我们可以通过指定一个类型来限制它:

const pi float64 = 3.14

与C ++中的constexpr不同,没有可以在编译时评估的constexpr函数或类型的概念,所以你不能这样做:

const pi = calculate_pi()

你不能这样做

type Point struct { X int Y int } const point = Point {1,2}

虽然你可以使用一个简单的类型,它的底层类型可以是const:

type Yards int const length Yards = 100 只有for循环

Go语言中的只有for循环 – 没有while或do-while循环。 与 C,C ++或Java语言相比,GO语言在这方面做了简化,尽管现在有多种形式的for循环。

例如:

for i:= 0; i < 100; i ++ { ... }

或者像C中的while循环一样:

for keepGoing { ... }

而for循环对于诸如字符串,切片或map之类的容器有一个基于范围的语法,我稍后会提到:

for i, c := range things { ... }

C ++有一个基于范围的for循环,C ++ 11以后版本,但我喜欢Go可以(可选)给你索引和值。 (它为您提供索引,或索引和值,让您忽略带 _ variable 名称的索引。)

本机(Unicode)字符串类型

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

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