andrei dumitrescu.

谷歌创建了Go编程语言(称为Golang)来解决“Google-Size”问题。它具有强大的机会成为下一个企业编程语言。

简而言之,戈兰提供高性能(如C和C ++)和超高效的并发处理(如Java),而代码(如Python)也是有趣的。

根据2020年的Stackoverflow调查戈兰是美国和世界各地的第二高的付费技术。随着越来越多的公司正在使用Golang,该地区专业人士的需求正在快速增长。

让我们来看看一些最常见的Golang编程面试问题,以及如何以惯用方式最佳地回应这些问题。

Master Go (Golang) Programming:The Complete Go Bootcamp 2021

最后更新2021年3月

  • 209课
  • 各级
4.5 (499)

从初学者到专业的Google的Go(golang)。成为一名专业的Golang程序员从抓痕。动手练习!|由Andrei Dumitrescu,Crystal Mind Scademy

探索课程

问题1:如何以惯用的方式格式化Go源代码?

A:例如,Golang标准不会坚持使用Python的编码风格。相反,标准已推荐某些风格。

GOFMTGolang格式化器)将以惯用方式格式化程序的源代码。这使得易于阅读和理解。此工具内置于语言运行时,并根据一组稳定,良好的语言规则格式化Go源代码。

我们可以通过在命令行中键入命令来运行它,或者我们可以将IDE配置为运行GOFMT每次我们保存文件。

例如,go - w main.go将格式化源文件主要根据Go编程语言风格推荐。这- w选项将结果写回源文件。

如果我们想逃跑GOFMT在特定目录中的所有文件上,我们运行:Gofmt -w -l directory/

你也可以运行命令FMT.争论。它将执行goftm -l -w在场景后面并格式化当前工作目录中的每个文件中的所有源代码。

问题2:你在Linux上开发了一个Go程序,想在Windows和Mac上编译它,这可能吗?

A:是的,可以为不同的操作系统编译Go申请。

问题3:如何为Windows和Mac编译Go程序?

A:要编译程序,请移动到应用程序的目录。然后在终端中执行以下命令。

编译应用程序的Windows和64位cpu:

GOARCH=amd64 go build -o my_go_program.exe

编译Mac和64位CPU的应用程序:

goos =达尔文goarch = amd64 go build -o my_go_program

注意,对于Linux和Mac,没有必要使用文件的扩展名。

问题4:从一个空文件开始,你如何创建一个Go程序的基本结构?注释使用评论源代码的最重要部分。

A:

源代码。

//一个包子句启动每个Go源文件

// main是声明可执行文件而不是库(包)的特殊名称

主要包

//导入声明声明此文件中使用的包

// fmt是一个标准库包,用于打印到标准输出(控制台)

导入“FMT”

//函数声明。主要是一个特殊的功能名称

//它是可执行程序的入口点

var age int = 20 var today string = "Monday" // Println()函数从fmt包打印出一行到stdout fmt。Println("Today is", Today) // =>今天是星期一fmt。Println("Your age is", age) // => Your age is 17}

问题5:什么是字符串数据类型在Golang,它是如何表示的?

答:字符串是一系列字节值。它是一个字节片,任何字节片都可以被编码成字符串值。因此,我们可以在字符串中编码任何东西,甚至不只是Unicode文本,如图像或二进制应用程序。

Golang没有char数据类型。它使用字节和符文来表示字符值。

问题6:解释字节和符文类型以及它们的代表方式。

A:golang有两个整数类型字节符文这些都是化名uint8INT32.数据类型。

字节数据类型表示ASCII字符,而符文数据类型表示默认情况下以UTF-8格式编码的Unicode字符。

在Golang,我们表达人物或符文文字将它们括在单引号中,例如' a, ' ' b, ' ' m, ' ' x, ' '或' \n。代码点是一个代表符文文字的数值。

代码点的Golang术语是符文(符文是代码点的Golang规范中引入的术语)。大多数时候,我们说“符文”而不是“代码点”。rune表示单个Unicode字符。例如,十六进制中的符文0x61表示符文文字“a。”

问题7:您是否可以在字符串中更改特定字符?

A:编号字符串是不可变的(只读)数据类型,您无法更改它们。如果我们尝试在字符串中更改特定字符,我们将获得运行时错误。

问题8:如何连接字符串值?连接字符串时会发生什么?

A:要连接字符串,可以使用加法运算符(+)。请注意,每次我们连接到一个字符串值时,Go都会创建一个新字符串。这是因为字符串在Go中是不可变的,因此效率很低。

有效和推荐的方式来连接字符串值,即使用字符串。构建器type,它是在Go 1.10中引入的。

问题9:解释阵列和切片类型以及它们之间的差异。

A:Golang有两个数据结构来处理记录列表:阵列片。

数组是一种存储元素集合的复合可索引类型。

一个大批有一个固定长度。我们指定在我们声明时数组中有多少项。与a相反有一个动态长度(它可以在运行时收缩或增长)。

阵列长度是其类型的一部分。

数组或切片中的每个元素必须具有相同的类型。

切片是戈朗的一种关键数据类型,它无处不在。

问题10:介绍数组和切片声明的示例。

A:这是声明和初始化类型数组的示例[4]字符串使用短声明语法。

朋友:=[4]字符串{“丹”,“戴安娜”,“保罗”,“约翰”}

以下是声明和初始化类型类型的示例int []使用短声明语法。

数字:= [] int {2,3,4,5}

问题11:解释切片值的备份阵列。

A:当我们创建一个切片时,Go在后台创建一个隐藏数组,称为backing或底层数组,新的切片类型变量将引用它。后备数组存储的是元素,而不是切片。

Go实现一个切片作为一个数据结构称为切头,这是切片的运行时表示。

它包含三个字段:

  1. 背衬阵列的地址(返回阵列的第一元素的指针)。
  2. 切片的长度。内置功能Len()返回它。
  3. 切片之后的背衬阵列的大小的切片的容量。它归还了帽()内置函数。

请注意,Slice没有后备数组,所以切片头中的所有字段都等于零。

问题12:下面的Go程序将打印出什么?

包主要导入“FMT”Func Main(){n1:= [] int {10,20,30,40} n1 =附加(n1,100)fmt.println(len(n1),帽(n1))}

A:该程序将打印出5 8

Append()函数创建具有更大容量的新备份阵列。这避免在调用下一个Append()时创建新的备份阵列。

问题13:说明戈朗地图的类型及其优势。

A:一种地图集合类型是否像数组或切片键:值我们可以把地图想象成d在python或一个对象在js。

地图中的所有键和值都是静态键入的,并且必须具有相同类型。键和值不必具有确切类型,但所有键都必须具有相同类型,并且地图中的所有值都必须具有相同类型。例如,所有键都是类型字符串,并且所有值都是int类型。

我们可以使用任何类似的类型作为映射键。比较类型是支持比较运算符的类型。这是双等号(==)。

地图的主要优点是添加,获取和删除操作,无论地图中有多少条目,都不需要持续的预期时间。它们提供非常快的查找,因为地图由Hashtables备份。

地图是Golang中的无序数据结构。

问题14:关于文件的基本操作,Golang推荐的软件包是什么?还有什么其他Golang软件包是用来处理文件的?

A:操作系统标准库包提供了独立于平台的界面。使用文件时,我们将其用于系统功能。

操作系统界面旨在跨所有操作系统均匀。因此,我们在Windows,Linux或Mac上创建的程序相同。

还有其他的Go标准库包,例如IO.ioutil, 和bufio.它们处理文件并提供更多的功能。

但是,对于文件的基本操作,不需要它们。操作系统包装是我们所需要的。

问题15:解释Golang的面向对象架构。

A:与传统的面向对象编程不同,Golang没有类对象架构。相当结构方法保持复杂的数据结构和行为。

一种塑造只不过是一个模式,它包含结构将保存的数据蓝图。结构用于表示来自现实世界的概念,如汽车、人或书籍。

问题16:什么是结构类型?您可以在运行时更改结构定义吗?

A:结构体是一个称为字段的命名元素序列。每个字段都有一个名称和类型。我们也可以把结构看作是关联在一起的属性的集合。它们对于将数据分组形成记录非常有用。

此蓝图在编译时固定。不允许在运行时更改字段的名称或类型。我们无法在运行时从结构中添加或删除字段。

问题17:什么是匿名结构和匿名结构领域?举例说明这种结构声明的示例。

A:匿名结构是没有显式定义结构类型别名的结构。

匿名结构的示例:

diana:= struct {firstName, lastName string age int}{firstName: " diana ", lastName: "Zimmermann", age: 30,}

我们可以在没有任何字段名称的情况下定义结构类型。我们称他们为匿名领域。我们所要做的就是提到字段类型,然后将使用类型作为字段名称。

带有匿名字段的结构的示例:

type Book struct {string float64 bool} bestBook:= Book{"1984 by George Orwell", 10.2, false}

问题18:解释Golang中的推迟陈述。举例说明延迟函数的呼叫。

A:延迟语句延迟或推迟函数的执行。它将延迟执行,直到周围的函数返回,要么正常返回,要么通过紧急调用返回。

我们使用defer来确保在程序执行的后面执行函数调用,通常是为了清理资源。

例如,假设我们要创建一个文件,写入它,然后在完成后关闭它。

创建文件变量后立即推迟关闭该文件。关闭文件的末尾的函数将在写入文件的写入完成后在括号函数(main)的末尾执行。

文件,err:= os.open(“main.go”)如果err!= nil {log.fatal(err)} defer file.close()

问题19:解释指针类型。

A:变量是用于内存位置的方便的字母数字昵称或标签。指针是一种变量类型,它存储另一个变量的内存地址。

指针值是变量的地址,或如果尚未初始化。

指针点指向变量的内存地址,就像变量代表值的存储器地址一样。

例如,如果变量BB有价值156并存储在内存地址0x1040a124然后是变量Aa保存bb (0x1040a124)的地址。现在AA.设置为指向BB.AA.是指向BB.

问题20:写一个声明字符串变量的golang程序,打印变量的地址,声明另一个int变量,以及指向它的指针。

A:

源代码。

主要包

导入“FMT”

func main(){// go提供and(&ansand)运算符也称为运营商的地址。Lang:=“golang”fmt.println(&lang)//  - > 0xc00010a040 var x int = 2 //  - > int值ptr:=&x //  - >指针到int fmt.printf(“ptr为%t型磅值具有值%v和地址%p \ n“,ptr,ptr,&ptr)}}

问题21:将指针传递给功能有哪些优点是什么?

A:戈兰是价值语言的通过。

如果将非指针变量类型传递给函数,函数将创建该变量的副本。对变量(即函数参数)的任何更改,外界都不会看到。

指针有能力改变或改变它们所指向的数据。因此,如果我们传递一个指向函数的指针,在函数内部改变指针所指向的值,那么改变将在函数外部看到。

简而言之,当我们想要改变函数体内部变量的值时,我们传递指针给函数。

问题22:golang方法是什么?

A:Golang没有类,但是我们可以在定义的类型上定义方法。一个类型可能有一个与它相关联的方法集,该方法集可以用额外的行为增强该类型。

通过这种方式,命名类型同时具有数据和行为,并更好地表示现实世界中的概念。

方法也称为接收器功能。

问题23:创建一个Go程序,该程序定义该类型的命名类型和方法(接收器函数)。

A:

源代码。

主要包

导入(“fmt”)//声明新类型类型名称[]字符串//声明方法(函数接收器)func(n名称)print(){// n称为方法的接收器// n是实际副本我们正在使用的名称并在该功能中提供。// n就像是这样的或来自OOP的自我。//类型名称的任何变量都可以像变量一样调用此函数,如“变量”()//迭代和打印I的所有名称,名称:=范围n {fmt.println(i,name)}} func main(){//声明类型名称的价值:=名称{“丹”,“嫁给”} //调用friends变量朋友的print()方法.print()//另一种在命名类型名称上调用方法的方式.print(朋友)}

问题24:什么是戈罗琳?深入了解它。

A:Goroutine是一种能够与其他功能同时运行的函数。这是一个轻量级的执行线程。

当GO程序正在运行时,主要的Goroutine是创建和启动的。使用其他Goroutines使用关键词。所以任何使用的功能在名字变成goroutine之前的关键字。

OS线程和Goroutines之间的区别在于OS内核的OS线程是由OS内核调度的。并且由于所需的内存访问量,这是一个缓慢的操作。

Go运行时包含其调度程序以计划Goroutines。

大戈罗琳非常便宜。拥有数千个,甚至数千人的大花园是实际的。

问题25:解释为什么并发不是并行?

A:并发意味着一次加载更多的goroutine。这些goroutine是多个执行线程。如果一个例行程序阻塞了,另一个就会被提起并启动。在单核CPU上,我们只能运行并发应用程序,但它们不是并行运行的。他们按顺序运行。

另一方面,并行表示多个Goroutines同时执行。它需要多个CPU。

并发性和并行性是相关但不同的概念。并发意味着独立地执行进程或一次处理多个东西,而行则是同时执行进程并且需要多个核心CPU。

问题26:什么是数据竞争?

A:同时执行许多Goroutines,无需特殊处理即可引入调用的错误“竞争条件”“数据竞赛。”

当两个goroutine同时访问内存,其中一个是写入时,数据竞争就发生了。由于对共享内存的非同步访问而出现竞争条件。它们是并发系统中最常见和最难调试的错误类型之一。

问题27:您如何检测到GO代码中的数据竞赛?

A:从Go 1.1开始,一个名为的新工具赛车探测器为在GO代码中查找竞争条件。

使用赛车探测器很简单。我们只是添加一个运动中标志到我们的正常Go命令行工具。

运动中命令行标志已设置,编译器检查所​​有内存访问,其中包含记录的代码以及如何访问内存。同时,运行时库监视不同步的访问对共享变量。

使用RACE探测器运行GO程序的示例:去运行-race main.go

问题28:什么是去渠道?频道类型上有哪些操作?

A:Go的通道提供两个Goroutines之间的连接,允许它们进行通信。

我们通过频道发送或接收的数据必须始终是相同的类型。这是我们创建频道时指定的类型。

问题29:频道类型上有哪些操作?

A:一个通道是一个双向消息传递对象,具有两个主要操作:发送和接收。

发送语句将一个值从一个例行程序传送到另一个例行程序。它执行一个相应的接收表达式。传输通过这个频道。两个操作都是使用通道操作符(<-)编写的。

频道用于在运行Goroutines之间进行通信。

问题30:写一个使用Goroutine和频道的简单golang程序。

A:

源代码。

主要包

导入“FMT”

Func main(){//声明一个双向通道,传输类型为int的数据c:= make(chan int) fmt。Printf("%T\n", c) //启动goroutine go func1(10, c) //接收通道n的数据:= <-c fmt。Println("Value received:", n) fmt。Println(" exit main…")}

最后的想法

我希望你能发现这些面试问题有用。在我的课程中可以找到对他们的答案和许多其他问题大师Go(Golang)编程:完整的Go Bootcamp.该课程深入涵盖了Go编程语言。

记住,学习如何编写代码的唯一方法是编写代码,所以要尽可能多地练习,直到你对自己作为Golang程序员的能力有信心为止。

页面最后更新:11月2020年11月

Go编程语言的顶级课程

掌握Go(Golang)的多线程编程
詹姆斯·切尔·贾马尔
4.5 (150)
GO:完整的开发人员指南(Golang)
斯蒂芬格莱德里
4.6 (17713)
畅销书
如何在戈朗(Go)开发REST微服务
费德里科•莱昂
4.4 (592)
Master Go (Golang) Programming:The Complete Go Bootcamp 2021
andrei dumitrescu,水晶思维学院
4.5 (499)
Web认证、加密、JWT、HMAC和OAuth With Go
托德·麦克劳德,丹尼尔·霍夫曼
4.3 (142)
探索Go(golang)编程语言
托德·麦克劳德,丹尼尔·霍夫曼
4.5 (158)
合作和爬行W / Google的Go(golang)语言
托德·麦克劳德,丹尼尔·霍夫曼
4.4 (208)
Google的Go(Golang)编程语言 - 初学者指南
舞王Gootooru
4.6 (46)
收视率最高
戈朗(Go) REST微服务行业介绍
费德里科•莱昂
4.2 (385)

更多Go编程语言课程

去编程语言的学生也学习

让你的团队。领导行业。

使用Udemy for Business订阅在线课程库和数字学习工具。

请求演示

Andrei Dumitrescu的课程

Linux管理:建立5个实践的Linux项目
andrei dumitrescu,水晶思维学院
4.6 (31)
Linux Administration: The Complete Linux Bootcamp 2021
andrei dumitrescu,水晶思维学院
4.6 (278)
畅销书
Ethical Hacking and Network Security from Scratch 2021
andrei dumitrescu,水晶思维学院
4.7 (182)
Master Go (Golang) Programming:The Complete Go Bootcamp 2021
andrei dumitrescu,水晶思维学院
4.5 (499)
Master Python编程:完整的Python Bootcamp 2021
andrei dumitrescu,水晶思维学院
4.6 (687)
与Python用于网络工程师的主网络自动化
andrei dumitrescu,水晶思维学院
4.7 (1631)
畅销书
Linux Security:完整的iptables防火墙指南
andrei dumitrescu,水晶思维学院
4.7 (611)
精通以太坊和solid编程:构建真实世界的应用程序
andrei dumitrescu,水晶思维学院
4.4 (486)

Andrei Dumitrescu的课程