掘友等级
获得徽章 0
#青训营 x 字节后端训练营#
go语言的滴答器?
当我们在长连接服务编程中,非常常见使用心跳包来验证客户端存活状态,在go中常使用滴答器来实现此类操作,引入time包,按照以下代码进行建立滴答器
ticker := time.NewTicker(1 * time.Second)
滴答器有一个通道,当你设置对应的事件间隔后,滴答器会往该通道写入一个值。我们使用range或者select来阻塞读取这个滴答器,就可以实现滴答器的效果
#青训营 x 字节后端训练营#
grpc负载均衡
此篇文章介绍grpc的负载均衡三种解决方案
集中式lb,进程式lb,独立lb进程。
同时介绍了protobuf的使用和grpc流模式和6种负载均衡算法。
#青训营 x 字节后端训练营#
C/S架构游戏后端的选型。
低实时性采用http即可,比如卡片类。
有实时性要求但不高,可采用websocket,如在线休闲小游戏。
高实时性,需要采用UDP来保证。
#青训营 x 字节后端训练营#
go语言的枚举
在学校,我们常见学习的语言均有枚举,c/cpp,Java,Python。但在go中并没有枚举类型,对于学习了其他语言,尤其是有状态机思维的同学,没有枚举是很难受的。但是我们可以使用常量和iota来模拟枚举。
我们在定义const常量时,将第一个值等于iota,后面的值会自动被赋值,即实现了枚举。
#青训营 x 字节后端训练营#
any与interface{}
在go 1.18后引入了一个新关键字any,目的是为了替换原有的interface{},我们知道在1.18前我们通常使用空接口来实现任意值,但由于泛型的加入,官方推出来any来替代泛型中任意类型参数,避免参数定义过于冗余。any的实现也并不是什么高深的技巧,他直接采用了类型别名,也就是type any interface{}
#青训营 x 字节后端训练营#
匿名函数
go语言中常见匿名函数,通常我们见过最多的就是回调,即定义一个函数参数,并在执行函数内调用回调函数。由于go支持函数式编程,可以将一个匿名函数赋值给一个变量,尤其是在大量连续调用函数可以实现简化调用
「
juejin.cn」
- - - - - - - - - - - - - - -
#青训营 x 字节后端训练营#
此文包含非常经典的nil≠nil,因为error被定义为接口,拥有type和value两部分。当我们想自行实现一个error时或者初始化一个error类型变量,如果我们将其初始化为nil,并将其作为返回值,然后对返回的error进行判空,error永远不为nil,这将引起bug。所以当自定义error时,我们要尽可能的避免error可以被直接声明。通过提供函数的形式去生成error。
#青训营 x 字节后端训练营#
Go语言学习过程中好网站
pkg.go.dev。这个网站为Go语言官网给开发者查找各种packages的网站,在此网站上你可以搜索一些包,例如net/http,gorilla/websocket,你可以查找每个包的功能,开源地址,和包内各种函数的使用方法,例如你查找net/http,他会给你一个使用这个包创建一个http服务器的示例等等。部分函数需要查看源码注释,点击超链接可以直接跳转到谷歌关于go的源码界面(可能响应速度很慢)
#青训营 x 字节后端训练营#
select+channel的多路复用,能实现完美的并发吗?
在go中引入了select语句来管理管道IO事件和实现协程通信,由于select语句在多case可执行的情况下只会挑选一个case分之执行,实现一个阻塞协程管理多个IO事件,节省了资源。但是select并不能实现完美的并发,比如我正在实现一个web-server,a协程中使用管道将缓冲区可读状态的connection传递给另一个协程b,协程b中采用select语句监听管道,当管道中有数据可读即触发case下的操作,在此我们在case实现一个阻塞操作,比如读取一个大文件等等,在case阻塞过程中,a协程还在不停的向管道发送资源,这样一批资源会在管道中堆积,由于堆积的是connection,那么被堆积的链接的客户端会感受到接口调用缓慢,非常影响体验。
#青训营 x 字节后端训练营#
go语言循环依赖?
从Java转go有着自己的一套包命名规则,在开发一些复杂业务系统包过多时,极其容易引起循环依赖。循环依赖指两个包之间互相引用,导致编译器无法确定先编译哪个?解决循环依赖的方法有如下
1.所有文件共用一个包(不推荐)
2.采用严格的分层, 类似Java三层分层(最推荐)
3.排查依赖项,使用单独文件对公共部分进行进一步抽象。如A->B,B-A变更后,A->C,B->C。(推荐)
下一页