因为工作原因,需要使用Go语言进行开发,作为一个嵌入式开发人员,兵来将挡水来土掩
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
https://studygolang.com/dl
开发环境为WSL,所以直接选择Linux版本下载
tar zxvf go1.18.3.linux-amd64.tar.gz
把解压后的go文件夹复制到home目录下,也可以自己定义,不过要记得自己的的这个目录
开始配置环境
Linux下又两个文件可以配置,其中/etc/profile
是针对所有用户都有效的;$HOME/.profile
是针对当前用户有效的,可以根据自己的情况选择。
针对所有用户的需要重启电脑才可以生效;针对当前用户的,在终端里使用source
命令加载这个$HOME/.profile
即可生效。
建议在同一目录下建立go语言工作环境文件夹,我这里新建了一个gopath文件夹,路径为/home/gopath。
sudo nano /etc/profile
然后在打开的文件末尾添加:
export GOROOT=/home/go
export GOPATH=/home/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOPROXY="https://goproxy.io"
其中GOROOT环境变量表示我们GO的安装目录,这样其他软件比如我们使用的Go开发IDE就可以自动的找到我们的Go安装目录,达到自动配置Go SDK的目的。
第三句export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
配置是把/home/go/bin这个目录加入到环境变量PATH里,这样我可以在终端里直接输入go等常用命令使用了,而不用再加上/home/go/bin这一串绝对路径,更简洁方便。
再然后刷新文档
source /etc/profile
这里的环境是全局的
以上配置好之后,我们打开终端,属于如下命令,就可以看到go的版本等信息了。
go version
自动Golang采用Module的方式管理项目后,GOPATH目录已经不是那么重要了,目前主要用来存放依赖的Module库,生成的可执行文件等。
GOPATH环境变量的配置参考上面的安装Go,配置到/etc/profile
或者Windows下的系统变量里。
这个目录我们可以根据自己的设置指定,比如我的Mac在$HOME/code/go下,Window的可以放到d:\code\go下等。该目录下有3个子目录,他们分别是:
.
├── bin
├── pkg
└── src
$GOPATH/bin
路径加入到PATH环境变量里,就和我们上面配置的$GOROOT/bin
一样,这样就可以直接在终端里使用我们go开发生成的程序了。配置好工作环境后,就可以编码开发了,在这之前,我们看下go的通用项目结构,这里的结构主要是源代码相应地资源文件存放目录结构。
基于Go Module,你可以在任意位置创建一个Go项目,而不再像以前一样局限在$GOPATH/src
目录下。假设我要创建一个tour项目,它位于~/Desktop/tour
目录下,那我现在打开终端,CD到~/Desktop/tour
目录下,输入如下命令即可创建一个Go Module
工程。
➜ tour go mod init flysnow.org/tour
go: creating new go.mod: module flysnow.org/tour
当前生成的Go Module
工程只有一个go.mod
文件,它的内容如下所示:
module flysnow.org/tour
1.16
其中module flysnow.org/tour
代表该项目的path,也就是最顶层的package,1.16表示该项目需要1.16版本及其以上才能编译运行。
go.mod文件是Go语言工具链用于管理Go语言项目的一个配置文件,我们不用手动修改它,Go语言的工具链会帮我们自动更新,比如当我们的项目添加一个新的第三方库的时候。
使用第三方库,也就是使用第三方库里的包,那么我们如何引用一个包呢,使用的就是go语言的import关键字,比如:
import (
"github.com/gohugoio/hugo/commands"
)
以上引入的github.com/gohugoio/hugo/commands
这个包是属于 github.com/gohugoio/hugo/
这个Go Module的。
所以相应的,我们也可以在我们自己的Go Module工程里创建一些包(其实就是子目录),比如我创建了lib1目录,那么它的对应的包就是flysnow.org/tour/lib1
,其他包只有通过这个包名才能使用flysnow.org/tour/lib1
包中的函数方法等。
.
├── go.mod
├── lib1
├── lib2
└── main.go
所以最后你的项目目录类似上面的结构,每个子目录都是一个包,子目录里可以放go文件。
这里准备了一个示例代码
保存为 .go 格式的文件
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
执行
go run test.go
可以看到
表示Go下载和安装成功,但是我们肯定不能止步于此,要让开发变得人性化,需要借用VSCode
go install 命令的功能和前面一节《go build命令》中介绍的 go build 命令类似,附加参数绝大多数都可以与 go build 通用。go install 只是将编译的中间文件放在 GOPATH 的 pkg 目录下,以及固定地将编译结果放在 GOPATH 的 bin 目录下。
这个命令在内部实际上分成了两步操作:第一步是生成结果文件(可执行文件或者 .a 包),第二步会把编译好的结果移到 $GOPATH/pkg 或者 $GOPATH/bin。
本小节需要用到的代码位置是./src/chapter11/goinstall。
本套教程所有源码下载地址:https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ 提取密码:hfyf
使用 go install 来执行代码,参考下面的 shell:
$ export GOPATH=/home/davy/golangbook/code
$ go install chapter11/goinstall
编译完成后的目录结构如下:
.
├── bin
│ └── goinstall
├── pkg
│ └── linux_amd64
│ └── chapter11
│ └── goinstall
│ └── mypkg.a
└── src
└── chapter11
├── gobuild
│ ├── lib.go
│ └── main.go
└── goinstall
├── main.go
└── mypkg
└── mypkg.go
go install 的编译过程有如下规律:
以前运行和安装,都是默认根据我们当前的机器生成的可执行文件,比如你的是Linux 64位,就会生成Linux 64位下的可执行文件,比如我的Mac,可以使用go env查看编译环境,以下截取重要的部分。
➜ ~ go env
GOARCH="amd64"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
注意里面两个重要的环境变量GOOS和GOARCH,其中GOOS指的是目标操作系统,它的可用值为:
aix
android
darwin
dragonfly
freebsd
illumos
js
linux
netbsd
openbsd
plan9
solaris
windows
一共支持13种操作系统。GOARCH指的是目标处理器的架构,目前支持的有:
arm
arm64
386
amd64
ppc64
ppc64le
mips
mipsle
mips64
mips64le
s390x
wasm
一共支持12种处理器的架构,GOOS和GOARCH组合起来,支持生成的可执行程序种类很多,具体组合参考https://golang.org/doc/install/source#environment
。如果我们要生成不同平台架构的可执行程序,只要改变这两个环境变量就可以了,比如要生成linux 64位的程序,命令如下:
GOOS=linux GOARCH=amd64 go build flysnow.org/tour
前面两个赋值,是更改环境变量,这样的好处是只针对本次运行有效,不会更改我们默认的配置。
获取远程包
因为众所周知的原因,在获取远程包之前,我们需要先配置的代理,这里推荐goproxy.io代理,设置命令如下:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
设置好代理后,就可以使用go提供的一个获取远程包的工具go get来获取远程包了,它需要一个完整的包名作为参数,只要这个完整的包名是可访问的,就可以被获取到,比如我们获取一个CLI的开源库:
go get -v github.com/spf13/cobra
就可以下载这个库到我们$GOPATH/pkg/mod目录下了,这样我们就可以像导入其他包一样import了。
特别提醒,go get的本质是使用源代码控制工具下载这些库的源代码,比如git,hg等,所以在使用之前必须确保安装了这些源代码版本控制工具。
如果我们使用的远程包有更新,我们可以使用如下命令进行更新,多了一个-u标识。
go get -u -v github.com/spf13/cobra
如果是私有的git库怎么获取呢?比如在公司使用gitlab搭建的git仓库,设置的都是private权限的。这种情况下我们可以配置下git,就可以了,在此之前你公司使用的gitlab必须要在7.8之上。然后要把我们http协议获取的方式换成ssh,假设你要获取http://git.flysnow.org,对应的ssh地址为[email protected],那么要在终端执行如下命令。
git config --global url."[email protected]:".insteadOf "http://git.flysnow.org/"
这段配置的意思就是,当我们使用http://git.flysnow.org/获取git库代码的时候,实际上使用的是[email protected]这个url地址获取的,也就是http到ssh协议的转换,是自动的,他其实就是在我们的~/.gitconfig配置文件中,增加了如下配置:
[url "[email protected]:"]
insteadOf = http://git.flysnow.org/
然后需要把git.flysnow.org加入GOPRIVATE环境变量中,因为它是你的私有仓库,不需要走GOPROXY代理。
设置不走 proxy 的私有仓库,多个用逗号相隔(可选)
go env -w GOPRIVATE=git.flysnow.org
现在我们就可以使用go get直接获取了,比如:
go get -v -insecure git.flysnow.org/hello
仔细看,多了一个-insecure标识,因为我们使用的是http协议, 是不安全的。当然如果你自己搭建的gitlab支持https协议,就不用加-insecure了,同时把上面的url insteadOf换成https的就可以了。
从Windows打开我们的VSCode,然后远程到WSL
安装Go插件
如果我们直接将示例代码进行F5运行,提示需要安装一些包
直接点击大概率是安装失败的
我们要单独进行操作,因为dlv主要牵扯到debug调试
也是决定了我们开发幸福指数的重要工具
dlv安装
go install github.com/go-delve/delve/cmd/dlv@latest
在确认安装了GCC之后,根据提示返回VSCode再次安装dlv
稍等片刻
go env -w GO111MODULE=auto
上述操作均是Linux环境,但是随着工具的使用,windows环境下工具链的使用也提上了日程
大部分步骤都一样,环境变量安装包会自动添加
问题主要出在了一些包的下载,因为超时的原因无法正常下载
首先进行一个类似于Linux的换源操作
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
然后控制栏输入 Updata