golang面试准备

简介

这两天面了几家公司,感觉有的概念明明知道,但就是说不清楚,总结一下。

声明

本文资料来源于网络,由本文作者收集整理。

正文

简述golang中make和new的区别

make用于内建类型(只能用于创建map、slice 和channel)的内存分配。并且返回一个有初始值(非零)的T类型,而不是T。
new用于各种类型的内存分配。new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:
new返回指针。

总结:make用于内建类型,并初始化,返回值类型;new用于各种类型,分配内存,不进行初始化,返回指针类型

main和init函数的区别

首先,这两个函数应用位置不同,init函数可以应用于所有的package,main只能应用于 package main,需要注意的是虽然一个package中可以写任意多个init,但是无论是从可读性还是可维护性来说,都是不推荐的;
其次,这两个函数定义时都不能有任何的参数和返回值

总结:init函数为初始化操作,应用于所有package,main函数为程序入口,只能应用于package main

go中的channel和mutex锁机制的原理异同与使用场景

程序间通讯两种模型: 1)共享内存 2)消息传递
channel是消息传递在Go上的具体实现, 四个基本操作:打开/关闭/写/读channel
channel与mutex重要区别: 一件任务是在“调用处”还是“被调用处”执行
channel典型应用场景:一个goroutine负责处理某个任务或资源,其他goroutine通过channel向它发送相关指令
mutex典型应用场景:goroutine访问一个共享资源前进行加锁,然后自己处理完相关操作后再释放资源
channel会消耗更多成本,因为涉及到上下文切换;而mutex通常只是一个原子操作
无法通过mutex控制并发的goroutine数量, 但是可以通过带缓存的channel来指定并发goroutine数

总结:
异:channel用于消息传递,在调用处执行,消耗更大;mutex用于共享内存,在被调用处执行
同:都用于多个goroutine之间的通信
应用场景:
channel:一个goroutine负责处理某个任务或资源,其他goroutine通过channel向它发送相关指令
mutex:goroutine访问一个共享资源前进行加锁,然后自己处理完相关操作后再释放资源

go中实现并发的两种方法和各自的优劣

sync.WaitGroup:该方法最大优点是Wait()可以阻塞到队列中的所有任务都执行完才解除阻塞,但是它的缺点是不能够指定并发协程数量.
channel:优点是能够利用带缓存的channel指定并发协程goroutine,比较灵活.但是它的缺点是如果使用不当容易造成死锁;并且他还需要自己判定并发goroutine是否执行完.
但是相对而言,channel更加灵活,使用更加方便,同时通过超时处理机制可以很好的避免channel造成的程序死锁,因此利用channel实现程序并发,更加方便,更加易用.

总结:
sync.WaitGroup优点是:等待所有任务完成后继续执行代码,无需sleep固定时间;缺点是无法指定固定的goroutine数目
channel优点是能够利用带缓存的channel指定并发协程goroutine;缺点是使用不当容易造成死锁,需要自己判定并发goroutine是否执行完

Go中的数组和C中的数组有什么区别

Go中数组是值类型,数组赋值给另一个变量会对所有元素进行拷贝
向函数传递数组参数,传递的是该数组的拷贝而不是指针
数组的长度也是数组类型的一部分,[2]int和[4]int是两种不同的类型

总结:go中数组是值类型,传递参数时传递的是该数组的拷贝,不同长度的数组是不同的类型

Go中的接口

接口可以看作是一种对象的行为集合,一系列函数的集合
要实现一个接口,需要实现该接口中的所有方法
实现接口是非侵入式的,去掉复杂继承体系
(未完待续)

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

##

您的支持将鼓励我继续创作!