原文地址:Go面试看这里了~(二十三)
1、有异常类型么?
Go没有异常类型,只有错误类型(Error),函数要想返回错误,通常用返回值表示异常状态,像C错误码,可逐层返回,直到被处理。
Go虽无异常概念,但却有更为恐怖的panic,由于有recover,在一定程度上, panic 可以类比做异常,Go错误和异常(panic)是可以互相转换的,方式如下:
错误转异常:如程序逻辑上尝试请求某URL,最多尝试三次,尝试三次的过程中请求失败是错误,尝试完第三次还不成功的话,失败就被提升为异常。
异常转错误:如panic触发的异常被recover恢复后,将返回值中error类型的变量进行赋值,以便上层函数继续走错误处理流程。
2、指针的作用?
指针变量指向值的内存地址,指针类型用于传递地址,而不是传递值,Go函数所有参数都是传递一个复制的值,如果值的体积过大,则会严重降低效率,而传递地址,则会提高效率,另外传递指针也能让Go函数实现对变量值的修改,如一个复杂类型的值被传递了若干次后,和自己比较,虽用于保存的容器和名称变了,但用于保存值的地址不变,此时只要使用指针进行对比,就知道还是原来的东西。
用处如下:
指针指向变量的地址。
指针变量的创建和传递。
大量数据传递时,可以传递指针地址。
3、点赞系统设计?
需提供的API接口如下:
点赞API接口(规则:没有点赞则点赞,已点赞则取消)。
文章点赞总数获取。
根据文章获取点赞列表。
判断用户是否对文章点赞。
用户获得的点赞总数。
存储服务搭配:MySQL+Redis+RabbitMQ。
数据获取和存储思路:
MySQL负责数据存储,Redis负责存储热点数据,RabbitMQ负责存储即将写入MySQL的数据,后台走计划任务消费RabbitMQ往数据库写入数据。
4、非接口的任意类型 T() 都能够调用 *T 的方法吗?反过来呢?
仅当T类型的值是可寻址(addressable) 时,T值可调为*T类型声明的方法,编译器在调用指针所属的主方法前,会自动取T值的地址,因为不是任何T值都是可寻址的,所以并非任何T值都能够调用为*T类型声明的方法。
反过来,*T类型的值可调为类型T声明的方法,因为引用指针总是合法的,事实上,可认为对于每一个为T类型声明的方法,编译器都会为类型*T自动隐式声明一个同名和同签名的方法。
不可寻址的值如下:
字符串中的字节。
map 对象中的元素(slice 对象的元素是可寻址的,因为slice的底层是数组)。
常量。
包级别的函数等。
5、如CPU只有一核会不会阻塞?
Go1.14之前的版本会阻塞,Go1.14及之后的版本实现了基于信号的抢占式调度,所以不会阻塞,可牢记sysmon系统调用函数。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)