Go中什么是什么,什么不是。 第一部分

大家好,在“ Golang开发人员”课程新线程开始前夕我们希望与您分享一篇有趣的文章的翻译,在第一部分中,我们了解了Go中的元素。 走吧



回顾一下Go的创建过程,它的基本包确实组成精良:它具有垃圾回收,包,一流的功能,词法作用域,系统调用接口和不可变的行,其文本通常以UTF-8编码。 但是它具有相对较少的功能,并且不太可能增加其数量。 例如,它没有隐式数值转换,没有构造函数或析构函数,没有运算符重载,没有默认参数值,没有继承,没有泛型,没有异常,没有宏,没有函数注释,也没有本地流存储。

阅读之前 :上面是Alan A. A. Donovan和Brian W. Kernigan所著《 Go Programming Language》的摘录。 第十四页 下面提到的项目是对设计编程语言时所用术语的简短且不完整的解释。 我试图用Go编程来解释所有概念。 以下提到的所有内容均不是我的著作,它们是摘录自其他摘录。 我绝不保护Go或任何其他语言。

现在,我们将尝试简要地理解每个术语。 对于一般编程的初学者来说,了解这些术语非常重要。 所有这些概念的含义适用于每种编程语言。 这些术语可以帮助您从根本上区分不同的语言。

Go中的元素


垃圾收集


任何执行自动内存管理的编程语言中都存在此机制。 要了解垃圾回收或内存管理,您首先需要了解内存本身的工作方式。 使用编程语言时,编译器会在系统中分配各种内存空间来存储数据,例如,创建变量,循环访问数组等。必须实现内存的分配和重新分配,以使程序更有效地使用内存。

在像C这样的语言中,内存是手动管理的。 如果您熟悉C,那么您会知道有一个malloc函数可以动态分配系统中的内存。 在高级语言(如JavaScript或Python)中,此分配由称为垃圾收集器的程序自动执行。 顾名思义,它的工作是管理内存,在需要时分配空间,在不再需要时释放已分配的内存。 Go实现了垃圾回收,因此程序员无需担心内存管理。

配套


打包是将所有源代码和资源组合到一个称为包的对象中。 该软件包在许多方面都很方便,例如易于安装,共享,添加,调试等。 Go有一个集成的软件包系统,该系统集成了文档,二进制文件和源代码文件。 打包的目的是在软件中使用其他软件项目,而无需手动复制源代码。

一流的功能


一流的函数是可以像处理其他任何变量一样进行处理的函数,也就是说,可以将其赋值,返回,导出,作为参数传递等。请看下面用Go编写的代码段。 打印字符串hello world first class function分配给变量a 。 变量a的行为类似于内存中的实际值,但是也可以通过在末尾添加()将其称为函数。 您还可以看到a的值以与其他任何变量相同的方式显示。 这是一流功能的基本概念。

 package main import ( "fmt" ) func main() { a := func() { fmt.Println("hello world first class function") } a() fmt.Printf("%T", a) } 

词汇范围


程序中的作用域类似于其中任何变量/函数的定义均有效的块或范围。 例如,在函数内部声明的变量仅在该函数块内(即,在花括号{}之间)保留其值。 如果试图在该功能块之外访问该变量的值,程序将无法找到它。

 package main import “fmt” func main() { { v := 1 { fmt.Println(v) } fmt.Println(v) } fmt.Println(v) // “undefined: v” compilation error } 

在给定的片段中,有四个可见性区域。 第一个是全局区域,第二个是main ()函数,第三个是main函数内部的第一个块,第四个是第一次调用fmt.Println的区域。 在三个Println后者会引发编译错误。 这是因为变量v的定义仅在区域3和4中可用。 当使用v作为参数传递调用Println ,程序首先在当前区域中查找其定义,当找不到它时,它将移到父级范围之外,并将继续执行此操作,直到找到其定义。 这是词法作用域-程序开始从使用/调用它们的区域中搜索变量和函数的定义,然后移出。 在最后一个fmt.Println程序中,无法在当前区域或任何父区域中找到v的定义,因此会引发编译错误。

系统调用界面


Go带有系统调用接口,该接口用作操作系统可用的系统调用的参考。 例如,打开和读取文件,输入和输出等。它拦截API中的函数调用,并在操作系统中调用必要的系统调用。

不变的弦


尽管Go的语法与C相似,但它以UTF-8编码的不可变行的形式相对于它具有优势。 也就是说,用Go编写的程序可以使用多种语言和字符形成字符串。 简单来说,字符串是编程语言中的组合/数组/字符列表。 由于字符串是通过组合字符形成的,因此可以更改其组成。 可以添加,删除,移动字符等。我们考虑一种方法,该方法可保证在声明字符串后不可变。 不可变字符串的概念并不是什么新鲜事物,在Python字符串实例中不能更改对象,JavaScript也具有不可变字符串,Ruby在2.3中添加了Frozen String Literals 。 但是,尽管如此,许多流行的语言(例如C ++,PHP,Perl等)都没有不可变的字符串。

因此,本文的第一部分结束了。 在其中,分解了Go中的元素,而关于Go中没有的元素,您可以在本文的第二部分中阅读。

Source: https://habr.com/ru/post/zh-CN463461/


All Articles