go语言基础语法面试题 golang基础面试题( 五 )


共享:slice的底层是对数组的引用,因此如果两个切片引用了同一个数组片段,就会形成共享底层数组 。当sliec发生内存的重新分配(如扩容)时,会对共享进行隔断 。详细见下面例子:
【go语言基础语法面试题 golang基础面试题】 make([]Type,len,cap)
map的底层是hash table(hmap类型) , 对key值进行了hash,并将结果的低八位用于确定key/value存在于哪个bucket(bmap类型) 。再将高八位与bucket的tophash进行依次比较 , 确定是否存在 。出现hash冲撞时,会通过bucket的overflow指向另一个bucket,形成一个单向链表 。每个bucket存储8个键值对 。
如果要实现map的顺序读取,需要使用一个slice来存储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段读?。慷味寥?00M的数据并排序好写入硬盘 。
假设写入后的文件为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设置,
这个keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后 , 才开始关闭这个连接 。
特别注意TCP层的keep alive和http不是一个意思 。TCP的是指:tcp连接建立后 , 如果客户端很长一段时间不发送消息,当连接很久没有收到报文,tcp会主动发送一个为空的报文(侦测包)给对方 , 如果对方收到了并且回复了,证明对方还在 。如果对方没有报文返回 , 重试多次之后则确认连接丢失,断开连接 。

推荐阅读