goland在mod模式下不从vendor文件夹查找依赖

goland使用vendor作为获取依赖源 软件版本: system:windows10 1709 terminal: wsl ubuntu1804 goland:201903 goland 打开项目时使用mod模式,无法识别外部包的依赖 根据goland官方提示,开启时,将忽略go.mod依赖描述,所以就找不到相对应的依赖,但是编译时正常的。可以看到下图中,external libraries 并没有加载外部的库导致了无法识别。 此时想要正常使用的话,可以按照提示操作 将 goland 改为gopath模式,执行go mod vendor 将依赖同步到vendor 。此时正常。 当依赖更新时,可以手动添加对应的依赖库,go mod tidy 后 。因为vendor中没有新的依赖,需要手动执行下go mod vendor即可正常使用。 使用vendor编译 在编译时,可以使用 -mod=vendor 标记,使用代码主目录文件夹下vendor目录满足依赖获取,go build -mod=vendor。此时,go build 忽略go.mod 中的依赖,(这里仅使用代码root目录下的vendor其他地方的将忽略) GOFLAGS=-mod=vendor 设置顶级vendor作为依赖 go env -w GOFLAGS="-mod=vendor" 进行设置。 取消 go env -w GOFLAGS="-mod="

 ·  · 

Go mod

自从Go官方推出 1.11 之后,增加新的依赖管理模块并且更加易于管理项目中所需要的模块。模块是存储在文件树中的 Go 包的集合,其根目录中包含 go.mod 文件。 go.mod 文件定义了模块的模块路径,它也是用于根目录的导入路径,以及它的依赖性要求。每个依赖性要求都被写为模块路径和特定语义版本。 从 Go 1.11 开始,Go 允许在 $GOPATH/src 外的任何目录下使用 go.mod 创建项目。在 $GOPATH/src 中,为了兼容性,Go 命令仍然在旧的 GOPATH 模式下运行。从 ==Go 1.13== 开始,模块模式将成为默认模式。 使用模块开发 Go 代码时出现的一系列常见操作: 创建一个新模块。 添加依赖项。 升级依赖项。 删除未使用的依赖项。 要使用go module,首先要设置 ==GO111MODULE=on== ,如果没设置,执行命令的时候会有提示。 ==GO111MODULE== 的取值为 off, on, or auto (默认值,因此前面例子里需要注意2个重点)。 off: GOPATH mode,查找vendor和GOPATH目录 on:module-aware mode,使用 go module,忽略GOPATH目录 auto:如果当前目录不在$GOPATH 并且 当前目录(或者父目录)下有go.mod文件,则使用GO111MODULE, 否则仍旧使用 GOPATH mode。 sh 1 2 export GO111MODULE=on export GOPROXY=https://goproxy.io ## 设置代理 go mod 参数说明 commond 说明 download download modules to local cache (下载依赖的module到本地cache)) edit edit go....

 ·  · 

go net/http使用

Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现。使用net/http包,我们可以很方便地编写HTTP客户端或服务端的程序。 http服务端的创建流程 在使用http/net包创建服务端只需要两个步骤 绑定处理器函数 func(ResponseWriter, *Request)与 启用监听 http.ListenAndServe。 go 1 2 3 4 5 6 7 8 9 10 package main import "net/http" func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("123")) }) http.ListenAndServe(":8080", nil) } 通过分析net/http包中server.go 在执行创建http服务端主要执行了下面几个步骤: http.HandleFunc 绑定处理函数 所有的操作的方法都属于一个结构体 ServeMux m: 用户传入的路由和处理方法的映射表,路由和处理函数被定义为结构体muxEntry的属性 mu: 实例化出来的对象的读写锁 调用DefaultServeMux.Handle() 在DefaultServeMux.Handle()中调用DefaultServeMux.HandleFunc(pattern, handler) 在将传入http.HandleFunc()的回调函数,与路由的映射信息,放到该DefaultServeMux的属性中 映射map中 muxEntry http.ListenAndServe 启动服务监听 实例化一个server结构体 调用 ListenAndServe() ListenAndServe()中 net.Listen("tcp", addr) 启动tcp服务监听 Serve()中 appcet()处理用户连接,go c.serve(connCtx) 处理业务段(如判断信息,拼接http、找到对应处理函数) 综上所述,net/http server.go 一切的基础为ServeMux 和 Handler...

 ·  · 

Go socket TCP协议实现

在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 套接字通讯原理示意 TCP的C/S架构 在整个通信过程中,服务器端有两个socket参与进来,但用于通信的只有conn这个socket。它是由 listener创建的。隶属于服务器端。客户端有一个socket参与进来。 net.Listen() 建立一个用于连接监听的套接字 listen.Accept() // 阻塞监听客户端连接请求,成功用于连接,返回用于通信的socket net.Dial() 客户端向服务端发起连接建立一个socket连接 并发的C/S模型通信 Server Accept()函数的作用是等待客户端的链接,如果客户端没有链接,该方法会阻塞。如果有客户端链接,那么该方法返回一个Socket负责与客户端进行通信。所以,每来一个客户端,该方法就应该返回一个Socket与其通信,因此,可以使用一个死循环,将Accept()调用过程包裹起来。 需要注意,实现并发处理多个客户端数据的服务器,就需要针对每一个客户端连接,单独产生一个Socket,并创建一个单独的goroutine与之完成通信。 go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 package main import ( "fmt" "net" "strings" ) func handleConnect(conn net....

 ·  · 

Go 函数 function

golang保留的函数 init(), main()是golang的保留函数,有如下特点: main() 只能用在main包中,仅可定义一个,init() 可定义任意包,可重复定义,建议只定义一个 两个函数定义时不能有任何返回值 只能由go自动调用,不可被引用 init() 先于 main() 执行,并不能被其他函数调用,执行时按照main import顺序执行。 包的执行顺序 Go的初始化和执行总是从main.main函数(main包导入其它的包) 同包下的不同 .go 文件,按照以文件名或包路径名的字符串顺序“从小到大”排序顺序执行 其他的包只有被main包 import 才会执行,按照 import 的先后顺序执行; 如果某个包被多次导入的话,在执行的时候只会导入一次; 当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来; 导入顺序与初始化顺序相反 main => p1 => p2 | p2 => p1 => p main被最后一个初始化,因其总是依赖其他包 函数 函数是将具有独立功能的代码组织成为一个整体,使其具有特殊功能的代码集。在Go语言中,函数是一种数据类型,其特性有如下: 支持匿名函数 支持带有变量名的返回值 支持多值返回 支持匿名函数 不支持重载,一个包中不能有两个名字一样的函数。 定义语法 go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 func test(){ } func test(a int, b int){ } func test(a,b int){ } func test(a,b int list....

 ·  ·