$GOPATH的工作模式

  1. GOPATH代表当前go语言所有项目所在路径
  2. 在$GOPATH目录下,有三个文件夹
  3. bin目录是go语言编译过的所有可执行程序
  4. pkg用来存放默认导入的包,加快导入速度
  5. src存放源码

go modules模式

go mod环境变量

  1. 可以通过go env命令来进行查看

  2. GO111MODULE这个环境变量作为gomodules的开关

  3. 可以通过以下命令设置

  4. ```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初始化项目

  1. 开启go modules

  2. ```bash
    go env -w GO111MODULES=on

    
    3.   或者可以通过直接设置系统环境变量(写入~/.bash_profile文件亦可)
    
    4.   ```bash
         export GO111MODULES=on

创建完项目后初始化项目

  1. ```

    创建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_test

    go 1.15

    
    2.   go mod init命令用来自动导入go.mod,这个文件中的内容决定了后面在导包的时候应怎么写
    
    3.   ```go
         go mod init github.com/aceld/modules_test  //后面在导包的时候就必须导入github.com/aceld/modules_test,包的名字可以自拟
  2. 如果当前文件夹下有go.mod文件,说明项目已经初始化成功,即可在当前文件夹下写项目

使用开源的库

  1. ```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=原来的库和版本号=现在的库和版本号
  2. 在go.mod文件中,replace关键字起到的是重定向的作用

及时通讯系统

项目结构

基础server构建

  1. server.go中实现服务端的基本构建
  2. main.go用来作为项目的入口
  3. 两个形参
  4. network形参:,指定网络类型,tcp/udp,如果当前采用的是IPv4协议,则需要传形参为”tcp4/tcp6/tcp”
  5. address string用来指定服务器监听的地址
  6. 返回值是一个listener和error
  7. ```go
    //server.go
    package main import (
      "fmt"
      "net"
    
    ) type Server struct {
      Ip   string
      Port int
    
    } // 创建一个server的接口,类似于一个构造器
    func NewServer(ip string, port int) *Server {
      server := &Server{
          Ip:   ip,
          Port: port,
      }
      return server
    
    } func (this *Server) Handler(conn net.Conn){
      //当前的链接的业务
      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()
         }

用户上线及广播功能

  1. OnlineMap展示当前有哪些用户上线,总的上线用户表
  2. 一个user类表示一个客户端,每一个user类都会绑定一个channel,一旦channel中有消息,就会自动发送给绑定的client
  3. message类来处理广播的需要,message中有一个goroutine,不断地监听信息,一旦有消息,就遍历onlinemap,发送给onlinemap中的每一个用户

Conn接口

  1. conn接口代表通用的面向流的网络链接,多个线程可能会同时调用同一个Conn方法