- 博客(26)
- 收藏
- 关注
原创 用go语言重写模型加载库assimp
三种格式的文件读取。后续会陆陆续续写完40种格式,但是工作量比较大,有兴趣提升go语言的朋友可以参与到项目来,在评论区留言,欢迎大家提供宝贵建议。增加了将最后导出的场景结构体序列化和反序列成proto的方式,方便大家在其他语言轻松使用解析后的场景结构体。由于工作量巨大,代码质量只保证了稳定,很多逻辑其实都是冗余的,并没有优化,暂且这样吧,让我重写完。再说,另外自己的核心精力还在其他开源项目上,后面抽空更.....
2024-02-19 09:11:39
285
2
原创 用go语言重写c++ kcp
用按大小区分的buffer 对象池代替一个sync.pool ,当查找和放回大小不一致的buffer,很容易造成内存泄漏。如果要实现一个生产环境用的网络框架,那么我们必须做成类似官方net.conn的形式。欢迎大家提出宝贵的建议,原理及思路后面补齐。kcp核心模块只实现了kcp 算法的逻辑。
2024-02-19 09:10:51
374
原创 用go 语言轻松实现红黑树及二叉树树状打印
你可以用任何语言轻松实现树状打印。方法为自己研究,之前找了很久网上的文章,想打印一颗二叉树,观察代码是否正确,找了很久都没找到,最后还是自己去研究,最后研究出来这个方法,纯套公式,可以控制打印结果,兼容汉字。有问题的朋友评论区留言,抽空解答。关于红黑树的研究,网上有很多最全教程都有问题,结果就是困扰自己很久,后面通过断点调试,慢慢还原了整个场景,总结出了整套方法。我相信最难的可能不只是如何轻松实现红黑树,还有如何实现上面树状打印结果,后面会出一篇文章专门讲解。
2024-02-19 09:09:52
327
原创 用go 实现最全的游戏寻路算法库
jump point>a star >Dijkstra>bfs>dfs,这里没有讨论双向和走不走对角的情况,因为性能肯定大于单向和不走对角。其中dfs 性能非常差,跑同样的地图,其他基本上都是0ms,而dfs 会花上几秒。dijkstra,a star,双向a star ,bfs(宽度优先搜索),dfs(深度优先搜索),jump point。目前只实现了字符串的图来测试,图形化demo 打算用fyne 实现,等我写完更新。
2024-02-19 09:07:17
690
原创 装逼小技巧-如何用go switch 装个逼
日常用go switch写项目package mainfunc main() { var a =1 switch a { case 1: case 2: case 3: case 4: default: //do xx }}假设有人突然看到这样写,心里独白可能是这样package mainfunc main() { var a =1 switch a { default: //d
2021-12-10 09:44:09
287
原创 深入解析protobuf 2-自定义protoc 插件
1介绍对于程序员来说,protobuf 可能是绕不去的坎,无论是游戏行业、教育行业,还是其他行业,只要涉及到微服务、rpc 都会用这个进行跨进程通信,但是大多数人在项目开发中其实都只会使用到基础消息结构,并不需要自定义开发。掌握更多高级技巧显然对装逼是很有大帮助的,而且大家都在卷,不了解的更深,怎么卷的过大家。长江后浪卷前浪,前浪死在沙滩上读完本文收获:学习protoc 自定义插件开发流程 比花卷更卷另外说明下HTTP/2 的内容正在创作中,完成了大部分了。没有每周一更不是代表我跑路了,
2021-12-10 09:42:55
3653
原创 深入解析grpc源码2-客户端与服务器通信流程
前面已经讲了grpc 基础使用、protobuf 使用及原理,今天开始逐步探究grpc-go 源码实现,grpc 底层通信协议是对http2 协议的封装,grpc 并没有使用golang 官方实现的http2,而是自己实现了http2,引用了官方的帧解析器和其他枚举值,http2在其他语言实现大同小异。一般rpc 协议会包含请求方法,请求参数,请求参数在grpc被称为消息,内容是protobuf二进制内容,方法会携带在http2 的header 里面,最后服务器解包,获取方法路由到相应的handler.
2021-12-10 09:41:13
1969
原创 深入解析protobuf 1-proto3 使用及编解码原理介绍
前面已经讲了grpc基础使用,其中用到了Protocol buffers,这次先讲下Protocol Buffers的基本使用,和编解码原理。后面会有高级教程讲如何二次开发proto-gen-go ,protobuf 官方功能并不是很完善的,在日常项目中,常常有自定义需求,更多的是使用官方protoc-gen-go 这个项目fork 后自定义版本,或者是比较优秀的开源 fork 版本。目前使用最多的是gogo protobuf,后面都会出详细教程。本文章内容几乎翻译整理自官方文档,额外添加了go相关的例子,
2021-12-10 09:36:27
5239
原创 深入解析go 位运算和位掩码原理及应用
作为一个非科班的自学出生的野生程序员来说,刚接触位运算确实挺懵逼的,但是熟悉了以后也没有那么神秘,在平时看一些优秀的开源项目时或者自定义网络协议封装时,经常用到,最近看到一篇不错的老外讲位运算的文章。所以翻译一下。随便用自己在项目中的实际应用做下拓展。原文:Using Bitmasks In Go注意:本人翻译水平有限,有错误欢迎指正当我们写一个多人玩的在线服务器类似角色游戏MMORPG,在游戏中玩家会收集大量的keys,如何去设计为每一个玩家存储这些keys 呢?例如,想象这些keys 是
2021-12-10 09:34:38
698
原创 深入解析grpc源码1-grpc介绍及使用
1grpc 介绍在grpc 官网上,grpc 是这样介绍的:开源高性能远程调用(RPC)框架,可以在任何环境中运行。它支持可插拔的负载均衡、链路跟踪、健康检查和身份验证等等商业和安全功能grpc 是一项进程间通信技术,可以用来连接、调用、操作和调试构建分布式程序,调用过程如同调用函数一样,整个过程操作起来很简单,就像调用本地方法一样。与许多rpc 系统一样,grpc 是定义服务的思想,服务器需要实现此接口并运行grpc 来处理客户端调用。gRPC客户端和服务器可以在各种环境中运行并相互通
2021-12-10 09:32:38
2506
原创 深入解析actor 模型(二): actor 在go 实践proto.Actor 源码解析
1proto-actor 源码解析下面我们从actor 系统设计各个模块设计剖析源码,从官方文档结构,结合文档和自己的理解,然后再配合源码,剖析actor设计。1.1actor核心actor 特点从 function 或者method创建 从对象工厂 生成actor通过自动,指定,或者前缀名1.1.1Props(创建actor 的配置)配置和构造actor 的上下文context自定义属性一种是从函数创建,actor 必须实现Receive(c Context)方法,这是a
2021-11-07 14:33:18
2321
原创 深入解析actor 模型(一): actor 介绍及在游戏行业应用
1 介绍1.1 什么是actor对于刚接触actor的我,第一感觉就像redis一样,每个actor就是一个redis 实例,都有自己消息队列,actor相互通信通过将消息发给对方,消息发送进对方的消息队列,等待对方线程处理。来看看我们之前做项目的痛点。游戏服务器通常分为多个服,每个服上有多个玩家。假设玩家与玩家数据交互操作,这时怎么避免数据竞争?两种解决方案:1、将数据写入redis首先redis效率高,也是单线程模型,不存在数据竞争,但是也有它的不足之处,操作redis 会受网络影响
2021-11-07 14:32:06
15563
原创 深入解析go Timer 和Ticker实现原理
1 timertimer 简单来说就是1 个定时器,代表多少秒后执行,当创建1个timer,1秒钟过后,我们就能从timer.C 获取那个时刻的时间,因为系统在那个时刻将当前时间写入到timer.C 了,这时候我们就可以做自己的想做的事了。package mainimport ( "fmt" "time")func main() { timer:=time.NewTimer(1*time.Second) defer timer.Stop()
2021-11-07 14:29:29
1431
原创 深入解析go依赖注入库go.uber.org/fx
后面更新采用肝一篇go官方源码,肝一篇框架源码形式,伤肝->护肝,如果你喜欢就点个赞吧。官方源码比较伤肝(* ̄︶ ̄)。1依赖注入初识依赖注入来自开源项目Grafana 的源码,该项目框架采用依赖注入方式对各结构体字段进行赋值。DI 依赖注入包为https://github.com/facebookarchive/inject,后面我会专门介绍这个包依赖注入的原理。不过今天的主角是它:https://github.com/uber-go/fx。该包统一采用构造函数Newxx()形式进行依赖注
2021-10-24 19:29:09
7086
原创 如何解决 mac M1 debug 错误Debugging programs ... not support
1介绍最近因为工作需要,mac 电脑换成了最新的 m1 芯片MacBook Pro,相比于之前的intel 我认为有比较好的两点:性能有很大提升,之前跑goland + docker ,就很卡,风扇一直响的很厉害,现在换成M1就很流畅界面风格更美了,虽然刚用两个月mac,开始一直觉得Windows好,尤其在拿到第一个Mac ,卡的要死,更觉得我4年前买的Windows好了(* ̄︶ ̄)。但是在换成M1 后感觉还不错。不过在重新装好go + goland 开发环境后,Debug ,遇到了下面
2021-10-24 19:26:20
6441
4
原创 深入解析go context 源码
1介绍及使用场景相信大家都经历过面试官的灵魂拷问:context 的作用是啥??父context取消后,子context会立即取消吗?今天让我们深入了解context,然后继续被面试官虐(* ̄︶ ̄)context 是Go 1.7 引入标准库,被称作上下文,通常在goroutine间传递上下文,作用包括取消信号、超时控制、k-v 传递。k-v 传递通常用来做分布式链路追踪,上下文传值。在一些需要超时控制的场景我们经常会看到它的身影,比如sql 里面,像ping 这样的场景,ping 什
2021-10-24 19:24:03
504
1
原创 一文读懂 go 互斥锁 mutex 源码
1介绍互斥锁是并发控制的一个基本手段,是为了避免竞争而建立的一种并发控制机制。简单来说就是控制并发比如下面能得到我们想要的结果吗?func main() { sum :=0 var w sync.WaitGroup for i:=0;i<1000;i++{ w.Add(1) go func() { defer w.Done() sum+=1 }() } ..
2021-09-25 22:04:17
598
原创 深入解析go 缓存击穿方案-singleflight
1.问题描述:某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。曾经有面试官问我这个问题,我将解决方法说了,然后提到singleflight ,问我源码,一时语塞(▼皿▼#),只能说曾经看过,所以写下这篇文章,记录一下。2.解决方法 给key设置随机过期时间 让多个请求请求数据库只有一个连接成功(singleflight 实现思路) 3.singlefli
2021-09-21 15:02:31
511
原创 go 面试题-如何获取系统是大端模式还是小端模式
详情见文章:详解大端模式和小端模式总结来说: 就是地址位在计算机存储的位置不同,例如0x12 34 56 78在不同模式存储方式不同 大端模式(一般用于在通信协议中比较常见) 0x12 0x34 0x56 0x78 小端模式 (大部分操作系统本地存储方式) 0x78 0x56 0x34 0x12 2.go语言常见字节序处理函数导入包"encoding/binary"以常见tcp 网络处理为例子使用package m...
2021-09-21 14:51:10
454
原创 深入解析go web框架macaron三-grafana的应用
Grafana 是开源的数据可视化面板,和Protometheus是绝配,常用来做系统监控,将采集的数据进行可视化,里面有很多可视化面板模板,开箱即用。该项目是前后端不分离项目,会采用部分模板渲染,后端采用go,前端采用typescript,如果是新手,可以多看看源码学学做项目的思想。Grafana 官网地址:Grafana: The open observability platform | Grafana LabsGrafana github地址: GitHub - grafana/graf
2021-09-21 14:48:49
1354
原创 深入解析go web框架macaron 二 中间件
文章接上回,来看看框架是怎么执行handler 以及一些其他中间件的中间件格式func(resp http.ResponseWriter, req *http.Request)func(ctx *macaron.Context) func(resp http.ResponseWriter, req *http.Request,ctx *macaron.Context)是不是比其他web框架灵活多了(* ̄︶ ̄)还可以自定义格式比如先调用c.Map(value),那么中间件就支..
2021-09-21 14:18:55
586
原创 深入解析 gopkg.in/tomb
介绍 都是进行goroutine 生命周期管理的 和errgroup 很相似 和oklog 相似 使用demo v1官方没有比较好用的例子,所以这里用一个网上的例子来说明,当然这里是v1版本package mainimport ( "gopkg.in/tomb.v1" "log" "sync" "time")type foo struct { tomb tomb.Tomb wg sync.WaitG.
2021-09-21 14:10:47
471
原创 深入解析go web框架marcron 一 路由
介绍祝大家中秋假日快乐!(~ ̄▽ ̄)~, 连续肝了三篇文章剖析了我经常使用的macaron框架,希望大家在选择web框架有一种更好的选择。顺便说一下,好多面试官都不了解这个框架(づ ̄3 ̄)づ╭❤~github地址:GitHub - go-macaron/macaron: Package macaron is a high productive and modular web framework in Go.官方文档地址:Welcome - Macaron Documentation下面是
2021-09-21 14:04:30
871
原创 深入解析 go sync.map 源码
在实际开发项目中,常常有并发操作map 的情况,但是go官方map 并不支持并发读写,这时候可能需要用到sync.map 了。在项目中其实sync.map 更适用于少写的情况,比如服务器启动注册某些东西到map里面,后面服务器启动后几乎是只读了。自己面试亲身经历:面试官:在实际生产中,可能会有并发写map 的情况,balabala.....我:sync.map 可以解决这些事情面试官:它的应用场景?我:读多写少,源码,官方,性能测试都证明了面试官:使用sync.map有没有遇到过问.
2021-09-21 13:46:08
320
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人