go
sydnash
这个作者很懒,什么都没留下…
展开
-
go实现一个简单的游戏服务器框架(lotou)网络通信
代码仓库,目前代码比较粗糙,欢迎各种改进建议。 网络通信相关代码请查下以下链接(https://github.com/sydnash/lotou/tree/master/network/tcp)目前网络通信只实现了基于go的tcp的通信。go的tcp相关的主要接口net.JoinHostPort 将一个host和port组成一个合法的网络地址(host:port)net.ResolveTCP原创 2016-12-09 10:37:44 · 4497 阅读 · 0 评论 -
go语言实现IOS OTA安装应用
现在的IOS OTA安装应用需要使用https才能安装。 要使得服务器支持https,服务器必须要有https证书。证书可以同过购买获得或者自己生成。 这里我们使用自己生成的证书,使用自己生成的证书必须在iphone上手动安装之后才能访问https服务器,否则iphone会拒绝访问未受信任的https服务器。使用openssl创建https证书生成服务器的私钥 mkdir /private/原创 2017-01-23 10:42:40 · 997 阅读 · 0 评论 -
go 语言中的继承
go 语言中可以通过匿名field来实现继承的效果,type T1 struct { A int}func (t T1) Log() {}func (t *T1) Print() {}type T2 struct { T1}t2 T2{}继承效果可以通过t2.Log()直接访问T1的method,就像面向对象的继承之后一样访问,不过这里要注意的传递到Log的是T1而不是T2匿原创 2017-03-09 15:15:26 · 1311 阅读 · 0 评论 -
go 实现一个简单的UUID生成器
查看源代码实现方法:UUID 通过三部分组成 curtime << 22 | generaterid << 12 | sequenceid具体原理如下:首先每一个UUID生成器有一个id在生成UUID的时候先取当前时间距离1970的秒数作为高位,generaterid作为中间如果本次生成的时间和上一次的时间相同,则sequenceid +1,否则sequenceid位0然后把sequenceid作为原创 2017-03-09 18:24:06 · 2753 阅读 · 0 评论 -
go 自己实现一个gob编解码
代码库为什么要写这么一个编解码golang内部也实现了一个gob的二进制编解码,接口简单,使用方便,但是它对interface的支持不是很好, 比如如下代码:var in []interface{} = []interface{}{1, 1.5, "abc", "123", map[int]int{1: 1, 2: 2, 3: 3}}enc.Encode(in)var out []interf原创 2017-03-10 16:56:20 · 2444 阅读 · 0 评论 -
7个go的基本注意事项
传递参数的时候不传递interface而传递具体类型不适用io.Writer & io.Reader, 而使用具体类型(和第一点有点重复了)传递一个很大的interface,应该传递只需要用到的interface什么时候用函数什么时候用方法:当需要状态或者修改状态的时候使用方法,如果只是逻辑,则使用函数。pointer receiver还是value receiver。指针receiver可原创 2017-03-12 10:06:45 · 677 阅读 · 0 评论 -
lotou详解二:service注册和单节点消息发送
代码地址lotou中通过core/handler.go来管理单机节点中注册的service注册和移除注册registerService为一个service分配一个唯一的serviceId serviceId由16的节点id和46位的本机唯一的id组成。unregisterService移除一个service,同时将serviceId写会cache。这里为了避免服务器长时间运行,频繁增删servic原创 2017-03-30 22:55:36 · 834 阅读 · 0 评论 -
lotou详解一:基本概念
lotou是一个基于golang的支持分布式的轻量级游戏服务器框架,主要提供游戏服务器集群的消息转发代码仓库 lotou提供了三种不同的消息发送方式: 1.Send 用于普通的消息推送,不需要返回,发送之后就不再关注 2.Request 异步非阻塞请求响应模式,request接收一个回调函数和一个超时时间,当远程服务通过respond响应或者远程服务响应超时的时候,回调函数会被唤醒。 3.原创 2017-03-25 23:20:23 · 2759 阅读 · 0 评论 -
golang 启动流程
找到启动函数在linux使用objdump反汇编可以看到golang编译的exe的启动代码首先使用objdump -f exe 可以看到start address 0x0808c760然后使用objdump -d exe > t.asm打开t.asm文件查找上面的start address 可以看到入口函数是_rt0_386_linux入口函数分析接下来就是找到这个入口函数了,这里因为我现在使用原创 2017-04-20 15:57:52 · 4500 阅读 · 2 评论 -
golang 栈的扩大和收缩
栈扩大stack.go中的常量,用于检查goroutinue的状态 uintptrMask = 1<<(8*sys.PtrSize) - 1 // Goroutine preemption request. // Stored into g->stackguard0 to cause split stack check failure. // Must be greater原创 2017-04-20 16:00:04 · 5267 阅读 · 0 评论 -
go 用slice模拟vector功能
appendVectora = append(a, b...)copyb = append([]T(nil), a...)b = make([]T, len(a))copy(b, a)cut删除一段范围i~jcopy(a[i:], a[j:])for k, n := len(a) - j + i, len(a); k < n; k++ { a[k] = nil //or the zero翻译 2017-02-10 11:43:46 · 3042 阅读 · 0 评论 -
go 判断一个文件是否存在
通过下面的代码可以判断一个指定的路径在系统是否存在。if _, err := os.Stat(path); err != nil { if os.IsNotExist(err) { // file does not exist } else { // other error }}原创 2017-01-04 09:10:08 · 14945 阅读 · 0 评论 -
正则表达式*和?的一个错误认识
这两天再看go的正则表达式的时候,看到关于unicode匹配的方式\p{Name}不是很明白,所以就想写程序来尝试一下,因此而引出博文标题提到的一个误区。 首先还是先解释下\p{name}到底是什么意思。 这里的{name}指的是unicode的类型对象名称,具体可在RE2 syntax中查看。其中{Han}可以用来匹配中文字符,因此下了下面的程序来验证。package mainimport原创 2016-12-07 09:34:30 · 481 阅读 · 0 评论 -
go实现一个简单的游戏服务器框架(lotou)编码
代码仓库在lotou中实现了两种二进制编码方式。binary一种是普通的C/C++模式的小端编码方式,每一个数据都被依次编码进一个二进制流中,基本用法如下:编码 binary.Encode(v) binary.Encode(v)解码 binary.Decode(&v) binary.Decode(&v)使用非常简单,编码方式也很简单。还有一种是为了用于lotou内部通信(后面即将实现的原创 2016-12-12 14:53:41 · 1270 阅读 · 0 评论 -
go语言的type的比较和赋值
type的比较两个类型要么相同要么不相同。如果两个命名类型起源于同样的声明;一个命名类型和不具名类型永远不相同;两个不具名类型相同如果他们拥有同样的字面结构且对应成员有相同的类型。具体的规则如下:两个array type相同如果他们拥有相同的element type和同样的数组长度两个slice type相同如果他们拥有相同的element type两个struct type相同如果他们翻译 2016-12-05 22:57:08 · 3170 阅读 · 0 评论 -
GO声明和作用域
作用域go语言一共有如下几个作用域:全局作用域:所有的关键字和内置类型、函数都拥有全局作用域package作用域:一个包中声明的变量、常量、函数、类型等都拥有包作用域,在同一个包中可以任意访问文件作用域:一个文件中通过import导入的包名,只在当前文件有效函数作用域以及for、if、{}自定义作用域,函数的参数、reciever、返回值都拥有函数作用域,for、if、{}内部的变量只拥有最原创 2016-12-06 10:49:37 · 2702 阅读 · 0 评论 -
go语言基本数据类型
初识GO语言go是一门新语言,他在语言级提供了并发的支持(goroutine)和通信工具channel,同时它也是一门编译型、强类型的语言,拥有内存GC机制。程序的模块通过package来组织。GO基础整数十进制整数,使用0-9的数字表示且不以0开头。八进制整数,以0开头,0-7的数字表示十六进制整数,以0X或者是0x开头,0-9|A-F|a-f组成100 1234550100 0600原创 2016-12-05 15:50:48 · 3695 阅读 · 4 评论 -
go控制流和一些特殊语句
send和receive语句send、receive操作是针对channel的 send : ch <- a receive: a := <- ch++和--语句在go中++和--是一个赋值语句,而不是一个表达式因此不能像C/C++那样编写如下代码: a = b++ 同时在go中只有后置,没有前置写法。a++a--if语句ifif是编程语言中最简单的条件分支判断语句,几乎所有语言都有,所原创 2016-12-06 14:40:44 · 586 阅读 · 0 评论 -
go 内置函数
go 的内置函数不拥有前面提到的go的标准类型,因此内置函数不能作为一个函数值赋值给函数类型的变量。closeclose用于关闭一个channel,使用close函数要注意以下几点:关闭一个只接受的channel会导致错误在一个已经关闭的channel上发送数据会导致panic关闭一个nil channel会导致panic在一个channel关闭之后,如果channel已经没有剩余数据等待接原创 2016-12-08 13:54:45 · 2539 阅读 · 0 评论 -
go实现一个简单的游戏服务器框架(lotou)起源
最近一直想学习一些关于游戏服务器的知识,显示看了一下云风的skynet框架,从而对于一个游戏服务器框架有了一个基本概要了解。先来说说我对于skynet的一些理解吧。skynet理解skynet只完成了服务器最核心的一部分功能,必须消息分发,必须服务的创建、销毁以及服务间的通信。 skynet中最核心的两个部分,网络和消息分发。消息分发skynet中有一个消息队列的队列,这个队列保存了每一个服务的消原创 2016-12-08 15:30:30 · 7093 阅读 · 0 评论 -
go实现一个简单的游戏服务器框架(lotou)基本设计
代码仓库,目前代码比较粗糙,欢迎各种改进建议。 以为go语言原生支持高并发(goroutine)和通信机制(channel),所以首先想到的就是使用这两个东西来构建我的消息分发机制。 核心思路:有一个core模块维护了所有的服务当有消息发送的时候,通过该core模块将消息发送到对应服务器的接收channel中服务中开一个goroutine来从channel取出消息并处理主要函数: co原创 2016-12-08 16:08:01 · 4419 阅读 · 0 评论 -
go实现一个简单的游戏服务器框架(lotou)多节点
代码仓库在这个什么都流行分布式、大并发的时代,不支持点多节点也太说不过去了。 lotou的多节功能主要是建立在network和core模块之上的。 主要分为slave和master。在lotou的多节点中,有一个master和多个slave组成。因为lotou里面主要是针对服务进行通信,所以只要master和slave的主要功能就是对服务间 的消息进行转发。 基于多节点网络,lotou还实现原创 2016-12-22 14:30:00 · 1492 阅读 · 0 评论 -
golang 调度之wakep和M创建
说说wakep和m的创建吧wakep调用时机和作用作用:wakep的作用是添加一个P来执行goroutinue时机:在有G变为runnable的时候 如:newproc ready wakep中调用startm来启动一个新的mstartm首先如果传递过来P是nil,则需要获取一个idle P,如果获取不到,直接返回调用mget获得一个已经睡眠m如果没有获得m,则调用newm创建一个新的原创 2019-04-30 08:38:41 · 2724 阅读 · 0 评论