Golang
文章平均质量分 96
_ Echo_
一个gopher,一个游戏服务器开发的gopher
展开
-
泛型系列:关于Golang泛型的实现方案以及个人理解(1)
今天看到了Go Team 关于泛型设计的一个提案(后称 提案)的设计文档(Type Parameters Proposal),目前看只有英文版,所以用自己不怎么样的英语加上翻译软件并结合一些自己的粗浅的理解,发布本系列文章与诸君共勉,因为时间关系与该文档内容过于丰富,所以拆分成一个系列来进行发布翻译 2022-09-22 10:23:16 · 975 阅读 · 0 评论 -
「协议」Kcp协议介绍、Demo讲解与工作过程浅谈
Tcp和Udp传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,其拥有着相对而言的可靠传输(相对UDP),由于Tcp的相关特性如在连接之前先创建两端的虚拟连接,以及发送数据的超时重传、滑动窗口、流量/拥塞控制等特性保证了其可靠的传输,因而TCP通常会保证数据准确交付。但由于其在穿输数据之前需要进行虚拟连接的建立,这回消耗一定的传输时间,且在传输过程之中为保证数据正确交付而采用的超时重传、滑动窗口、流量/拥塞原创 2021-04-13 15:13:48 · 4966 阅读 · 0 评论 -
「Golang」for range 使用方法及避坑指南
前言循环控制结构是一种在各种编程语言中常用的程序控制结构,其与顺序控制结构、选择控制结构组成了程序的控制结构,程序控制结构是指以某种顺序执行的一系列动作,用于解决某个问题。理论和实践证明,无论多复杂的算法均可通过顺序、选择、循环3种基本控制结构构造出来。在Go中,提供了两种循环控制结构for和goto,但是后者不推荐使用(原因请查看艾兹格·迪杰斯特拉(Edsger Wybe Dijkstra)在1968年的一篇名称为《GOTO语句有害论》的论文),但是就作者而言goto在某些业务情况下,是很好用的,所以原创 2021-03-02 22:14:49 · 9440 阅读 · 0 评论 -
「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 · 960 阅读 · 0 评论 -
「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 · 1597 阅读 · 0 评论 -
「Golang」sync.Pool的源码解析
前言在平时我们的业务逻辑中,会出现多次,重复的申请在堆上创建的对象用作他用,当并发量不大的时候,可能往往并不会产生一些什么问题,当时一旦当并发量增长的时候就会发现因为重复在堆上创建对象导致了GC的扫描时间与STW(stop-the-world)很长,导致程序性能的降低,因为大量地创建在堆上的对象,也会影响垃圾回收标记的时间,因此来说频繁的在堆上申请对象说对高并发量的程序性能会产生很大的影响。此时我们可以采用对象池的方式,去针对某些频繁的且大量重复申请的对象预先的创建或者将用完的对象放回对象池中,以便下回原创 2021-01-03 16:16:51 · 258 阅读 · 0 评论 -
「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 · 3749 阅读 · 0 评论 -
「Golang」不谈底层源码只谈使用,万字长文话说Golang的数组与切片
作者注:本篇所有代码采用go1.15+版本编写。一、前言之前一直在写一些同步原语和其他一些东西的的源代码分析,感觉写起来很麻烦,今天开始我决定写几期关于go中常用数据结构的解析、用法以及相关的可能会踩到的坑,正好也当作自己的知识体系巩固,今天开始第一个数据结构的解析—数组与切片。二、数组1、什么是数组数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数.原创 2020-12-23 23:14:56 · 526 阅读 · 0 评论 -
「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 · 275 阅读 · 0 评论 -
「Golang」sync.Once用法以及源码讲解
前言在我们开发过程中经常会使用到单例模式这一经典的设计模式,单例模式可以帮助开发者针对某个(些)变量或者对象或者函数(方法)进行在程序运行期间只有一次的初始化或者函数调用操作,比如在开发项目中针对某一类连接池的初始化(如数据库连接池等)。针对这种情况,我们就需要使用单例模式进行操作。单例模式????自己搞得单例模式要实现一个单例模式,我们会很快就想到了在一个结构体中放置一个flag字段用于标记当前的函数是否被执行过,举个????:type SingletonPattern struct {原创 2020-12-20 17:18:09 · 551 阅读 · 2 评论 -
「Reprint」关于Golang内联优化的一些策略和限制
[译] Go语言inline内联的策略与限制转载 2020-12-20 16:00:16 · 517 阅读 · 0 评论 -
「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 · 769 阅读 · 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 · 322 阅读 · 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 · 399 阅读 · 0 评论 -
「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 · 380 阅读 · 2 评论 -
「Golang」关于通道的一些总结
通道分为有缓冲与无缓冲,创建方式分别为make(chan type)或make(chan type ,0) 与make(chan type ,len)。无缓冲通道在没有接收端或没有发送端的时候将会阻塞。无缓冲通道可以完成两个go程的同步消息处理操作,并且无缓冲通道的接收数据会发生在唤醒放者之前。 如下图(画的不好见谅):如果有缓冲通道在发送时发现队列已满,则发送方将等待直至接收方取出数据,如果队列为空则接收方同样等待发送方放入数据。for range 可以在一个未关闭的同道中循环接收数据,与f.原创 2020-11-27 19:43:26 · 270 阅读 · 0 评论 -
「Golang」关于通过proto消息名,创建proto.Message对象
关于通过proto消息名,创建proto.Message对象 前几天在做一些proto相关业务逻辑编写,在编写过程中,需要通过proto的message full name 去动态的创建一个proto.Message对象,在网上找一些相关的内容也没找到,所以就自己研究了一下并且实现了这个功能原创 2020-11-25 19:43:33 · 4573 阅读 · 6 评论