大家好! 今天,我们将分享文章“ Go中什么是什么,什么不是什么”的翻译的最后部分。 我们提醒您,在
第一部分中我们讨论了Go中的元素,今天我们将讨论Go中没有的元素。
预期在Golang开发人员课程中将开始新的翻译,请准备此材料的翻译。
回顾一下Go的创建过程,它的基本包确实组成精良:它具有垃圾回收,包,一流的功能,词法作用域,系统调用接口和不可变的行,其文本通常以UTF-8编码。 但是它具有相对较少的功能,并且不太可能增加其数量。 例如,它没有隐式数值转换,没有构造函数或析构函数,没有运算符重载,没有默认参数值,没有继承,没有泛型,没有异常,没有宏,没有函数注释,也没有本地流存储。
Go中找不到的项目
隐式数字转换
在编程中,类型转换涉及将一个对象的数据类型更改为另一种。 隐式转换意味着此更改是由解释器或编译器自动进行的。 例如,将int值分配给先前分配了浮点值的变量。 此转换在Go中不可用。 如果在声明变量时未提及类型,则根据文字的语法为其分配适当的类型,例如,int,float,string等。 在下面的示例中,Go将引发错误,因为它将找到两种不同的数据类型,并且将无法使用它们。 发生这种情况是因为Go编译器将
int
隐式转换为
float64
。
a := 1.0
构造函数和析构函数
设计人员的任务是对象的主要处理和初始化,析构函数是在对象的使用寿命和可用内存耗尽后销毁对象。 与其他面向对象的范例不同,Go中没有类。 因此,构造函数和析构函数的概念也不存在。
操作员超载
操作员重载是操作员可以执行用户定义的操作的方式。 运算符根据传递的参数进行操作。 例如,在C ++
+
可以使用运算符来组合字符串,以及将两个整数相加。 值“ +”也可以由用户定义,并根据程序的需要进行更改。 在JavaScript中,由于字符串的优先级较高,因此类型
'1' + 1
的运算将导致字符串
"11"
的输出。 这样的定义在Go中是不允许的,运算符严格地工作并且仅对某些数据类型的参数执行操作。
预设值
Go不允许在函数原型中或函数重载时使用默认值。 Go语言规范非常小,特别支持简化解析。 与其他语言不同,您可以在其中将默认值/可选参数传递给函数,而在Go中,您只能检查是否已传递值。 Go中使用默认值的另一种方法是这样的。
func Concat1(a string, b int) string { if a == "" { a = "default-a" } if b == 0 { b = 5 } return fmt.Sprintf("%s%d", a, b) }
传承
因为Go没有遵循熟悉的面向对象编程类的层次结构,所以Go中的结构不会彼此继承。 通常,继承是OOP语言中的过程,其中一个类继承其父级的属性和类方法。 继承可以深入到多个层次。 但是,在Go中,可以简单地通过提供指针或将其嵌入协作结构来编译结构。 下面给出了Go语言的示例组成。 替换类可以是Go中的接口。 接口还存在其他语言,但是Go接口是隐式满足的。
type TokenType uint16 type Token struct { Type TokenType Data string } type IntegerConstant struct { Token *Token Value uint64 }
通用编程
泛型编程是一种形式,我们可以插入称为泛型的模式,这些模式并不是真正的源代码,而是由编译器进行编译以将其转换为源代码。 让我们尝试以一种简单的方式来理解这些模式。 将编程中的模式视为一种形式。 我们创建了一个表格,其中模板的重要细节留为空白,以后需要在编译过程中填写。 然后,当我们需要从该模板创建内容时,我们只需指定详细信息,例如type。
template<typename T> class MyContainer {
上面的代码段是用C ++编写的。 模板没有提供类型,但是在初始化MyContainer时提供。 我们还可以根据需要指定其他类型,例如
float
,
double
等。 当对几种类型的数据集运行算法时,通用模板很有用。
例外情况
异常表示应用程序可能想要拦截的合理条件。 通过例外,我们可以解决程序可能无法运行的情况。 受检查的异常不会导致完全停止执行;可以对其进行拦截和处理。 Go也不例外;它只有接口和内置错误之类的错误。 错误和异常之间的主要区别是,它们表示严重的问题,应立即解决,因此Go编程变得更加严格。 Go中的错误需要在发生时进行明确检查。
巨集
宏是宏命令。 这是通过为一组给定的输入定义预定义的输出来最大程度地减少重复编程任务的方法。 例如,如果要在C中获得一个数字的平方,我们可以简单地编写
x * x
,其中
x
是一个变量,但是我们也可以定义一个宏,该宏在每次需要时都返回一个数字的平方。 宏不是函数。 宏在Go中不可用。
#define square(x) ((x) * (x)) int main() { int four = square(2);
功能注释
注释是一种将元数据与功能参数相关联的方法。 在Python中,注释在语法上受支持,并且是完全可选的。 让我们看一个描述Python中注释的小例子。
def foo(a: int, b: 'description', c: float) -> float: print(a+b+c) foo(1, 3, 2)
在上面的代码中,参数
a
,
b
和
c
带有一些元数据。
a
和
c
int
和
float
类型注释,而
b
提供了字符串描述。 尽管注释中提到了参数的类型,但
foo
输出特定的输出。
本地流存储
本地流存储是一种计算机编程方法,它使用本地化到流的静态或全局内存。 这是一个静态区域,将为程序中的每个流复制数据。 当多个流将相同的静态数据用于同一任务时,它们可以从本地流存储中复制它们,而不必自己存储。
结论
Go专注于简约和优雅。 它具有快速,小型和简单的语法。 与其他OOP语言不同,它具有较少的概念应放在头脑中。 Go的创建者选择了语言的简单性,而没有增加语言相邻部分的乘法复杂性。 因此,Go没有使解析器变慢和变大的功能。 简单是优质软件的关键。
注意 本文中的代码段是从Internet上的各种文章中复制而来的。
仅此而已。
阅读第一部分