- 博客(23)
- 收藏
- 关注

原创 「宣传」Go语言学习网站Go语言之路--星球板块上线啦
你还在为如何学习Go语言而发愁吗?你还在为学习完Go的基本语法之后不知道干什么而纠结吗?快来Go语言之路网站吧!
2021-04-10 13:39:14
1362
2
翻译 泛型系列:关于Golang泛型的实现方案以及个人理解(1)
今天看到了Go Team 关于泛型设计的一个提案(后称 提案)的设计文档(Type Parameters Proposal),目前看只有英文版,所以用自己不怎么样的英语加上翻译软件并结合一些自己的粗浅的理解,发布本系列文章与诸君共勉,因为时间关系与该文档内容过于丰富,所以拆分成一个系列来进行发布
2022-09-22 10:23:16
1022
原创 「协议」Kcp协议介绍、Demo讲解与工作过程浅谈
Tcp和Udp传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,其拥有着相对而言的可靠传输(相对UDP),由于Tcp的相关特性如在连接之前先创建两端的虚拟连接,以及发送数据的超时重传、滑动窗口、流量/拥塞控制等特性保证了其可靠的传输,因而TCP通常会保证数据准确交付。但由于其在穿输数据之前需要进行虚拟连接的建立,这回消耗一定的传输时间,且在传输过程之中为保证数据正确交付而采用的超时重传、滑动窗口、流量/拥塞
2021-04-13 15:13:48
5361
原创 「游戏」寻路算法之JPS原理和实现
前言之前的文章讲解了关于寻路算法中常见的算法以及AStar寻路算法的原理以及其实现方式,但是对于AStar寻路算法来说,其也有一定的缺点。A Star算法的问题在于其在进行节点搜索的时候,会把周围8个方向所有的可用邻居节点全部存储于,这样openlist中点的数量会很多,搜索效率较慢,并且占用内存也会很高。如图所示,在无遮挡情况下,可能这种情况会有很多条路径, 对于我们来说只需要一条从起点到终点的路径就够了,下图中绿色为放入OpenList中的节点,由图中看出往往这些节点并没有必要放进去,如果我们把
2021-03-25 19:51:46
3469
5
原创 「游戏」寻路算法之A Star算法原理及实现
前言自动寻路是在一些如MMORPG等类型游戏中常见的一种功能,其给了玩家良好的游戏体验,使得玩家在游戏过程中省去了大量游戏坐标点的记录以及长时间的键盘操作,不必记忆坐标,不必担心迷路,用最快捷的方法移动到指定地点。寻路算法(自动寻路算法,下同),其实可以看作是一种路径查找算法以及图搜索算法,图搜索(Graph Search)算法是用于在图上进行一般性发现或显式地搜索的算法。这些算法在图上找到出路径,但没有期望这些路径是在计算意义上是最优的。路径查找算法(Pathfinding)是建立在图搜索算法的基础
2021-03-19 20:06:16
4450
原创 「游戏」游戏服务器中AOI的原理及四叉树实现
前言要不是想起来这篇文章想写一个关于游戏服务器开发过程中关于AOI相关的文章,我都差不点忘了我是一个游戏服务器开发人员????。之前一直写的都是关于Golang相关的源代码解析内容,今天也说一说关于游戏服务器开发中常用到的一些算法,以及相关的一些原理、实现等等。因为我是个应届生,也处于学习阶段,对这个东西的理解不够深,如果有问题,请各位看官给予指正。在此表示感谢。什么是AOIAOI(Area Of Interest)翻译过来就是“感兴趣的区域”,这个玩意儿在很多的游戏中都会出现,比如在MMORPG
2021-03-10 19:02:48
7242
2
原创 「Golang」for range 使用方法及避坑指南
前言循环控制结构是一种在各种编程语言中常用的程序控制结构,其与顺序控制结构、选择控制结构组成了程序的控制结构,程序控制结构是指以某种顺序执行的一系列动作,用于解决某个问题。理论和实践证明,无论多复杂的算法均可通过顺序、选择、循环3种基本控制结构构造出来。在Go中,提供了两种循环控制结构for和goto,但是后者不推荐使用(原因请查看艾兹格·迪杰斯特拉(Edsger Wybe Dijkstra)在1968年的一篇名称为《GOTO语句有害论》的论文),但是就作者而言goto在某些业务情况下,是很好用的,所以
2021-03-02 22:14:49
10039
原创 「Golang」 Map源码解析
文章目录Map哈希表设计及哈希碰撞解决方式哈希函数哈希碰撞开放地址法链表法Go中的Map概述数据结构构建Map构建方式1--小型Map堆分配构建方式2--小型Map栈分配常规构建方式--Make的len>8或Key-Value个数>8总结Map的读写Map的写入/删除Map的写入解析Map写入操作过程的总结Map的扩容Map扩容过程的总结Map的删除解析Map删除过程的总结Map的读取Map读取的总结总结MapMap通常称哈希表(Hash Table)、散列表等,是根据键(Key)而直接访问
2021-01-27 22:50:03
1003
原创 「Golang」Channel解析
Channel描述Channel(通道)是在golang并发编程中用的最多的一个数据结构(也可以说是基础类型),在go中,作者在并发编程的环境下对于数据之间的共享提出了一个建议,也是go的经典开发准则:Do not communicate by sharing memory; instead, share memory by communicating.不要通过共享内存来通信,而应该通过通信来共享内存在通信方面,Channel给我们提供了一个很好的在并发编程环境中进行多Goroutine之间的数
2021-01-20 13:58:44
1612
原创 「Golang」sync.Pool的源码解析
前言在平时我们的业务逻辑中,会出现多次,重复的申请在堆上创建的对象用作他用,当并发量不大的时候,可能往往并不会产生一些什么问题,当时一旦当并发量增长的时候就会发现因为重复在堆上创建对象导致了GC的扫描时间与STW(stop-the-world)很长,导致程序性能的降低,因为大量地创建在堆上的对象,也会影响垃圾回收标记的时间,因此来说频繁的在堆上申请对象说对高并发量的程序性能会产生很大的影响。此时我们可以采用对象池的方式,去针对某些频繁的且大量重复申请的对象预先的创建或者将用完的对象放回对象池中,以便下回
2021-01-03 16:16:51
282
原创 「Golang」并发场景下的Map使用方式及避坑指南
非线程安全的mapmap是一个在开发过程中常用的内建类型,也是各位很熟悉的一个数据结构,他可以很方便的让我们做一些关于针对某些key-value结构的CRUD操作,但是在官方设计中,内建类型的map并不是一个可以在并发场景下进行并发读写的线程安全类型,此时我们就需要考虑对其进行一些线程安全的改造,首先我们要了解一下为什么```map``是一个非线程安全的类型,首先看下列代码:func main() { m := make(map[string]int, 2) m["dd"] = 22 go fun
2020-12-28 22:25:37
4138
原创 「Golang」不谈底层源码只谈使用,万字长文话说Golang的数组与切片
作者注:本篇所有代码采用go1.15+版本编写。一、前言之前一直在写一些同步原语和其他一些东西的的源代码分析,感觉写起来很麻烦,今天开始我决定写几期关于go中常用数据结构的解析、用法以及相关的可能会踩到的坑,正好也当作自己的知识体系巩固,今天开始第一个数据结构的解析—数组与切片。二、数组1、什么是数组数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数.
2020-12-23 23:14:56
550
1
原创 「Golang」遇到的有趣的Go赋值问题并附带以下不负责任的解析
今天在做一道题的时候发现了这么一个有趣的题目:func main() { index := 1 a := []string{"f", "ff", "fff"} index, a[index-1] = 88888, "ffff" fmt.Println(a)}这个输出是什么呢?我第一眼看的时候感觉会输出panic,因为下标超界,但是运行之后发现没这么简单,运行结果如下运行之后我惊了,不知道为什么会这样,然后我就输出了汇编看了一下(去掉了一些多余的汇编代码,我们只看赋值那行的汇编)://把
2020-12-22 18:24:13
286
原创 「Golang」sync.Once用法以及源码讲解
前言在我们开发过程中经常会使用到单例模式这一经典的设计模式,单例模式可以帮助开发者针对某个(些)变量或者对象或者函数(方法)进行在程序运行期间只有一次的初始化或者函数调用操作,比如在开发项目中针对某一类连接池的初始化(如数据库连接池等)。针对这种情况,我们就需要使用单例模式进行操作。单例模式????自己搞得单例模式要实现一个单例模式,我们会很快就想到了在一个结构体中放置一个flag字段用于标记当前的函数是否被执行过,举个????:type SingletonPattern struct {
2020-12-20 17:18:09
588
2
原创 「Golang」Slice源码讲解
【Golang】Slice源代码解析前言 在golang中有很多的数据结构是很常用的数据结构,比如array,slice,map等,其中最为常用的就是array和slice还有map了,理论上来讲array和slice在数据结构上是一种结构,都是顺序表结构,但是由于array的固定长度特性,在有些时候对于需要动态的长度的使用情况很不友好,此时就需要利用slice进行对固定长度数组的代替什么是Slice官方解释如下: Slices wrap arrays to give a
2020-12-18 16:00:24
809
2
原创 「Golang」sync.WaitGroup源码讲解
sync.WaitGroup介绍当我们在开发过程中,经常需要在开启多个goroutine后,等待全部的goroutine执行完毕后才进行下一步的业务逻辑执行。此时我们可能会采用轮询的方式去定时侦测已经开启的多个goroutine的业务是否执行完毕,但是这样性能很低,并且持续占用cpu时间片很消耗cpu的资源,此时我们就该使用sync.WaitGroup来完成此次操作。举个????,下列代码是开了10个goroutine后等待其各睡眠5秒之后进行后续操作的sync.WaitGroup方法实现。func m
2020-12-13 15:06:37
369
1
原创 「Golang」sync.RWMutex源码讲解
什么是sync.RWMutex上次写过了sync.Mutex的源代码解析,这回写一下他的扩展版本,sync.RWMutex(下称读写锁)的源代码解析,首先看一下读写锁的作用,如下述:sync/rwmutex.go中// A RWMutex is a reader/writer mutual exclusion lock.// The lock can be held by an arbitrary number of readers or a single writer.白话来讲,读写锁就是一
2020-12-06 17:11:26
430
原创 「Golang」 sync.Mutex源码讲解
sync.Mutex概述 在进行源码解析之前,先看一下sync.Mutex是做什么的,首先看一下sync/mutex.go中的标注A Mutex is a mutual exclusion lock.The zero value for a Mutex is an unlocked mutex. A Mutex must not be copied after first use.译注:Mutex是互斥锁,Mutex的零值是解锁的Mutex。Mutex在第一次使用后不得复制。 从sync.
2020-11-29 16:52:12
404
2
原创 「Golang」关于通道的一些总结
通道分为有缓冲与无缓冲,创建方式分别为make(chan type)或make(chan type ,0) 与make(chan type ,len)。无缓冲通道在没有接收端或没有发送端的时候将会阻塞。无缓冲通道可以完成两个go程的同步消息处理操作,并且无缓冲通道的接收数据会发生在唤醒放者之前。 如下图(画的不好见谅):如果有缓冲通道在发送时发现队列已满,则发送方将等待直至接收方取出数据,如果队列为空则接收方同样等待发送方放入数据。for range 可以在一个未关闭的同道中循环接收数据,与f.
2020-11-27 19:43:26
281
原创 「Top」About Me
大家好,我是一个Gopher,一个就职于游戏公司的后台服务器的Gopher,日常使用语言也很幸运的是Golang,我是第一次写博客,可能会不太好,希望大家海涵,我的愿望是我的博客可以帮助到大家并且记录我的学习和工作踩坑的过程。如果有错误的地方希望大佬指正。...
2020-11-25 19:53:30
162
原创 「Golang」关于通过proto消息名,创建proto.Message对象
关于通过proto消息名,创建proto.Message对象 前几天在做一些proto相关业务逻辑编写,在编写过程中,需要通过proto的message full name 去动态的创建一个proto.Message对象,在网上找一些相关的内容也没找到,所以就自己研究了一下并且实现了这个功能
2020-11-25 19:43:33
4669
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人