golang虽然相对其它语言来说算是一门新的编程语言,但是其实自它诞生以来也已经有了十年以上的历史了。最近这两年,golang语言变得异常火爆,很多公司都开始大量招收golang开发人员,而golang程序员的面试就显得非常重要,下面笔者总结几个golang中经常被问到的经典题目。
golang中的内存管理和其它语言基本一样,也是分为堆区和栈区,较c语言进步的地方是它的内存垃圾回收是自动的,不需要程序员手动释放内存。下面总结几点golang中内存分配到堆区和栈区的几点特性
Goroutines
golang语言最引以为傲的点应该就是goroutine了,它通过csp模型,解决了并发问题,而且它实现起来非常的简单优雅。
关于goroutine也有几点需要说明的。
Channel
channel是golang语言一个特殊的数据结构,goroutine就是通过通道进行通讯,通道类似于一个队列,遵循先进先出原则。
WaitGroup,Mutex,RWMutex
当我们想要确定所有的goroutine是否都执行完毕的时候,我们需要一个同步机制,这个时候我们可以使用WaitGroup来进行同步,它可以控制一组gorouine都执行完毕。
Mutex是互斥锁,同一个时间只有一个gorouine获取到锁才能执行,其它的需要等待。
RWMutex是读写锁,顾名思义,当读的次数多的时候,我们可以加多个读锁,而写入操作的时候,只能加一个写锁。
锁的存在都是为了限制资源的竞争,防止资源被同时修改引起冲突。
Interface
golang语言中的接口是隐式实现的,也就是说它不需要显示声明,只要实现接口的方法,我们就说它实现了接口。
接口是golang语言中的一种类型,它可以成为变量的定义,函数的入参,函数的返回值。
结构体可以实现接口,结构体指针也可以实现接口,因为接口定义的时候没有指定类型。
golang中的接口不是任意类型,它是一种特殊类型。