Go常见面试题练习一

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内置函数初始化时,会被编译器翻译成具体的创建函数,由其分配内存及初始化成员结构,返回对象而非指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值