-
[Go] Golang练习项目-邮箱imap网页版客户端工具
所属栏目:[大数据] 日期:2021-05-21 热度:137
# go-imap 邮箱imap网页版客户端工具,基于GO语言实现。 https://github.com/taoshihan1991/imaptool 1.使用第三方类库go-imap解析imap协议 2.使用http包 ,template包,实现http服务下的网页展示 3.使用goroutine在主界面并发请求左右栏的数据 4.使用text/n[详细]
-
[Go] 使用go mod进行依赖管理
所属栏目:[大数据] 日期:2021-05-21 热度:186
开启两个环境变量 go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct ? 在自己的项目里 go mod init 然后如果有引用github上的包 , 直接go mod tidy ,就会自动安装 ? golang开启go mod支持 files===settings ?[详细]
-
[Go] 使用读写锁对map资源进行安全处理
所属栏目:[大数据] 日期:2021-05-21 热度:54
当需要有一个全局性的map集合资源进行增删改数据时,需要对该map资源增加读写锁,防止并发时出现安全问题 下面的类就是举例 , 属性中的Conns模拟存储一些资源,对这些资源进行并发的增加数据,使用写锁锁住资源,当读取是使用读锁锁住资源 package snetimpo[详细]
-
[Go] 轻量服务器框架基础TCP连接的抽象和封装
所属栏目:[大数据] 日期:2021-05-21 热度:139
对tcp连接部分以及与连接绑定的业务部分进行抽象和封装 主要是对连接的开启关闭和读写进行封装,抽象出接口,使用回调进行具体业务的绑定 zinterface/iconnection.go @H_502_6@ package zinterfaceimport " net " type IConnection interface{ Start() Stop([详细]
-
[Go] golang定时器与redis结合
所属栏目:[大数据] 日期:2021-05-21 热度:144
golang定时器与redis结合,每隔1秒ping一下,每隔20秒llen一下队列的长度 package mainimport ( " fmt " time " github.com/go-redis/redis " )var ( client * redis.Client)func main() { client = redis.NewClient( redis.Options{ Addr: xxx:xxxx ,Password[详细]
-
[Go] go中的goto语句跳到指定标签
所属栏目:[大数据] 日期:2021-05-21 热度:198
比如下面的语句goto TOP,其中TOP就是自己的自定义的标签,下面的TOP:就是要执行的代码段 一般用在需要两层循环的地方,里面goto再跳回上面去 for i := 0 ; i 10 ; i++ { if i == 5 { goto TOP } }TOP: fmt .Println( " TOP标签里执行的语句 " ) package mainim[详细]
-
[Go] golang中的包管理
所属栏目:[大数据] 日期:2021-05-21 热度:55
在配置了环境变量$GOPATH后,比如下面这个路径 export GOPATH=/mnt/f/ubuntu/goProject 在这个路径下面会有这几个目录 ? ?在src目录下放着我的源码比如: ? ?在同一个目录下,比如websocket,不需要import,就可以互相调用其它文件的函数,但是在go run的时[详细]
-
[Go] 实现websocket服务端
所属栏目:[大数据] 日期:2021-05-21 热度:79
直接使用官方子包可以实现websocket协议, golang.org/x/net/websocket如果在这个目录没有这个包就去github下载net库,放进这个目录$GOPATH/src/golang.org/x/net就行了服务端代码: package mainimport ( " time " log net/http golang.org/x/net/websocket[详细]
-
[Go] 使用net包作为tcp客户端读取http
所属栏目:[大数据] 日期:2021-05-21 热度:192
1.tcp的客户端,并且直接读取http协议的全部内容,每次读取4096字节,直到最后一个字节是n并且读取的长度小于4096 conn,err := net.Dial( " tcp " , www.baidu.com:80 " ) if err != nil { log.Fatal(err) } _,err = conn.Write([] byte ( GET / HTTP/1.1rn[详细]
-
[Go] Golang中的面向对象
所属栏目:[大数据] 日期:2021-05-21 热度:194
struct interface 就可以实现面向对象中的继承,封装,多态 继承的演示: Tsh类型继承People类型,并且使用People类型的方法 多态的演示 Tsh类型实现了接口Student,实现了接口定义的方法 完整代码: package mainimport " fmt " // 父类型 type People stru[详细]
-
[Go] 实现面向对象中的继承和覆盖方法
所属栏目:[大数据] 日期:2021-05-21 热度:127
go中的继承是使用结构体嵌套实现的,可以继承父类的方法 覆盖和其他面向对象的语言是一样的,函数名,参数,返回类型一致,就可以覆盖父类的方法 package mainimport " log " type People struct{} // 定义一个类型 func (p * People)PrePing() { log.Printl[详细]
-
[Go] 轻量服务器框架基础TCP服务模块
所属栏目:[大数据] 日期:2021-05-21 热度:135
框架要先把整体的结构定义好,一般都是在$GOPATH目录的src下建立自己的目录 ? ?zinterface是一些接口的定义 znet就是接口的具体实现 IServer.go package zinterfacetype IServer interface{ Start() Stop() Server()} server.go一个tcp服务端的基本业务,简[详细]
-
[Go] golang定时器的使用
所属栏目:[大数据] 日期:2021-05-21 热度:126
golang中的定时器是使用的chanel阻塞来实现的,主要使用到了time包中的内容,如果有多个定时器的channel,为了防止阻塞,可以使用select来获取遍历channel 定时器获取的channel是个单通道channel,只能读不能写,定义时这样来定义var test -chan int package maini[详细]
-
[Go] go等待读取最后一行的数据内容
所属栏目:[大数据] 日期:2021-05-21 热度:196
这段代码是参照慕课网的视频教程,主要是f.Seek(0,os.SEEK_END)移动到末尾,但是里面有个小问题,当打开的文件被重新清空内容的清空下,就再也不能到读取数据了,比如在开启读取后 echo ''1.log 这样就再也读不到了,tail包是解决了这个问题的 package maini[详细]
-
[Go] 使用protobuf进行序列化和反序列化
所属栏目:[大数据] 日期:2021-05-21 热度:195
先定义消息类型 orders.proto @H_502_4@ Syntax = " proto2 " ;package message;message Orders {required int32 order_id = 1 ;required string title= 2 ;} 在GOPATH创建目录和编译这个消息类型输出到该目录,包名是message @H_502_4@ mkdir $GOPATH/src/m[详细]
-
[Go] go连接influxdb的库
所属栏目:[大数据] 日期:2021-05-21 热度:119
开启了influxdb后,会监听8086端口 下载客户端代码 git clone https://github.com/influxdata/influxdb1-client.git $GOPATH/src/github.com/influxdata/influxdb1-client package mainimport ( " fmt " _ github.com/influxdata/influxdb1-client " // this[详细]
-
[Go] 轻量服务器框架全局配置的实现以及解析json
所属栏目:[大数据] 日期:2021-05-21 热度:89
在一个应用中经常需要有一个配置文件,可以对代码中的参数进行配置,可以使用一个json文件来对应一个struct的对象,进行全局配置 建一个conf/zinx.json作为配置文件 { " Name " : zinxServer " , Host 0.0.0.0 TcpPort 8888 } ? 建一个utils/GlobalObj.go? u[详细]
-
[Go] golang实时监控日志文件的包tail
所属栏目:[大数据] 日期:2021-05-21 热度:102
在linux中有一个tail命令,tail -f可以实时的监控文件新增加的内容,如果用代码实现这个逻辑,可以下载使用这个包 go get github.com/hpcloud/tail/... ? 测试代码: package mainimport ( " fmt " github.com/hpcloud/tail " )func main() { t,_ : = tail .Tail[详细]
-
[Go] 利用函数类型实现封装中的回调
所属栏目:[大数据] 日期:2021-05-21 热度:57
当进行业务逻辑开发的时候,经常要进行封装,封装成独立的类文件,在类文件的属性中预留出函数类型的API 在调用该类文件中某些方法的时候,也根据业务需要调用类属性中的函数, 在主业务中可以传递特定的函数注册到属性中,也会被调用到 test.PHP? package m[详细]
-
[Go] gocron源码阅读-判断是否使用root用户执行
所属栏目:[大数据] 日期:2021-05-21 热度:150
判断是linux系统,并且uid为0,allowRoot是通过命令行传参传进来的,通过flag包解析出来的,可以使用go run node.go -h看到这些参数 if runtime.GOOS != " windows " os.Getuid() == 0 ! allowRoot { log.Fatal( Do not run gocron-node as root user " ) ret[详细]
-
[Go] 利用channel实现简单的工作池
所属栏目:[大数据] 日期:2021-05-21 热度:113
先启动固定数量的goroutine,每个goroutine都在从channel中获取数据,如果这个channel为空,就阻塞等待在那里 channel中传递一个Car类型,这个类型主要负责具体做的任务 也就是channel就是运输通道,在这个通道上传递Car这样一个汽车,来一辆车就处理这辆车的工作,[详细]
-
[Go] 利用有缓存channel控制同时并发的数量
所属栏目:[大数据] 日期:2021-05-21 热度:131
如果有一个大循环,里面每一个都开启groutine,那么瞬间就会开启非常多的groutine,要解决这个问题就要用channel的阻塞特性来解决 package mainimport " time " import fmt func main() { control : = make (chan interface{}, 2 ) for i := 1 ; i = 10 ; i++ {[详细]
-
[Go] gocron源码阅读-通过第三方cli包实现命令行参数获取和管理
所属栏目:[大数据] 日期:2021-05-21 热度:93
gocron源码中使用的是下面这个第三方包来实现的,下面就单独的拿出来测试以下效果,和官方flag包差不多 go get github.com/urfave/cli package mainimport ( " fmt " log os " github.com/urfave/cli " )func main() { app : = cli.NewApp() var flags []cli[详细]
-
[Go] 使用go mod安装beego
所属栏目:[大数据] 日期:2021-05-21 热度:132
需要go升级到1.12或以上 mkdir gomodtestcd gomodtestgo mod init gomodtest 创建一个server.go package mainimport " github.com/astaxie/beego " func main() { beego.Run()} go run server.go自动查找依赖并且下载依赖的包到$GOPATH /pkg/mod/github.com/[详细]
-
[Go] gocron源码阅读-go语言中数组和切片的字面值初始化语法
所属栏目:[大数据] 日期:2021-05-21 热度:108
源码中有这么一句,这个函数要求返回的是[]cli.Command,cli.Command类型的切片,这个地方直接使用字面值初始化了一个切片返回去了 return []cli.Command{command} ? 数组的字面值初始化,一般是需要指定数组的大小,可以使用...三个点来代替大小,根据后面[详细]