去面试问题(Go Interview Questions)
亲爱的读者,这些Go Programming Language Interview Questions专门设计用于让您熟悉在面试Go Programming Language时可能遇到的问题的本质。 根据我的经验,好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的内容:
Go是一种通用语言,专为系统编程而设计。它最初由Robert Griesemer,Rob Pike和Ken Thompson于2007年在Google开发。 它是强大且静态类型的,为垃圾收集提供内置支持并支持并发编程。 程序是使用包构建的,用于有效管理依赖关系。 Go编程实现使用传统的编译和链接模型来生成可执行的二进制文件。
以下是使用Go编程的好处 -
支持环境采用类似于动态语言的模式。 例如,类型推断(x:= 0是int类型的变量x的有效声明)。
编译时间很快。
InBuilt并发支持:轻量级进程(通过goroutines),通道,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循环或开关之后的语句。
继续使循环跳过其身体的其余部分,并在重复之前立即重新测试其状态。
goto将控制转移到带标签的语句。
Go编程语言中for循环的语法是 -
for [condition | ( init; condition; increment ) | Range] {
statement(s);
}
这是for循环中的控制流 -
如果条件可用,则只要条件为真,就执行for循环。
如果for子句是(init; condition; increment)则存在
init步骤首先执行,只执行一次。 此步骤允许您声明和初始化任何循环控制变量。 只要出现分号,就不需要在此处输入声明。
接下来,评估条件。 如果为真,则执行循环体。 如果为false,则循环体不执行,控制流跳转到for循环后的下一个语句。
在执行for循环体后,控制流会跳回到increment语句。 此语句允许您更新任何循环控制变量。 只要在条件之后出现分号,此语句就可以留空。
现在再次评估该条件。 如果为真,则循环执行并且过程自身重复(循环体,然后递增步骤,然后再次调节)。 条件变为false后,for循环终止。
如果范围可用,则为该范围中的每个项执行for循环。
Go编程语言中函数定义的一般形式如下 -
func function_name( [parameter list] ) [return_types] {
body of the function
}
Go编程语言中的函数定义由function header和function body 。 以下是函数的所有部分 -
func func启动函数声明。
Function Name - 这是Function Name的实际名称。 函数名称和参数列表一起构成函数签名。
Parameters −参数类似于占位符。 调用函数时,将值传递给参数。 该值称为实际参数或参数。 参数列表是指函数参数的类型,顺序和数量。 参数是可选的; 也就是说,函数可能不包含任何参数。
Return Type - 函数可以返回值列表。 return_types是函数返回的值的数据类型列表。 某些函数执行所需的操作而不返回值。 在这种情况下,return_type不是必需的。
Function Body - 函数体包含一组语句,用于定义函数的功能。
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)
}
在调用函数时,有两种方法可以将参数传递给函数 -
Call by value - 此方法将参数的实际值复制到函数的形式参数中。 在这种情况下,对函数内部参数所做的更改不会对参数产生影响。
Call by reference −此方法将参数的地址复制到形式参数中。 在函数内部,该地址用于访问调用中使用的实际参数。 这意味着对参数所做的更改会影响参数。
默认情况下,Go使用call by value来传递参数。 通常,这意味着函数内的代码不能改变用于调用函数的参数和上面提到的示例,而调用max()函数则使用相同的方法。
Go编程语言提供了动态创建函数的灵活性,并将它们用作值。 我们可以使用函数定义设置变量,并将其用作函数的参数。
函数闭包是匿名函数,可用于动态编程。
Go编程语言支持称为方法的特殊类型的函数。 在方法声明语法中,存在“接收器”以表示函数的容器。 该接收器可用于使用“。”调用功能。 运算符。
局部变量具有默认值,因为它对应0值。
全局变量具有默认值,因为它对应0值。
指针初始化为nil。
打印格式化的输出。
出现在赋值运算符右侧的表达式称为rvalue。 Rvalue分配给左值,左值出现在赋值运算符的左侧。 左值应指定变量而不是常量。
在接收称为形式参数的函数定义时,在调用端发送给函数的参数称为实际参数。
声明将类型与变量关联,而定义则为变量赋值。
将程序划分为子程序(模块/功能)以实现给定任务是模块化方法。 更通用的函数定义提供了重用函数的能力,例如内置库函数。
Go程序由各种标记组成,标记可以是关键字,标识符,常量,字符串文字或符号。
Go
Array是通用名称下的类似数据项的集合。
如果您没有要分配的确切地址,Go编译器会将Nil值分配给指针变量。 这是在变量声明时完成的。 指定为nil的指针称为nil指针。 nil指针是一个常量,在几个标准库中定义了零值。
它是一个指针变量,可以保存另一个指针变量的地址。 它取消引用两次指向指定指针变量所持有的数据。
var a int
var ptr *int
var pptr **int
a = 3000
ptr = &a
pptr = &ptr
fmt.Printf("Value available at **pptr = %d\n", **pptr)
因此'pp'可以访问'a'。
结构是Go编程中另一种用户定义的数据类型,它允许您组合不同类型的数据项。
要定义结构,必须使用type和struct语句。 struct语句定义一个新的数据类型,为您的程序提供多个成员。 type语句使用我们的case中的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()函数返回切片的容量,因为它可以容纳多少元素。
Slice允许使用[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类型设置为int。 您可以使用强制转换运算符将值从一种类型转换为另一种类型 - 如下所示
type_name(expression)
Go编程提供了另一种称为接口的数据类型,它代表一组方法签名。 struct data type实现这些接口,以获得接口的方法签名的方法定义。
接下来是什么? (What is Next ?)
此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。