Go面试看这里了~(二十三)

Go面试看这里了~(二十三),第1张

原文地址: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系统调用函数。

至此,本次分享就结束了,后期会慢慢补充。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存