Golang面试题集锦

介绍下TCP

简单介绍一下Golang?

谷歌开发的一种系统编程语言。它具有内置的垃圾收集机制并支持并发。代码可以编译成单个可执行二进制文件,不需要添加库或运行时环境即可在服务器上执行。

Go有几种类型的channel?

Go的gpm模型介绍下

Go有几种锁?

包括互斥锁,读写锁

go中值传递、引用传递、指针传递的区别?

1、go语言中的值类型:

int、float、bool、array、sturct等

值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数

声明一个值类型变量时,编译器会在栈中分配一个空间,空间里存储的就是该变量的值

2、go语言中的引用类型:

slice,map,channel,interface,func,string等

声明一个引用类型的变量,编译器会把实例的内存分配在堆上

string和其他语言一样,是引用类型,string的底层实现struct String { byte* str; intgo len; }; 但是因为string不允许修改,每次操作string只能生成新的对象,所以在看起来使用时像值类型。

所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

需要注意的是:引用类型在函数的内部可以对它的值进行修改,但是如果给形参重新赋值,重新赋值后的形参再怎么修改都不会影响外面的实参了

nil可以赋值给引用类型(除string外)、error类型和指针类型

3、go语言中的指针类型:

一个指针变量指向了一个值的内存地址

当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针

一个指针变量通常缩写为 ptr

其实引用类型可以看作对指针的封装

go语言中没有隐藏的this指针,这句话是什么意思?

方法施加的对象显式传递,没有被隐藏起来

golang的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达

方法施加的对象不需要非得是指针,也不用非得叫this

解释以下命令的作用?

go env: #用于查看go的环境变量

go run: #用于编译并运行go源码文件

go build: #用于编译源码文件、代码包、依赖包

go get: #用于动态获取远程代码包

go install: #用于编译go文件,并将编译结构安装到bin、pkg目录

go clean: #用于清理工作目录,删除编译和安装遗留的目标文件

go version: #用于查看go的版本信息

go格式化输出%v、%+v、%#v 的区别?

1、%v 只输出所有的值

2、%+v 先输出字段属性,再输出该字段的值

3、%#v 先输出结构体名字值,再输出结构体(字段属性+字段的值)

go语言中的引用类型包含哪些?

1、数组切片

2、字典(map)

3、通道(channel)

4、接口(interface)


在go语言中,Printf()、Sprintf()、Fprintf()函数的区别用法是什么?

都是把格式好的字符串输出,只是输出的目标不一样:

Printf(),是把格式字符串输出到标准输出(一般是屏幕,可以重定向)。

Printf() 是和标准输出文件(stdout)关联的,Fprintf 则没有这个限制.

Sprintf(),是把格式字符串输出到指定字符串中,所以参数比printf多一个char*。那就是目标字符串地址。

Fprintf(), 是把格式字符串输出到指定文件设备中,所以参数笔printf多一个文件指针FILE*。主要用于文件操作。Fprintf()是格式化输出到一个stream,通常是到文件。


说说go语言中的for循环?

for循环支持continue和break来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环;

for循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量。


cap()和len()函数的区别是什么?

len()返回切片中的元素个数。

cap()返回切片的容量即切片可以容纳的元素数量。

哈希表或哈希映射允许快速查找。GO如何实现哈希映射?(陷阱问题)

哈希表在Golang中相当于map,也就是哈希映射。

hash-table := make(map[string]string)

golang的select可以用于什么?

golang的select就是监听IO操作,当IO操作发生时,触发相应的动作,每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作。

Go是否支持泛型?(陷阱问题)

否,泛型是方便的,但是它们在类型系统和运行时的复杂性方面付出了代价。

golang中的三个点 ‘…’ 的用法?

‘…’ 其实是go的一种语法糖。
它的第一个用法主要是用于函数有多个不定参数的情况,可以接受多个不确定数量的参数。
第二个用法是slice可以被打散进行传递。

package main
import ("fmt")
func test1(args ...string) { //可以接受任意个string参数
    for _, v:= range args{
        fmt.Println(v)
    }
}
func main(){
    var strss= []string{"slice", "234", "golang", "go"}
    test1(strss...) //切片被打散传入
}

go语言中&和*区别?

1.&是取地址符号,即取得某个变量的地址,如&a

2.*是指针运算符,可以表示一个变量是指针类型,也可以表示一个指针变量所指向的存储单元,也就是这个地址所存储的值。

go语言中指针运算有哪些?

1、可以通过“&”取指针的地址;

2、可以通过“*”取指针指向的数据;

go struct能不能比较?

因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型

go语言中,GoStub的作用是什么?

A. GoStub可以对全局变量打桩;

B. GoStub可以对函数打桩;

C. GoStub不可以对类的成员方法打桩;

D. GoStub可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为;

切片和数组的显著差异是什么?

数组大小是固定的,切片大小不是。在运行时可以动态地增加或减少切片的大小,但数组不可以。切片类似于链表,可以向切片push,pop数据,实现FIFO,LIFO。使用了内置的添加、复制功能对切片操作。

go语言触发异常的场景有哪些?

A. 空指针解析

B. 下标越界

C. 除数为0

D. 调用panic函数

在go语言中,new和make的区别?

1、new 的作用是初始化一个指向类型的指针(*T)

new函数是内建函数,函数定义:func new(Type) *Type

使用new函数来分配空间。传递给new 函数的是一个类型,不是一个值。返回值是 指向这个新分配的零值的指针。

2、make 的作用是为slice,map或chan初始化并返回引用(T)。

make函数是内建函数,函数定义:func make(Type, size IntegerType) Type

· 第一个参数是一个类型,第二个参数是长度

· 返回值是一个类型

make(T, args)函数的目的与new(T)不同。它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是*T)的一个初始化的(不是零值)的实例。

简单介绍下golang中make和new的区别?

new(T)是为一个T类型的新值分配空间,并将此空间初始化为T的零值,并返回这块内存空间的地址,也就是T类型的指针T,该指针指向T类型值占用的那块内存。

make(T)返回的是初始化之后的T,且只能用于slice,map,channel三种类型。

make(T,args)返回初始化之后T类型的值,且此新值并不是T类型的零值,也不是T类型的指针T,而是T类型值经过初始化之后的引用。

暂无评论

发送评论 编辑评论


				
上一篇
下一篇