记录面试中golang常问的点

本文主要介绍了Golang面试中常见的知识点,包括Go语言特色、引用传递与值传递的区别、new和make的使用、map的特点、对象池的概念、接口实现、垃圾回收机制、切片操作、defer的执行顺序、for range的遍历以及channel的使用注意事项。
摘要由CSDN通过智能技术生成

介绍

接触golang也有一年多了,写博客主要是记录一下日常所学和遇到的坑。

1.go特色

1.开放源代码,go本是就是用go语言编写的。
2.静态类型和编译型。
3.跨平台。
4.自动垃圾回收。
5.原生并发编程。
6.完善的构建工具。
7.多编程范式。
8.代码风格强制统一。

2.go中的引用传递和值传递

Golang 中函数之间传递变量时总是以值的方式传递的,无论是 int,string,bool,array 这样的内置类型(或者说原始的类型),还是 slice,channel,map 这样的引用类型,在函数间传递变量时,都是以值的方式传递,也就是说传递的都是值的副本。

Go 语言里的引用类型有如下几个:切片、映射、通道、接口和函数类型。当声明上述类型的变量时,创建的变量被称作标头(header)值。从技术细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据结构的指针。因为标头值是为复制而设计的,所以永远不需要共享一个引用类型的值。标头值里包含一个指针,因此通过复制来传递一个引用类型的值的副本,本质上就是在共享底层数据结构。

所以,引用类型在函数传递的时候,是值传递,只不过这里的“值”指的是标头值。

3.new和make,二者有明显区别

适用范围:make 只能创建内建类型(slice map channel), new 则是可以对所有类型进行内存分配
返回值: new 返回指针, make 返回引用
填充值: new 填充零值, make 填充非零值

4.golang中的map

1.打印是随机的
2.不是线程安全的

5.对象池

在高并发或者大量的数据请求的场景中,我们会遇到很多问题,垃圾回收就是其中之一,为了减少优化GC,我们一般想到的方法就是能够让对象得以重用。这就需要一个对象池来存储待回收对象,等待下次重用,从而减少对象产生数量。我们可以把sync.Pool类型值看作是存放可被重复使用的值的容器。此类容器是自动伸缩的、高效的,同时也是并发安全的。

6.接口的实现

只要一个数据类型的方法集合中包含某个接口声明的所有方法,那么它一定就是这个接口的实现类型(刚接触时一直不明白接口与方法之间怎么关联上的)

7.垃圾回收

常用的垃圾回收主要有引用计数,标记-清除,分代收集,三色标记
go用的是三色标记。
首先创建三个集合:白、灰、黑。
将所有对象放入白色集合中。
然后从根节点开始遍历所有对象(注意这里并不递归遍历),把遍历到的对象从白色集合放入灰色集合。
之后遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合
重复 4 直到灰色中无任何对象
重复以上操作
收集所有白色对象(垃圾)

8.切片

切片自己不拥有任何数据。它只是底层数组的一种表示。对切片所做的任何修改都会反映在底层数组中。

9.defer

多个defer出现的时候,多个defer之间按照LIFO(后进先出)的顺序执行

10.for range

用for range来遍历数组或者map的时候,被遍历的指针是不变的。

11.make(chan int)

make(chan int) 和 make(chan int, 1)是不一样的,make(chan int)一旦被写入数据后,当前goruntine就会被阻塞,直到有人接收才可以。make(chan int, 1)是直到写入第二个数据才会阻塞。

12.channel

1.channel如果close了以后,写或者再次close会panic,可以正常读。
2.如果go出去一个线程,报了panic,主线程也会中断,并且主线程recover无法接到子线程的panic。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值