Tutorial Study Image

Golang面试问题

Go是一种新的编程语言,用于**系统编程**,由**Google**开发。Go是一种**开源**编程语言,也称为**Golang**。

Go编程语言是为Google开发的系统编程而设计的。

Go被设计为一种**开源编程语言**,因此它是完全免费的,并且具有许多功能。Golang的其他品质是:

  • 简单
  • 可靠
  • 易于构建和编译
  • 高效

Go编程语言由以下人员创建:

  • Robert Griesemer
  • Rob Pike
  • Ken Thompson

Golang于2009年在Google开发。

Golang中的程序是使用许多包创建的。GO中的每个程序都以main包开始,并且可以使用路径“fmt”和“math/rand”导入包。

泛型编程意味着编写可用于多种数据类型(如数组)的代码。在GO编程语言中,它不支持泛型编程。

是的,Go编程语言区分大小写。在使用大写和小写字母时我们必须小心。

字符串字面量是由两个或多个字符组合形成的字符串常量。Golang中有两种类型的字符串:

  1. 1. 原始字符串字面量:原始字符串是反引号之间的字符组合。原始字符串中没有任何转义字符。
  2. 2. 解释字符串字面量:这些是Golang中用双引号编写的字符串字面量。它包含转义字符,但没有任何换行符。

工作区是我们编写Go程序代码的环境。它包含GO代码。工作区由其根目录下的三个目录组成。它们是:

  • "src"
  • "pkg"
  • "bin"

在GO编程语言中,工作区由其根目录下的三个目录组成。在这些目录中,“src”目录包含按包组织源代码。

Go编程工作区由三个目录组成,其中“pkg”GO目录包含包对象。

在GO编程工作区中,“bin”目录包含所有可以在GO编程中使用的可执行命令。

在GO编程中,布尔类型的默认值为false

GOPATH是GO编程中的一个环境变量,它能够指定**GO工作区的位置**。在开始GO编程之前,我们必须设置这个GOPATH环境变量。

GO编程是Google开发的最新编程语言之一。它有许多功能或优点,它们是:

  1. 编译时间非常快
  2. 支持高级并发
  3. 具有高效的垃圾回收
  4. 高效利用资源
  5. 支持许多安全功能
  6. 函数在GO编程中被视为一等对象

GO编程语言的一些内置支持是:

  • 容器:heap/list/container
  • Web服务器:http/net
  • 加密:md5/crypto/sha1
  • 压缩:gzip
  • 数据库:sql

GO编程语言不支持类型继承。

运算符重载是一种多态性,其中相同的运算符可以在面向对象语言中用于不同的操作。

GO编程语言不支持运算符重载

方法重载是一个概念,编程语言允许类定义不同但同名的方法。

GO编程语言不支持方法重载。

指针算术也称为地址算术,这意味着我们可以对指针地址进行加减等算术操作。它取决于指针指向的数据类型的大小。

GO编程语言不支持指针算术。

是的,GO编程语言区分大小写。

静态变量声明意味着我们正在静态声明一个变量,其值和数据类型在GO程序内部不会改变。

静态声明变量意味着我们告诉编译器变量名和类型不会改变。这样编译器就可以在不进一步检查变量的情况下编译代码。这个变量声明是在编译时完成的。

 

在GO编程中变量的动态声明中,变量类型和名称是动态声明的,

在此声明中,编译器必须在值传递给变量后检查变量的类型,

是的,在GO编程中,可以使用类型推断在一行代码中声明不同类型的变量,例如:

var a, b, c = 1, 2, "go"

要在GO编程中使用printf打印变量类型,请参阅以下代码:

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

 

指针是一个变量,它保存另一个变量的地址而不是特定值。例如:

var y = 10
var p *int
p = &y
fmt.Printf("y = %d", *p)

Break语句用于中断for循环或switch case的执行,并将程序执行的控制权转移到GO编程中for循环或switch case之后的第一行。

循环内的continue语句将通过跳过continue语句下方的循环体部分来继续循环的执行。它也会重置循环的条件。

GOTO用于改变用户控制或改变程序流程到程序的其他部分。它将控制权从一个点转移到有标签的语句。

正如我们所知,if-else是一个条件语句,当它满足条件时,它有助于执行if部分中的代码。否则,它将执行else部分。

if-else的语法

if  条件 
   { 
          要执行的代码 
   }
else 
  {
         要执行的代码 
  }

For用于循环一组代码,直到条件为假。它有助于打印序列等等。

FOR循环的语法是

for [条件 |  ( 初始化; 条件; 增量 ) | 范围] \
{
   代码;
}

Go编程语言支持函数,GO编程语言中创建函数的语法如下:

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

Go编程支持短声明,但短声明只能在Go编程语言中的**函数内部**进行。

是的,我们可以在Go编程语言中从函数返回多个值。

在GO编程中,参数或形参可以通过两种不同的方法传递给函数,其中包括:

  • 按值调用:在这种方法中,实际值传递给函数的形式参数
  • 按引用调用:在这种方法中,要传递的值的地址复制到形式参数中。

在GO编程中,向函数传递值或参数的默认方法是将参数的实际值复制到形式参数中。这就是**按值调用**方法。

GOlang允许程序或用户在程序运行时创建函数,而不会中断程序的运行,并将其用作值。

在这种方法中,我们可以在定义函数时设置一个变量,并将其用作函数中的参数。

Go编程语言支持一种特殊的特性,称为**匿名函数**,也称为**函数闭包**,可用于动态编程。

闭包函数引用在函数本身外部声明的变量。

方法是Go编程中一种特殊类型的函数,它类似于其他GO函数,但其中有一个接收者参数,它表示函数的容器。借助接收者参数,我们可以使用“.”运算符调用所有函数。

GOlang中的每个变量都有特定的类型。GO编程语言中局部变量的默认值为零。

GO编程语言中全局变量的默认值为0

Go编程语言中指针变量的默认值为零。在GOlang中,每个指针变量都初始化为零。

GO编程语言中的Printf()语句用于显示格式化输出。

GO编程语言中的lvalue是赋值运算符左侧的值。lvalue不能是常量。

rvalue是赋值运算符右侧的值。

实际参数是我们从调用函数或主程序发送的真实值。

Go编程语言中的形式参数是函数内部接收实际参数的变量。

变量的声明意味着我们为变量分配一个类型,例如整数、字符、浮点数等。

定义变量意味着我们正在为该变量添加或分配一个值。

模块化编程类似于面向对象编程,这意味着我们将程序分成不同的子程序,例如可以调用函数来完成任务。

模块化程序函数可以多次调用,因此它增加了函数的可重用性。

在GO程序中,我们必须使用关键字、字符串字面量、常量、标识符或符号,它们在Golang中统称为令牌。

在GO编程中,我们有GOTO语句用于无条件分支。

数组是相同数据类型元素的集合,可以使用索引变量通过递增变量来访问。

在Go编程语言中,指针由“*”以及指针指向的值的类型表示。

在GO编程中,我们必须运行以下代码行才能格式化字符串。

return fmt.Sprintf ("at %v, %s" , e.When , e.What )

 

在GO编程中,我们有一种特殊的方法,这意味着我们有一种特殊的开关,专门用于在程序运行时检查变量的类型。

Panic是Go编程中用于错误处理的内置函数。

Go编程语言支持大量数据类型,大致分为四种类型:

  • 基本类型:整数、字符、布尔值等
  • 聚合类型:数组和结构
  • 引用类型:指针、切片、映射、函数、通道
  • 接口类型

被赋值为nil或零的指针称为空指针。如果GO编译器未正确分配到地址,则可以为指针分配nil值。

指针的指针是一个指针,它在Go编程中保存另一个指针变量的地址。它用“**”表示。

结构是GO编程语言中的一种聚合类型数据类型,能够容纳不同数据类型的集合。

Go编程中的结构使用关键字“struct”定义。结构包含不同类型的成员,这些成员位于大括号内。

语法

type struct_variable_type struct {
   成员定义;
   成员定义;
   ...
   成员定义;
}

GO编程中的切片是一种与数组非常相似的数据结构。与数组相比,切片更高效、更灵活。

它还可以像数组一样存储相同数据类型的元素,并可以使用变量进行索引。

不同之处在于切片的长度不像数组那样固定。这意味着切片的大小可以在程序内部更改。

每个切片索引从元素零开始,最后一个元素将位于位置切片大小 - 1。

我们有两种创建切片的方法。

  1. 首先,我们可以使用函数“make”在GO编程中创建一个切片。

    var elements []int 
    /* elements == []int{0,0,0,0,0}*/

  2. 第二种是像数组定义一样定义切片,但不提及大小。

    elements = make([]int,7,7) /* 创建一个长度为7,容量为7的切片 */

 

为了计算切片中的元素,我们在GO编程中有一个**函数len()**,它返回切片中元素的数量。

GO编程中的cap()函数可以应用于切片以获取切片的容量。这意味着它可以返回切片可以存储多少个元素。

为了选择切片中的特定部分(我们可以称之为子切片),可以使用GO编程中的**上限和下限**。

range是GO编程中的一个关键字,用于for循环中遍历数组、切片、通道或映射中的元素。

map是GO编程中一种重要的数据类型,它有助于存储带有相应键的值。

因此,使用键,我们可以检索存储的对应键的值。

键值必须是唯一的,就像数据库中的主键一样。

在GO编程中创建map的语法如下:

var map_variable map[key_data_type]value_data_type

为了从GO编程中的map中删除一个元素,我们必须使用**delete()函数,使用我们要删除的值的键**。

类型转换是使用转换运算符将变量从一种类型转换为另一种类型的方法。GO编程语言支持类型转换。

接口是GOlang数据类型,有助于表示一组方法。

Goroutine是GO编程中的一个特殊函数,它与Go语言中的其他goroutine函数或方法并行运行。在Go程序中,有许多goroutine并行运行。

 

要在Go编程中创建goroutine,我们必须在函数前使用关键字“go”。

go f(a,b,c)

我们必须使用GO编程中的“+”运算符来连接两个字符串。

使用以下代码在GO编程中显示字符串切片的组合:

package main
import "fmt"


func Perm(a []rune, f func([]rune)) {
        perm(a, f, 0)
}

func perm(a []rune, f func([]rune), i int) {
        if i > len(a) {
                f(a)
                return
        }
        perm(a, f, i+1)
        for j := i + 1; j < len(a); j++ {
                a[i], a[j] = a[j], a[i]
                perm(a, f, i+1)
                a[i], a[j] = a[j], a[i]
        }
}

func main() {
Perm([]rune("abc"), func(a []rune) {
        fmt.Println(string(a))
})
}

我们知道GO编程中的goroutine,通道是goroutine与其他goroutine通信的路径。在正常情况下,这些goroutine可以同时发送和接收数据。

是的,Go编程语言是一种多线程编程语言,它不仅支持多线程,而且其基本设计就基于多线程。

在Go编程语言中,命令行参数可以通过os.Args变量访问。

如果一个变量在GO编程语言中覆盖了某个函数内部变量的作用域,则称该变量遮蔽了另一个变量。

假设在go编程中,一个变量在函数内部声明,其名称和类型与在函数外部声明的变量相同。

GO编程语言在计算方面非常快,原因如下:

  1. 简洁的语法
  2. 更高的并发性
  3. 快速的编译系统
  4. 对服务器的依赖性很小
  5. 所有超链接和库都合并到一个二进制文件中。

是的,GO进程会占用大量内存,因为在GO编程中,内存分配器会预先获取并保留一定量的虚拟内存用于分配。

Go编程中的map被认为是引用类型。