Go - 面试问题


亲爱的读者,这些Go 编程语言面试问题是专门为让您熟悉在Go 编程语言面试过程中可能遇到的问题的性质而设计的。根据我的经验,好的面试官几乎不会计划在面试过程中提出任何特定问题,通常问题会从主题的一些基本概念开始,然后根据进一步的讨论和您的回答继续进行:

Go 是一种以系统编程为设计理念的通用语言。它最初由 Google 于 2007 年由 Robert Griesemer、Rob Pike 和 Ken Thompson 开发。它是强静态类型的,提供对垃圾收集的内置支持并支持并发编程。程序是使用包构建的,以便有效管理依赖关系。Go 编程实现使用传统的编译和链接模型来生成可执行二进制文件。

以下是使用 Go 编程的好处 -

  • 支持采用类似于动态语言的模式的环境。例如类型推断(x := 0 是 int 类型变量 x 的有效声明)。

  • 编译时间很快。

  • 内置并发支持:轻量级进程(通过 goroutine)、通道、select 语句。

  • 简洁、简单、安全。

  • 支持接口和类型嵌入。

  • 生成静态链接的本机二进制文件,无需外部依赖。

不支持类型继承。

不支持运算符重载。

不支持方法重载。

不支持指针算术。

不支持泛型编程。

是的!Go 是一种区分大小写的编程语言。

静态类型变量声明向编译器保证存在一个具有给定类型和名称的变量,以便编译器继续进行进一步编译,而无需有关该变量的完整详细信息。变量声明仅在编译时才有意义,编译器在程序链接时需要实际的变量声明。

动态类型变量声明要求编译器根据传递给它的值来解释变量的类型。编译器不需要变量具有静态类型作为必要要求。

是 可以使用类型推断一次性声明不同类型的变量。

var a, b, c = 3, 4, "foo"  

以下代码打印变量的类型 -

var a, b, c = 3, 4, "foo"  
fmt.Printf("a is of type %T\n", a)

它是一个指针变量,可以保存变量的地址。

例如 -

var x = 5
var p *int
p = &x
fmt.Printf("x = %d", *p)

这里x可以通过*p来访问。

Break 终止 for 循环或 switch 语句,并将执行转移到紧跟在 for 循环或 switch 后面的语句。

continue 导致循环跳过其主体的其余部分,并在重复之前立即重新测试其条件。

goto 将控制转移到带标签的语句。

Go 编程语言中 for 循环的语法是 -

for [condition |  ( init; condition; increment ) | Range] {
   statement(s);
}

这是 for 循环中的控制流程 -

  • 如果条件可用,则只要条件为真,就会执行 for 循环。

  • 如果 for 子句 ( init;condition;increment ) 存在则

    首先执行 init 步骤,并且仅执行一次。此步骤允许您声明和初始化任何循环控制变量。您不需要在此处添加语句,只要出现分号即可。

    接下来,评估条件。如果为真,则执行循环体。如果为 false,则循环体不会执行,控制流会跳转到 for 循环之后的下一条语句。

    在 for 循环体执行之后,控制流程跳回增量语句。该语句允许您更新任何循环控制变量。该语句可以留空,只要条件后面出现分号即可。

    现在再次评估病情。如果为真,则执行循环并重复该过程(循环体,然后递增步骤,然后再次条件)。条件变为假后,for 循环终止。

  • 如果范围可用,则对范围中的每个项目执行 for 循环。

Go 编程语言中函数定义的一般形式如下 -

func 函数名( [参数列表] ) [返回类型] {
   函数体
}

Go 编程语言中的函数定义由函数头函数体组成。这是函数的所有部分 -

  • func func 开始函数的声明。

  • 函数名称- 这是函数的实际名称。函数名和参数列表共同构成函数签名。

  • 参数 -参数就像占位符。当调用函数时,您将一个值传递给参数。该值称为实际参数或参数。参数列表是指函数参数的类型、顺序和数量。参数可选;也就是说,函数可以不包含参数。

  • 返回类型- 函数可以返回值列表。return_types是函数返回的数据类型列表。有些函数执行所需的操作而不返回值。在这种情况下,return_type 不是必需的。

  • 函数体- 函数体包含定义函数功能的语句集合。

Go 函数可以返回多个值。例如 -

package main
import "fmt"

func swap(x, y string) (string, string) {
   return y, x
}
func main() {
   a, b := swap("Mahesh", "Kumar")
   fmt.Println(a, b)
}

调用函数时,可以通过两种方式将参数传递给函数 -

  • 按值调用- 此方法将参数的实际值复制到函数的形式参数中。在这种情况下,对函数内部参数所做的更改不会对参数产生影响。

  • 通过引用调用-此方法将参数的地址复制到形式参数中。在函数内部,地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响参数。

默认情况下,Go 使用按值调用来传递参数。一般来说,这意味着函数内的代码不能更改用于调用该函数的参数,并且上述示例在调用 max() 函数时使用相同的方法。

Go 编程语言提供了动态创建函数并将其用作值的灵活性。我们可以使用函数定义设置变量并将其用作函数的参数。

函数闭包是匿名函数,可以在动态编程中使用。

Go 编程语言支持称为方法的特殊类型的函数。在方法声明语法中,存在一个“接收器”来表示函数的容器。该接收器可用于使用“.”调用函数。操作员。

局部变量具有默认值,因为它对应于 0 值。

全局变量具有默认值,因为它对应于 0 值。

指针初始化为零。

打印格式化的输出。

出现在赋值运算符右侧的表达式称为右值。右值被赋值给左值,左值出现在赋值运算符的左侧。左值应该指定一个变量而不是常量。

在调用端发送到函数的参数称为实参,而在接收函数定义时称为形参。

声明将类型与变量关联起来,而定义则将值赋予变量。

将程序划分为子程序(模块/功能)以实现给定的任务是模块化方法。更通用的函数定义提供了重用函数的能力,例如内置库函数。

Go 程序由各种标记组成,标记可以是关键字、标识符、常量、字符串文字或符号。

数组是具有共同名称的相似数据项的集合。

如果没有要分配的确切地址,Go 编译器会为指针变量分配一个 Nil 值。这是在变量声明时完成的。被赋值为 nil 的指针称为 nil 指针。nil 指针是一个在多个标准库中定义的值为 0 的常量。

它是一个指针变量,可以保存另一个指针变量的地址。它取消引用两次以指向指定指针变量所保存的数据。

var a int
var ptr *int
var pptr **int
a = 3000
ptr = &a
pptr = &ptr
fmt.Printf("Value available at **pptr = %d\n", **pptr)

因此'a'可以被**pptr访问。

结构是 Go 编程中另一种用户定义的数据类型,它允许您组合不同类型的数据项。

要定义结构,必须使用 type 和 struct 语句。struct 语句定义了一种新的数据类型,为您的程序提供了多个成员。type 语句将名称与类型绑定在一起,在我们的例子中是 struct。

struct 语句的格式是这样的 -

type struct_variable_type struct {
   member definition;
   member definition;
   ...
   member definition;
}

Go Slice 是 Go Array 的抽象。由于 Go Array 允许您定义可以保存多个相同类型数据项的变量类型,但它不提供任何内置方法来动态增加其大小或获取自己的子数组。切片弥补了这个限制。它提供了Array所需的许多实用函数,并广泛用于Go编程中。

要定义切片,可以将其声明为数组而不指定大小,或者使用 make 函数创建切片。

var numbers []int /* a slice of unspecified size */
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/

len() 函数返回切片中存在的元素。

len() 函数返回切片中存在的元素,其中 cap() 函数返回切片的容量,即它可以容纳的元素数量。

切片允许指定下限和上限,以使用 [lower-bound:upper-bound] 获取其子切片。

range 关键字在 for 循环中使用来迭代数组、切片、通道或映射的项目。对于数组和切片,它以整数形式返回项目的索引。对于映射,它返回下一个键值对的键。

Go 提供了另一种重要的数据类型映射,它将唯一键映射到值。键是您稍后用来检索值的对象。给定一个键和一个值,您可以将该值存储在 Map 对象中。存储值后,您可以使用其密钥检索它。

您必须使用 make 函数来创建地图。

/* declare a variable, by default map will be nil*/
var map_variable map[key_data_type]value_data_type

/* define the map as nil map can not be assigned any value*/
map_variable = make(map[key_data_type]value_data_type)

delete() 函数用于从映射中删除条目。它需要地图和相应的要删除的密钥。

类型转换是将变量从一种数据类型转换为另一种数据类型的方法。例如,如果要将 long 值存储为简单整数,则可以键入cast long to int。您可以使用强制转换运算符将值从一种类型转换为另一种类型,如下所示 -

类型名称(表达式)

Go 编程提供了另一种称为接口的数据类型,它表示一组方法签名。struct 数据类型实现这些接口以具有接口的方法签名的方法定义。

下一步是什么 ?

此外,您可以回顾一下您过去完成的有关该主题的作业,并确保您能够自信地谈论它们。如果你比较新鲜,那么面试官不会期望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。

其次,如果您不能回答几个问题,这并不重要,但重要的是,无论您回答什么,您都必须充满信心地回答。所以在面试时要保持自信。我们在tutorialspoint 祝您好运,拥有一位优秀的面试官,并祝您未来一切顺利。干杯:-)

go_questions_answers.htm