原文地址:Go面试看这里了~(二十)
1、cgo了解么?
Go提供的标准库,支持Go程序与C的类库交互 *** 作,Go代码中加入【import “C”】语句就可以启动CGO特性。
2、make为什么不能返回指针?
make只支持slice、map、channel三种类型,某种意义上也可算作引用类型,返回引用类型的指针相较于直接使用引用本身并无优势可言,还需多使用一块儿内存保存指针,就好像使用整型变量,只会直接定义使用,而不是使用new创建。
指针能减少函数参数和返回的变量拷贝,slice、map、channel底层数据保存在指针类型中,基本不会出现大批量拷贝的情况,Go函数返回指针还涉及到内存逃逸分析,相较于此,引用显得轻量,不是任何情况下地址传递都是值得的。
对于引用类型主要在需更新数据时使用指针,Go没有构造函数,new创建返回的是变量指针,只会初始化零值,对于slice、map、channel这种引用类型的创建,只会创建出来一个指向nil的指针。
3、GORM了解么?
ORM(Object-Relationl Mapping)的作用是映射数据库和对象之间的关系,方便在实现数据库 *** 作时不用写复杂的sql语句,把对数据库的 *** 作上升到对于对象的 *** 作,GORM就是基于Go实现的ORM库。
4、GIN的Handler底层数据结构?
Handler是请求的处理对象,需实现ServeHTTP方法,ServeHTTP执行的是业务逻辑,一般定义的func(w http.ResponseWriter, r *http.Request)的方法需要经过http.HandlerFunc包装为Handler对象。
Handler数据结构如下:
// Handler接口
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
// HandlerFunc实现了Handler接口
type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
Handler函数是具有func(w http.ResponseWriter, r *http.Requests)签名的函数,需要经过HandlerFunc函数包装,否则不能作为路由的Handler对象,HandlerFunc实现了ServeHTTP接口方法的函数。
5、GRPC相对于RESTFUL有什么优势?
RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可进行通信,且遵从server/client模型,客户端使用RPC调用server端提供的接口时就像是调用本地的函数一样。
GRPC和Restful API都提供一套通信机制,用于server/client模型通信,且都使用HTTP作为底层传输协议,严格来讲,GRPC使用的HTTP2.0,而Restful API则不一定),GRPC特有的优势如下:
GRPC可以通过Protobuf来定义接口,可以有更加严格的接口约束条件,支持多种语言。
Protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高传输速度。
GRPC可以支持streaming流式通信(HTTP2.0),提高传输速度。
6、Protobuf了解下?
Protobuf实际是一套类似Json或者XML的数据传输格式和规范,用于不同应用或进程之间进行通信时使用,相比较而言,Protobuf有如下优点:
足够简单。
序列化后体积很小:消息大小只需要XML的1/10 ~ 1/3。
解析速度快,解析速度比XML快20 ~ 100倍。
多语言支持。
更好的兼容性,Protobuf设计原则之一就是要能够很好的向下支持或向上兼容。
7、defer、return执行顺序?
多个defer执行顺序为后进先出,defer、return、返回值三者的执行逻辑应该是return最先执行,return负责将结果写入返回值中,接着defer开始执行一些收尾工作,最后函数携带当前返回值退出。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)