1、Go支持什么形式的类型转换?将整型转换为浮点数。
go是强类型语言,支持显式的类型转换。
i:=10
j:=1.23
sum := i+int(j)
2、什么是Goroutine?你如何停止它?
goroutine是比线程更轻量的线程,可以在方法前加入go定义一个goroutine。
goroutine是通过channel来停止,可以通过for下加个select监听channel接收退出信号进行退出。
package main
func main(){ c
h := make(chan, bool)
go func(){
for{
select{
case <-ch:
fmt.Println("goroutine 退出")
return default:
}
}
}()
ch <-true
}
3、如何在运行时检查变量类型?
类型开关(type switch) 是运行时检查变量类型的方法。类型检查是通过switch进行检查变量类型,至少有一个case,如果case里的条件都不满足,则执行default。
4、Go两个接口之间可以存在什么关系?
如果A接口与B接口下都有实现了同样的方法,那么这两个接口是等价的,可以互相赋值。
5、Go当中同步锁有什么特点?作用是什么?
go使用mutex进行锁,如果一个goroutine持有锁,则其他goroutine只能阻塞等待,等待该goroutine把锁释放。
RWMutex持有锁时,其他进程不可写,只可读。
Mutex持有锁时,其他进程不可以写也不可以读。
Mutex的作用是当并行编程时,可以保证资源的独有性,不会因为并发导致数据错乱,保证系统的稳定性。
6、Go语言当中Channel有什么特点,需要注意什么?
1、写入一个nil的channel时,会永久堵塞。
2、读取一个nil的channel时,会永久堵塞、
3、写入一个已关闭的channel时,会panic。
4、关闭一个已经关闭的channel时,会panic。
5、从一个已经关闭的channel接收数据时,如果缓存为空则返回一个零值。
7、Go语言当中Channel缓冲有什么特点?
无缓冲的channl是同步的,有缓冲的channel是非同步的。
8、Go语言中cap函数可以作用于哪些内容?
cap可以作用于
channel
map
slice
9、Go 语言当中 new 的作用是什么?
new是一个内建函数,使用new时,实例化该对象,并且返回指向该实例的指针。
10、Go语言中make的作用是什么?
make的作用是为slice,map,chan初始化,并返回引用,make函数是内建函数,
make和new的区别在于make是返回引用,new是返回实例的指针。
make只能作用于slice,map,channel。
11、Printf(),Sprintf(),FprintF()都是格式输出,有什么不同?
虽然都是输出,但是输出的目标是不一样的。
printf是标准输出,输出到终端的屏幕。
sprintf是把格式化的字符串输出到指定的字符串。
fprintf是输出到文件中。
12、Go语言中数组和切片的区别是什么?
数组:
数组是固定长度的,数组长度不同所属的数组类型也不同,例如[3]int和[4]int。数组可以通过初始化来计算大小,一旦指定了大小,则不可以改变。数组是值传递。
切片:
切片可以通过数组方式或者make方式来初始化,切片是引用传递。切片初始化的时候len=cap,切片大小是不定的。数组的组成部分是指针,长度,容量。
13、Go语言当中值传递和地址传递(引用传递)如何运用,有什么区别?举例说明
1、值传递是把参数的值复制一份传入到函数中,两个所指向地址不同,不可以相互修改。
2、引用传递是把变量本身传入到函数中,可以对该变量的内容进行修改。
14、Go语言当中数组和切片在传递的时候的区别是什么?
1、数组是值传递
2、切片看上去是引用传递,但其实也是值传递。
15、Go语言是如何实现切片扩容的?
当切片小于等于1024时,是2倍扩容的,大于1024则1.25倍扩容。
16、看下面代码defer的顺序是什么?defer的作用和特点是什么?
defer的作用是:
只需要在普通函数或者方法前加上defer关键词,就完成defer的语法。它的作用是在该方法内的return或者panic前执行,如果有多个defer,则先定义的最后执行,就是先进后出。
defer的常用场景:
通常是用于处理成对的操作,例如文件开启、关闭。锁开启,释放锁。
17、Golang Slice 的底层实现。
切片是基于数组,数组是连续的内存,切片可以理解为是底层数组的一个抽象,所以它自己本身非常小。数据结构为指向底层数组的指针、切片的大小、切片的长度。
18、Golang Slice的扩容机制,有什么注意点?
切片扩容如果小于等于1024,是按两倍递增,如果大于1024,是按照1.25倍递增。
19、扩容前后的Slice是否相同?
1、如果原数组还有容量,则数组会在原数组里面增加容量。
2、如果原数组中容量已经满了,则会申请一个新的内存块,把原来的值拷贝过来,再执行append操作。
20、Golang 的参数传递、引用类型。
Go语言传参是通过值传递的,即一个备份,一个拷贝。参数传参分为非引用类型(int,string,struct等),和引用类型(chan, map, slice)。非引用类型作为传参时,函数内不可改变原始数据的内容数据。引用类型作为传参时,函数可以修改原内容数据。
引用类型分为chan,map,slice。
当用new内置函数初始化时,会计算类型大小、分配零值空间、返回指针。
当用make内置函数初始化时,会被编译器翻译成具体的创建函数,由其分配内存及初始化成员结构,返回对象而非指针。