go语言指针面试题 golang 接口 指针类型 值类型( 六 )


break关键字可跳出select的执行 。
goroutine管理、信息传递 。context的意思是上下文 , 在线程、协程中都有这个概念 , 它指的是程序单元的一个运行状态、现场、快照,包含 。context在多个goroutine中是并发安全的 。
应用场景:
例子参考:
waitgroup
channel
len:切片的长度,访问时间复杂度为O(1),go的slice底层是对数组的引用 。
cap:切片的容量,扩容是以这个值为标准 。默认扩容是2倍,当达到1024的长度后,按1.25倍 。
扩容:每次扩容slice底层都将先分配新的容量的内存空间,再将老的数组拷贝到新的内存空间 , 因为这个操作不是并发安全的 。所以并发进行append操作,读到内存中的老数组可能为同一个,最终导致append的数据丢失 。
共享:slice的底层是对数组的引用,因此如果两个切片引用了同一个数组片段,就会形成共享底层数组 。当sliec发生内存的重新分配(如扩容)时,会对共享进行隔断 。详细见下面例子:
make([]Type,len,cap)
map的底层是hash table(hmap类型),对key值进行了hash,并将结果的低八位用于确定key/value存在于哪个bucket(bmap类型) 。再将高八位与bucket的tophash进行依次比较,确定是否存在 。出现hash冲撞时,会通过bucket的overflow指向另一个bucket,形成一个单向链表 。每个bucket存储8个键值对 。
如果要实现map的顺序读?。枰褂靡桓鰏lice来存储map的key并按照顺序进行排序 。
利用map,如果要求并发安全,就用sync.map
要注意下set中的delete函数需要使用delete(map) 来实现,但是这个并不会释放内存,除非value也是一个子map 。当进行多次delete后,可以使用make来重建map 。
使用sync.Map来管理topic,用channel来做队列 。
参考:
多路归并法:
pre class="vditor-reset" placeholder="" contenteditable="true" spellcheck="false"p data-block="0"(1)假设有K路a href=""数据流/a , 流内部是有序的,且流间同为升序或降序;
/pp data-block="0"(2)首先读取每个流的第一个数,如果已经EOF , pass;
/pp data-block="0"(3)将有效的k(k可能小于K)个数比较,选出最小的那路mink,输出,读取mink的下一个;
/pp data-block="0"(4)直到所有K路都EOF 。
/p/pre
假设文件又1个G,内存只有256M,无法将1个G的文件全部读到内存进行排序 。
第一步:
可以分为10段读取 , 每段读取100M的数据并排序好写入硬盘 。
假设写入后的文件为A,B,C...10
第二步:
将A,B,C...10的第一个字符拿出来,对这10个字符进行排序,并将结果写入硬盘,同时记录被写入的字符的文件指针P 。
第三步:
将刚刚排序好的9个字符再加上从指针P读取到的P+1位数据进行排序,并写入硬盘 。
重复二、三步骤 。
go文件读写参考:
保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同的排序叫稳定排序 。
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法 。
基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法 。
参考:
head只请求页面的首部 。多用来判断网页是否被修改和超链接的有效性 。
get请求页面信息,并返回实例的主体 。
参考:
401:未授权的访问 。
403: 拒绝访问 。
普通的http连接是客户端连接上服务端,然后结束请求后,由客户端或者服务端进行http连接的关闭 。下次再发送请求的时候,客户端再发起一个连接,传送数据,关闭连接 。这么个流程反复 。但是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个连接就可以复用了,一个http处理完之后,另外一个http数据直接从这个连接走了 。减少新建和断开TCP连接的消耗 。这个可以在Nginx设置,

推荐阅读