- 博客(198)
- 资源 (187)
- 收藏
- 关注
原创 utils.go
package utilsimport (“net”“fmt”“errors”“encoding/binary”“encoding/json”)//这里将这些方法关联到结构体中type Transfer struct {//分析它应该有哪些字段Conn net.ConnBuf[8096]byte//这时传输时,使用缓冲}func (this *Transfer)read...
2019-11-19 21:17:02
392
原创 userProcess.go
package processimport (“encoding/json”“fmt”“net”//没有引入message包,和utils包与model包)type UserProcess struct {//字段Conn net.Conn//增加一个字段,表示该Conn是哪个用户的UserId int}//这里我们编写通知所有在线的用户的方法//userId要通知其他...
2019-11-19 21:15:50
278
原创 userMgr.go
package process2import “fmt”//因为UserMgr 实例在服务器端有且只有一个//因为在许多的地方,都会使用到,因此,我们将其定义为全局变量var(userMgr *UserMgr)type UserMgr struct {onlineUsers map[int]*UserProcess}//完成对userMgr初始化工作func init(){...
2019-11-19 21:11:47
477
原创 smsProcess.go
package process2import (“encoding/json”“fmt”“net”)type SmsProcess struct {//…[暂时不需字段]}//写方法转发消息func(this *SmsProcess)SendGroupMes(mes message.Message){//遍历服务器的onlineUsers map[int]*UserProce...
2019-11-19 21:10:27
184
原创 model------userDao
package modelimport (“encoding/json”“fmt”)//我们在服务器启动后,就初始化一个userDao实例,//把它做成全局的变量。在需要和redis操作时,就直接使用即可。var(myUserDao *UserDao)//定义一个UserDao结构体//完成对User 结构体的各种操作//编写对User对象(实例)操作的各种方法,主要就是增...
2019-11-19 21:08:47
260
原创 model------user.go
package modeltype User struct {//确定字段信息//为了序列化和反序列化成功,我们必须保证//用户信息的json字符串的key和结构体的字段对应的tag名字一致!!!UserId intjson:"userId"UserPwd stringjson:"userPwd"UserName stringjson:"userName"}...
2019-11-19 21:07:45
164
原创 model-----error
package modelimport “errors”//根据业务逻辑需要,自定义一些错误。var(ERROR_USER_NOTEXTSTS=errors.New(“用户不存在”)ERROR_USER_EXISTS=errors.New(“用户已经不存在”)ERROR_USER_PWD=errors.New(“密码不正确”))...
2019-11-19 21:06:32
6215
原创 redis.go
package mainimport “time”//定义一个全局的poolvar pool *redis.Poolfunc initPool(address string,maxIdle,maxActive int,idleTimeout time.Duration){pool=&redis.Pool{MaxIdle:maxIdle,//最大空闲连接数MaxActive:m...
2019-11-19 21:02:09
131
原创 processor.go
package mainimport (“net”“fmt”“io”)//先创建一个Processor的结构体type Processor struct {Conn net.Conn}//编写一个ServerProcessMes函数//功能:根据客户端发送消息种类不同,决定调用哪个函数来处理func (this *Processor) serverProcessMes(me...
2019-11-19 21:00:35
187
原创 main.go
package mainimport (“fmt”“net”“encoding/binary”“encoding/json”“errors”“io”“debug/dwarf”//没有引入message包“time”)//func readPkg(conn net.Conn) (mes message.Message, err error) {// buf := make([...
2019-11-19 20:57:46
379
原创 login.go
package mainimport (“net”“fmt”“encoding/json”“encoding/binary”)//写一个函数,完成登陆func login(userId int,userPwd string)(err error){//1.连接到服务器conn,err:=net.Dial(“tcp”,“localhost:8889”)if err !=nil{...
2019-11-19 20:51:33
839
原创 海量用户——服务器接收长度
package mainconst(LoginMesType =“LoginMes”LoginResMesType=“LoginResMes”RegisterMes =“RegisterMes”)type Message struct {Type string json:"type"//消息类型Data stringjson:"Data"//消息的类型}//定义两个消息…后...
2019-10-25 22:33:24
148
原创 海量用户登陆通讯系统——完成登陆
package mainimport “fmt”//写一个函数,完成登录func login(userId int,userPwd string)(err error){//下一个就要开始定协议…fmt.Println(“userId=%d userPwd=%s\n”,userId,userPwd)return nil}...
2019-10-19 23:05:43
193
原创 海量用户通讯系统——完成界面
package mainimport “fmt”//定义两个变量,一个表示用户id,一个表示用户密码var userId intvar userPwd stringfunc main(){/*经典项目-海量用户即时通讯系统项目开发前技术准备项目要保存用户信息和消息数据,因此我们需要学习数据库(redis或者Mysql),这里我们选择Redis,所以先给同学们讲解如何在Golang...
2019-10-19 22:48:14
222
原创 海量用户即时通讯系统需求
package main/*项目开发流程需求分析->设计阶段->编码实现->测试阶段->实施阶段需求分析1)用户注册2)用户登陆3)显示在线用户列表4)群聊(广播)5)点对点聊天6)离线留言界面设计经典项目-海量用户即时通讯系统实现功能-显示客户端登陆菜单————————————————————欢迎登陆多人聊天系统————————————————...
2019-10-19 22:45:32
397
原创 海量——Go操作Redis(hash)
package mainimport “fmt”func main() {/*操作Hash说明:通过Golang对Redis操作Hash数据类型_,err=c.Do("HSet","user01","name","汤姆")//这里需要根据name对应的旅行来使用redis.Xxx的方法//如果存放的时int则应当使用redis.Int(),看相关手续r,err:=redis.S...
2019-10-19 22:43:34
471
原创 海量用户——Redisdemo
package mainimport “fmt”//差一个redis库没有安装,没有redis包//Set/get接口//说明:通过Golang添加和获取key-value[比如name-tom~]func main() {//通过go向redis写入数据和读取数据//1.连接到redisconn, err := redis.Dial(“tcp”, “127.0.0.1:6379”...
2019-10-19 22:41:04
142
原创 海量用户——Redis连接池介绍和原理
package mainimport “fmt”/*距离,存放一个商品信息包括商品名、价格、生产日期完成对应的crud操作说明:通过Golang对Redis操作,还可以通过Redis连接池,流程如下:1.实现初始化一定数量的连接,放入到连接池2.当Go需要操作Redis时,直接从Redis连接池去除连接即可。3.这样可以节省临时获取Redis连接的时间,从而提高效率。4.示意图...
2019-10-19 22:39:02
968
原创 TCP-服务器监听
package mainimport (“fmt”“net”)func process(conn net.Conn) {//这里我们循环的接收客户端发送的数据defer conn.Close()//关闭connfor{//创建一个新的切片buf := make([]byte,1024)//conn.Read(buf)//1.等待客户端通过conn发送信息//2.如果客户...
2019-10-19 22:34:55
4809
原创 服务器接收客戶端消息
package mainimport (“net”“fmt”“bufio”“os”)func main(){conn,err:= net.Dial(“tcp”,“192.168.20.253:8888”)//net,标准,dial链接端口ip,conn接口if err!=nil{//如果不等于nil,那就但因,客服服务端的错误信息fmt.Println(“client dial...
2019-10-19 22:33:27
256
原创 網絡編程基本介紹
package main/*Golang的主要设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端程序必不可少也是最关重要的一部分。网络编程有两种:1)TCP socket编程,是网络编程的主流,之所以叫tcp socket编程,是因为底层是基于tcp/ip协议的,比如:qq聊天[示意图]2)b/s结构体的http编程,我们使用浏览器取访问服务器时,使用的就是http协议,而ht...
2019-10-19 22:29:25
193
原创 反射
package main/*2)使用反射的方式来获取结构体的tag标签,遍历字段的值,修改字段值,调用结构体方法(要求:通过传递地址的方式完成,在前面案例上修改即可)反射struct的核心代码tag:=typ.Elem().field(O).TagGet(“json”)fmt.Printf(“tag%\n”,tag)3)定义了两个函数test1和test2,定义一个适配器函数用作统一处...
2019-10-12 11:39:52
240
原创 协程求素数的思路分析
package mainimport “fmt”/*应用实例3需求:要求统计1-200000的数字中,那些事素数?这个问题再本章开篇就提出了,现在我们由goroutine和channel的只是后,就可以完成了[测试数据:80000]分析思路:传统的方法,就是使用一个循环,循环的判断各个数事不是素数[ok].使用并发/并行的方式,将统计素数的任务分配给多个(4个)goroutine取完...
2019-10-12 09:36:13
329
原创 管道的注意事项和细节3
package mainimport (“time”“fmt”)//3)使用select可以解决从管道取数据得阻塞问题[案例演示]//4)goroutine中使用recover,解决协程中出现panic,导致程序崩溃问题[案例演示]/*说明:如果我们起了一个协程,但是这个协亨出现了panic,如果我们没有捕获这个panic,就会造成整个程序崩溃,这时我们可以再goroutine中使...
2019-10-12 09:33:55
139
原创 管道的注意事项和细节
package mainimport “fmt”/*1)channel可以声明为只读,或者只写性值[案例演示]2)channel只读和只写的最佳时间案例*///func chan<-int,这样ch就只能写操作了func send(ch chan<- int,exitChan chan struct{}){for i:= 0;i<10;i++{ch<-i...
2019-10-12 09:31:47
196
原创 goroutine.go
package mainimport (“fmt”“strconv”“time”“runtime”)/*需求:要求统计1-20000的数字中,那些事素数?分析思路:1)传统的方法,就是使用一个循环,循环的判断哥哥书是不是素数。2)使用并发或者并行的方式,将统计素数的任务分配给多个goroutine去完成,这时就会使用到goroutine代码实现:monstergorou...
2019-10-12 09:28:24
110
原创 管道的注意事项与细节2
package mainimport (“fmt”“time”)/*3)使用select可以解决从管道读取数据的阻塞问题[案例演示]4)goroutine中使用recover,解决协程中出现panic,导致程序崩溃问题,[案例演示]说明:如果我们起了一个协程,但是这个协程出现了panic,如果我们没有铺货这个panic,就会造成整个程序崩溃,这时我们可以再goroutine中使用r...
2019-10-12 09:27:53
169
原创 管道阻塞机制
package mainimport (“fmt”“time”)/*应用实例1请完成goroutine和channel协同工作的案例,具体要求:1)开启一个writeData协程,向管道intChan中写入50个整数。2)开启一个readData协程,从管道intChan中读取writeData写入的数据。3)注意:writeData和readData操作的时同一个管道4)主...
2019-10-06 14:47:12
913
原创 协程配合管道的综合案例
package mainimport (“fmt”“time”)/*应用实例1请完成goroutine和channel协同工作的案例,具体要求:1)开启一个writeData协程,向管道intChan中写入50个整数。2)开启一个readData协程,从管道intChan中读取writeData写入的数据。3)注意:writeData和readData操作的时同一个管道4)主...
2019-10-06 14:07:44
598
原创 管道的关闭和遍历
package mainimport “fmt”/*读写channel课堂练习说明:请完成如下案例1)创建一个Person结构体[Name,Age,Address]2)使用rand方法配合随机创建10个Person实例,并放入到channel中3)遍历channel,将各个Person实例的信息显示在终端…channel的关闭使用内置函数close可以关闭channel,当cha...
2019-10-06 11:31:46
902
原创 管道的细节和课堂练习
package mainimport “fmt”func main(){//1)创建一个intChan,最多可以存放3个int,演示存3数据到intChan,然后在取出这三个intvar intChan chan intintChan = make(chan int,3)intChan <- 10intChan <- 20intChan<-10//因为intCh...
2019-10-06 10:28:15
174
原创 管道基本介绍
package mainimport “fmt”/*为什么需要channel前面使用全局变量加锁同步来解决goroutine的通讯,但不完美1)主线程在等待所有goroutine全部完成的时间很难确定,我们这里设置10秒,仅仅是估算。2)如果主线程休眠时间长了,会加长等待时间,如果等待时间短了,可能还有goroutine处于工作状态,这时也会随主线程的退出而销毁3)通过全局变量加锁同...
2019-10-06 09:41:25
428
原创 goroutine
package mainimport (“fmt”“strconv”“time”“runtime”)/*需求:要求统计1-20000的数字中,那些事素数?分析思路:1)传统的方法,就是使用一个循环,循环的判断哥哥书是不是素数。2)使用并发或者并行的方式,将统计素数的任务分配给多个goroutine去完成,这时就会使用到goroutine代码实现:monstergorou...
2019-10-06 07:42:48
160
原创 协程并发资源型竞争问题
package mainimport (“sync”“time”“fmt”)/*不同goroutine之间如何通讯1)全局变量加锁同步2)channel使用全局变量加锁同步改进程序因为没有对全局变量m加锁,因此会出现资源争夺问题,代码会出现错误,提示concurrent map writes解决方案,加入互斥锁我们的数的阶乘很大,结果会越界,可以将求阶改成sum+=uni...
2019-10-06 07:41:33
719
原创 Sub-cabtest.go
package calimport (“testing”“fmt”)//编写要给测试用例,去测试addUpper是否正确func TestGetSub(t *testing.T){//调用res := getSub(10,3)if res != 7{ //fmt.Printf("AddUpper(10)执行错误,期望值=%v 实际值=%v\n,55,res) t.Fatalf...
2019-10-05 21:49:43
81
原创 caltest
package calimport (“testing”“fmt”)//编写要给测试用例,去测试addUpper是否正确func TestAddUpper(t *testing.T){//调用res := addUpper(10)if res != 55{//fmt.Printf(“AddUpper(10)执行错误,期望值=%v 实际值=%v\n”,55,rest.Fatal...
2019-10-05 21:48:25
182
原创 cal
package cal//一个被测试函数func addUpper(n int)int{res:=0for i :=1;i<=n-1;i++{res+=i}return res}func getSub(n1 int,n2 int)int{return n1-n2}
2019-10-05 21:47:13
226
1
原创 单元测试快速入门
package mainimport (“testing”//引入go的testing框架包“encoding/json”“fmt”“io/ioutil”)/*单元测试-基本介绍Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例,也可以基于该框...
2019-10-05 21:44:35
255
原创 测试用例
package mainimport “testing”//测试用例,测试Store 方法func TestStore(t *testing.T){//先创建一个Monster实例monster:= &Monster{Name:“红孩儿”,Age:10,Skill:“吐火”,}res:=monster.Store()if res{t.Fatalf(“monster....
2019-10-05 21:43:27
124
原创 单元测试的引出
package mainimport “fmt”/*这里有一个函数,怎样确认它运行的结果是正确的?先看一个需求在我们工作中,我们遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确如:*///一个被测试函数func addUpper(n int)int{res:= 0for i :=1; i<=n;i++{res+=i}return res}func ...
2019-10-05 21:42:41
117
utils.goutils.goutils.goutils.goutils.goutils.goutils.goutils.goutils.goutils.go
2019-11-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人