通过30个有用的备忘单学习Go的基础知识
Go(也称为Golang)绝对是新潮,这是正确的。它并不像C或C ++那样难于学习,但仍然相当快,并且拥有一个强大的社区以及许多有趣且有用的软件包和库。该语言也是由Google计算机科学界的一些最聪明的人开发的。
这些可能是查看Docker和Kubernetes编写语言的足够理由。 这是您需要入门的最终Golang备忘单。 玩得开心!
目录
让我们从绝对的基础开始。 如果您已经安装了Golang,则可以在终端中输入go version,您应该会看到有用的输出。 如果尚未安装,可以在这里进行。
让我们从Hello World开始。 为此,我们仅创建一个名为main.go的文件,并用以下内容填充它,然后可以使用go run main.go来运行第一个程序。 您应该在终端中看到输出。
fmt表示格式,是Go中输入和输出的默认库。 如您所见,文件中有一个主要函数,该函数会自动执行,而无需调用它。 每个Go项目都需要这样的功能。
这些是我们需要的基本说明。 如果我们要编译项目并将其制作为可执行文件,请使用go buildmain.go。
Go确实有些特别之处。一件事是,没有空值描述尚未分配值的变量的值。而是,每个变量类型都有一个默认值,具体取决于变量的数据类型。
如果声明没有值的变量,则必须指定数据类型,否则变量类型是可选的。
有两种定义变量的方法:经典方法(使用variable-keyword)和简写语法。在上面我们使用了关键字,而不是简写形式。
如您所见,我们指定了数据类型。使用简写语法,我们无法做到这一点,此外,我们可以使用long语法创建一个空变量,而使用简写语法,我们必须直接分配一个值。
声明变量的简写语法在函数外部不起作用。让我们再看看另一种可能性。
每当我们不提供数据类型时,Go都会根据存储在变量中的值使用类型推断来设置数据类型。 如您所见,长语法指定数据类型是可选的。
我们还可以轻松地一次性定义多个变量。
如果我们已经给变量提供了一个值,则可以覆盖它,这适用于使用var-keyword和速记语法(:=)创建的变量。
变量是例外,其变量类型为const。 这代表常量,表示我们不能覆盖变量的值,我们创建这样的常量:const name =" Max"。
如果用户无法进行任何输入,程序将是什么? 在Go中,我们可以通过两种方式做到这一点。 在执行Scanln函数的代码执行过程中,我们可以通过终端接受用户的输入。
我们先将输入存储在变量中,然后再直接输出。 另一种可能性是在执行程序时直接在控制台中传递参数。
我们需要导入os软件包,该软件包可以访问终端,然后我们可以访问os.args,其中包含运行Go程序时输入的所有内容。
我们通过os.Args [1]访问第二个元素,因为终端中的第一个元素是go run main.go命令,通过它我们可以启动程序。
现在,我们可以启动程序并像这样传递命令行参数:go run main.go name = max。
我们的程序应该输出 name = max。
在Go中,您应该了解四种重要的数据类型,即整数,浮点数,字符串和布尔值。这是一个简单的概述。
整数是整数,浮点数是数字,字符串是"文本",布尔值是真值,因此是true或false。
使用无符号变量,数值永远不能为负。使用带符号的变量,它可以。这是一个例子。
以下代码行将导致错误:var age uint8 = -2,编译器将说-2不在无符号整数范围内,因为无符号表示它不能为负数。
因此,我们必须重写代码并说它是一个带符号的整数:var age int8 = -2,现在一切正常," u"表示无符号。 如果我们未指定" u",则对变量进行签名。 但是8是什么意思?
8表示变量在内存中的大小(以位为单位),因此我们可能有一个8位的变量,该变量获得了一个分配的值,该值大于8位。然后,由于范围不足,因此在逻辑上会给出错误。
这将导致错误:var age int8 = 235255,该值太大而无法用8位表示。
感谢int表达式后面的数字,我们可以轻松定义变量在内存中的大小。我们可以对浮点数做同样的事情。
Go是一种编译语言,通常用于编译语言,因为您可以在执行后声明一个函数。是的,以下代码绝对可以正常工作。
在定义变量时,指定数据类型是可选的,但是如果我们从函数返回某些内容,则必须指定数据类型。在greet函数中,这是我们返回的字符串。
这是Go中的另一件事,我们可以在一个函数中返回几件事。在大多数其他语言中,这是不可能的。在那里,您必须返回一个数组才能获得类似的效果。
由于我们还可以使用简写语法一次定义多个变量,因此我们可以在Golang中的多次返回中使用它,这与JavaScript中的解构非常相似。
传递参数时,它与返回值相同,我们必须指定数据类型。特殊的是,我们将数据类型写在参数名称之后,而不是像大多数编程语言一样在参数名称之前。
就像我们可以缩写变量的声明一样,我们也可以稍微缩写参数的定义。使用以下语法,我们为期望的两个参数设置了相同的数据类型。
If-Else可能存在于每种编程语言中。 Golang也是如此,它的工作原理与其他地方一样。
在语法中,您仅注意到我们没有在条件本身周围使用方括号。
当然,如果在Go中也可以使用其他常用方法。 关键字为else if。
Golang中存在的唯一实际循环是for循环,更重要的是我们对其进行了研究。但是语法几乎与其他任何语言相同。我们不在条件周围使用方括号。
现在,从零到九的所有数字都显示在终端中。
我们不允许使用var-keyword在for语法中定义变量。唯一的方法是直接声明计数器变量,如上所示。我仅在for循环内有效;在花括号之外,我们无法访问它。
我只是说过,实际上Golang中只有For-Loop,是的,不存在带有while-关键字的While-Loop。
但是,您可以使用for循环相对容易地构建这样的while循环。 我们可以简单地省略for循环的所有不必要的构造块,剩下的只是技术上的while循环。
只要条件为真,就执行循环。
当然,情况没有任何变化。6将始终大于5,因此它是一个无限的while循环,但我们可以更轻松地编写它。
该代码现在将一直运行,就像true一样。
让我们看一下Golang中的数组。重要的是要了解数组具有某些规则:
· 它们只能包含一种类型的数据。
· 它们具有固定的大小。
· 固定大小意味着我们不能向数组添加更多值。
也许您从诸如JavaScript之类的语言中了解了数组,但这些条件并不适用上限条件,但是当我们谈论Golang中的数组时,我们指的是经典数组,在许多其他低级语言中它们也是非常不动态的。
因此,当我们使用数组时,我们必须已经完全考虑了这一点,在创建数组时,我们必须指定要在其中存储多少个元素。
这是一个简单的数组,应该包含两个元素,我们在声明时将它们直接存储。
但是我们也可以先创建一个空数组,然后在执行过程中将值传递给它。
这样,我们得到的结果与上面的代码相同,但是由于数组始终具有固定的长度,因此我们添加的元素不能超过我们指定的大小。
我们还可以使用简写语法创建一个数组。 与许多其他语言一样,在Go语言中,我们从0开始计数,因此第一个元素的索引为0。
例如,与Python不同,索引不能为负,我们不能使用-1选择数组的最后一个元素。
如果我们想要一个可以添加更多值的数组,则可以省略方括号中的数字,但是它不再是数组而是切片。
在这里,我们创建了一个切片,并向其中添加了另一个元素,但是append函数不会覆盖实际的切片,而是返回一个新的切片,因此我们用它覆盖了现有的切片。
现在是将两个概念结合在一起的时候了。借助循环,我们可以遍历数组和切片。
我是我们的索引变量,值是相应位置的元素,一个常见的问题如下:如果我们不使用变量,Go会给出错误消息,因此简单地不访问变量我会导致错误。
如果我们只为value编写,则value将为i,因为它位于第一位,因此我们必须跳过第一位,其操作如下:
现在,仅输出切片中的每个元素,而不输出相应的索引。
顾名思义,指针以编程语言指向某个对象,通常指向存储地址或保存在值后面的存储地址。
如果您自己执行此代码,则可能会得到不同的输出,但是其内容应类似,具体取决于程序执行的内存地址,程序可以使用该内存地址来存储变量。 内存是指RAM,而不是硬盘。
如果我们有内存地址,我们可以直接读取存储在其中的内容,从而可以读取变量的值。
用&我们获得内存地址,后面带有*值。
将所有内容都写到一个文件中不是很有用,相反,我们希望将代码划分为用于各个函数或类的单独文件。 在Go中,这非常方便,因为我们甚至不需要某种导入或导出语句。
在Golang项目中,一次只应有一个main.go,但是我们所有的文件都可以使用同一个包,即main。
首先,创建一个main.go并包含以下内容:
在执行时,直接调用一个名为greet的函数,为此,我们使用以下内容创建greet.go。
您可以直接看到我们也导入了fmt-package,这在main.go中是没有的,这是完全正确的,我们只需要在使用它的文件中导入像fmt这样的外部包即可。现在我们可以 运行。
也许您已经尝试过自己并注意到一个错误,但这不是因为我们忘记了从greet.go导入greet函数。
我们需要调整程序的运行方式。 除了运行go main.go之外,我们还需要运行go main.go greet.go,我们告诉Go两个文件与执行有关,突然之间,它起作用了!
让我们创建一个新切片,其中包含课程学生的姓名。
那很简单。但是,如果我们想为每个其他课程都创建一个单独的切片,其中也包含字符串,那么我们只能为此创建一个额外的类型。
该类型用作我们使用type-keyword创建的模板。 然后,我们可以使用名称访问它。
它变得有点抽象,因为我们可以创建一个所谓的接收器函数,该函数可以由人员类型的所有变量访问。
是的,主函数上方的函数看起来有些奇怪,基本上,该功能称为打印,但我们已将其标记为接收器。在方括号内,它得到应使用的类型,p是我们的学生切片的副本,people是应具有该功能的类型。
然后,在main函数的底部,我们可以调用此函数,当我们通过切片时,它将产生以下输出。
Student: Max
Student: Anna
因此,p在学生切片的功能打印中。 如果您来自面向对象的语言,那么可以将p视为p,因此,如何命名p并不重要,可以自由选择p,但是必须明确定义第二个参数(类型)。
在不同的编程语言之间进行切换时,经常遇到的问题是,相同的概念具有不同的名称,映射也是如此。 Map将是JavaScript中的对象,是Python中的字典。 他们为每个值分配一个键。
所有键都必须具有相同的数据类型,并且所有值也必须相同,但是键和值不一定必须具有相同的数据类型。
这是一个例子。
1: "Max"
2: "Anna"
因此,我们可能只对学生进行了编号枚举,并按他们的表现进行了排序,其中1是最好的,2是第二最好的,依此类推,因此对于键和值,我们有不同的数据类型。 我们还可以为年鉴制作一个Map,并为每个值(学生)分配一个不同的键。
Team Captain: Max
Prom Queen: Anna
我认为原理很明确,让我们来看一下实践中的Map。
为此,我们使用map-keyword并首先在方括号中指定键的数据类型,然后是值的数据类型。
在这里,我们使用了简写形式的语法来声明一个映射,但是我们也可以使用var-keyword,因此该映射默认情况下可以为空。
如果我们像现在这样创建一个空的Map,则可以在下面输入值,而不是在另一个Map上使用var-keyword。
要仅从Map中输出一个值,我们访问变量并指定相应的键。
要删除单个条目,我们使用删除功能,在其中指定Map和键:delete(students," Team Capitain")。
在几分钟之内,这些就是您应该了解的有关Golang的最重要的基础知识。
(本文由闻数起舞翻译自Wayne Bishop的文章《The Only Introduction to Golang You Need》,转载请注明出处,原文链接:
https://medium.com/better-programming/go-4f365468dbd5)