面经与八股文汇总

什么是socket(嵌套字)编程

socket 其实就是操作系统提供给程序员操作「网络协议栈」的接口,说人话就是,你能通过socket 的接口,来控制协议找工作,从而实现网络通信,达到跨主机通信。
socket编程就是开发一个网络应用,在两个客户端之间发消息。
accept()函数:用来接收一个套接字中已建立的连接。它提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符。新建立的套接字准备发送send()和接收数据recv()。

Get与Post的区别

1、Get 是用来从服务器上获得数据,而 Post 是用来向服务器上传递数据。
2、GET在浏览器回退时是无害的,而POST会再次提交请求。
3、GET请求只能进行url编码,而POST支持多种编码方式。
4、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
5、GET请求在URL中传送的参数是有长度限制的,而POST么有。
6、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
7、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
8、GET参数通过URL传递,POST放在Request body中。

什么是消息队列

消息队列(mq)是什么?
MQ 的本质:一发一存一消费
MQ 的应用场景:系统解耦、异步通信和流量削峰;还有延迟通知、最终一致性保证、顺序消息、流式处理等等。
设计难点:1.RPC 通信;2.高可用设计;3.存储设计;4.消费关系管理;5.高性能设计

  • 如何设计一个 MQ?
  • 1、需要从功能性需求(收发消息)和非功能性需求(高性能、高可用、高扩展等)两方面入手。
  • 2、功能性需求不是重点,能覆盖 MQ 最基础的功能即可,至于延时消息、事务消息、重试队列等高级特性只是锦上添花的东西。
  • 3、最核心的是:能结合功能性需求,理清楚整体的数据流,然后顺着这个思路去考虑非功能性的诉求如何满足,这才是技术难点所在。
context 结构原理
  • 出现概率:60% 漕河泾的游戏公司全问了
    问题:一个单独的 goroutine运行,倒也没什么问题。如果是一个goroutine衍生了多个goroutine,并且它们之间还需要交互-比如传输数据,那彼此怎么传输数据呢?如果一个子goroutine取消了,要取消跟其相关的goroutine,怎么样才可以做到?
    用途:
  • 控制goroutine退出
    及时退出 WithCancel
    时间点退出 WithDeadline
    时间间隔退出 WithTimeout
  • 设置值
  • 重要接口
    Context:定义了Context接口的4个方法。
    canceler:context接口取消,定义了2个方法。
内存逃逸

什么是内存逃逸:内存被分配到堆上而不是栈上,可能会引起GC频繁回收。
Go中的变量只有在编译器可以证明在函数返回后不会再被引用的,才分配到栈上,其他情况下都是分配到堆上。
产生情况:1、将一个局部变量的地址返回到上层函数;2、在编译阶段无法确定其作用域与传递的路径或大小时;3、调用接口类型的方法;4、slice 由于 append 操作超出其容量,因此会导致 slice 重新分配。
如何避免:1、减少外部引用, 如指针。2、明确切片大小。3、Go 中的接口类型的方法调用是动态调度,因此不能够在编译阶段确定,所有类型结构转换成接口的过程会涉及到内存逃逸的情况发生。如果对于性能要求比较高且访问频次比较高的函数调用,应该尽量避免使用接口类型。
其他:上动态分配内存比栈上静态分配内存,开销大很多。
对于Go程序员来说,编译器的这些逃逸分析规则不需要掌握,我们只需通过go build -gcflags '-m’命令来观察变量逃逸情况就行了。
不要盲目使用变量的指针作为函数参数,虽然它会减少复制操作。但其实当
参数为变量自身
的时候,复制是在栈上完成的操作,开销远比变量逃逸后动态地在堆上分配内存少的多。

传函数与传指针的区别

当传一个参数值到被调用函数里面时,实际上是传递了这个值的一份copy拷贝。
所以在被调用函数里修改参数值时,调用函数中相应的实参不会发生任何变化,因为数值变化只作用在拷贝上。
1.传指针使得多个函数能操作同一个对象。
2.传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。
3.Go语言中channel,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针)

用redis实现数据去重

利用redis的Set结构来进行判重。主要利用了redis set结构的这两个命令:SADD和SCARD。
SADD key member [member…]:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作成员的集合。 如果member元素不在集合里面,则返回1;如果member元素已经存在于集合当中,则返回0。
SCARD key:返回集合 key 中元素的数量。

MySql两种存储引擎的区别

MyISAM
不支持事务,但是每次查询都是原子的;
支持表级锁,即每次操作是对整个表加锁;
存储表的总行数;
一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
采用非聚集索引,索引文件的数据域存储指向数据文件

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值