阅读量: 11
介绍下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可以被打散进行传递。
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类型值经过初始化之后的引用。