自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

白日梦程序员的博客

普通程序员做着不平凡的梦

  • 博客(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语言重写c++ 游戏框架skynet 的时间轮

游戏中的定时器一般是两种。

2024-02-19 09:08:13 496

原创 用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 实现最全的寻路算法(带调试界面)

用go语言实现最全的寻路算法库

2024-02-19 09:06:05 333

原创 装逼小技巧-如何用go switch 装个逼

日常用go switch写项目package main​func main() { var a =1 switch a { case 1: case 2: case 3: case 4: default: //do xx }}假设有人突然看到这样写,心里独白可能是这样package main​func 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 main​import ( "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 main​import ( "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关注的人

提示
确定要删除当前文章?
取消 删除