go语言项目及其配置
$GOPATH的工作模式
- GOPATH代表当前go语言所有项目所在路径
- 在$GOPATH目录下,有三个文件夹
- bin目录是go语言编译过的所有可执行程序
- pkg用来存放默认导入的包,加快导入速度
- src存放源码
go modules模式
go mod环境变量
可以通过go env命令来进行查看
GO111MODULE这个环境变量作为gomodules的开关
可以通过以下命令设置
```bash
go env -w GO111MODULE=on## go proxy 1. 这个环境变量主要是用于go模块代理,其作用是用于使go在后续拉取模块版本时直接通过镜像站点来快速拉取 2. 类似于Linux换源的操作 3. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20221008185931.png) 4. direct是一个特殊指示符,用于指示go网源码到模块版本的源地址去抓取 5. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20221008190212.png) ## GOSUMDB 1. 在拉取模块版本时,保证拉取到的模块版本数据未经过修改,如果发现不一样,也就是可能存在篡改,将会立即终止 2. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20221008190919.png) 3. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20221008190951.png) 4. 通过go env来查看环境变量 5. ```bash go env
使用go modules初始化项目
开启go modules
```bash
go env -w GO111MODULES=on3. 或者可以通过直接设置系统环境变量(写入~/.bash_profile文件亦可) 4. ```bash export GO111MODULES=on
创建完项目后初始化项目
```
创建project的目录
$ mkdir pkslow_test
进入目录
$ cd pkslow_test/
初始化
$ go mod init pkslow.com/pkslow_test
go: creating new go.mod: module pkslow.com/pkslow_test$ l
-rw-r–r– 1 larry staff 39 Dec 13 21:07 go.mod
#查看文件内容
$ cat go.mod
module pkslow.com/pkslow_testgo 1.15
2. go mod init命令用来自动导入go.mod,这个文件中的内容决定了后面在导包的时候应怎么写 3. ```go go mod init github.com/aceld/modules_test //后面在导包的时候就必须导入github.com/aceld/modules_test,包的名字可以自拟
如果当前文件夹下有go.mod文件,说明项目已经初始化成功,即可在当前文件夹下写项目
使用开源的库
```bash
go get 库名2. 执行结束后,会在go.mod文件中有require一句提示,后面紧跟的就是所调用的库 3. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20221009191950.png) 4. 在拉取的同时会生成go.sum文件 5. 后面跟着的 // indirect 表示的是没有直接使用这个库,而是间接地使用了这个库,比如我使用了github.com/aceld/zinx/ziface组件,而没有直接调用github.com/aceld/zinx库,在go.mod文件中就会显示 // indrect . 6. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20221009192243.png) 7. 在go.sum文件中会列出所有使用的库 8. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20221009192544.png) 9. go.mod的使用就是为了避免只能将项目放到$GOPATH/src目录下的局限性,这样可以在任意文件夹创建项目 ## go get 下来的库都去哪了 1. 在$GOPATH路径下,有三个文件夹,分别是bin,src和pkg 2. pkg文件夹下有mod文件夹,再往下走分别是不同开源的地方get下来的库 3. 例如,在$GOPATH/pkg/mod/github.com中存放的就是所有的github上get下来的库 4. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20221009202041.png) ## 改变模块之间的依赖关系 1. 当模块更新时,有些api接口可能和之间的业务逻辑不同,需要修改为原来的模块 2. 可以直接修改 **go.mod文件** 3. 也可以使用命令进行替换 4. ```bash go mod edit -replace=原来的库和版本号=现在的库和版本号
在go.mod文件中,replace关键字起到的是重定向的作用
及时通讯系统
项目结构
基础server构建
- server.go中实现服务端的基本构建
- main.go用来作为项目的入口
- 两个形参
- network形参:,指定网络类型,tcp/udp,如果当前采用的是IPv4协议,则需要传形参为”tcp4/tcp6/tcp”
- address string用来指定服务器监听的地址
- 返回值是一个listener和error
- ```go
//server.go
package main import (
) type Server struct {"fmt" "net"
} // 创建一个server的接口,类似于一个构造器Ip string Port int
func NewServer(ip string, port int) *Server {
} func (this *Server) Handler(conn net.Conn){server := &Server{ Ip: ip, Port: port, } return server
} // 启动服务器的接口,给当前类绑定一个方法//当前的链接的业务 fmt.Println("链接建立成功")
func (this *Server) Start() {
}//socket listen listener,err := net.Listen("tcp", fmt.Sprintf("%s:%d",this.Ip,this.Port)) if err != nil { fmt.Println("net.Listen err",err) return } //close listen socket defer listener.Close() //accept for { conn,err := listener.Accept() if err != nil { fmt.Println("listener accept err:",err) continue } go this.Handler(conn) } //do handler //close listen socket
9. ```go //main.go package main func main() { server := NewServer("127.0.0.1",8080) server.Start() }
用户上线及广播功能
- OnlineMap展示当前有哪些用户上线,总的上线用户表
- 一个user类表示一个客户端,每一个user类都会绑定一个channel,一旦channel中有消息,就会自动发送给绑定的client
- message类来处理广播的需要,message中有一个goroutine,不断地监听信息,一旦有消息,就遍历onlinemap,发送给onlinemap中的每一个用户
Conn接口
- conn接口代表通用的面向流的网络链接,多个线程可能会同时调用同一个Conn方法
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 h3110w0r1d's Blog!