GoFrame系列:2、Windows下搭建环境准备

GoFrame系列:2、Windows下搭建环境准备



这块的内容来自:https://goframe.org/pages/viewpage.action?pageId=1114397,但原文是针对mac下的安装,我这里根据Windows下安装过程出现的问题做了总结。

实际上这块的内容跳出了GoFrame的范畴,比较细致的描述了Go的安装、GoLand的如何配置Go Modules以及设置Go的环境变量和GoLand常用的工具,更像是Go的基础教程的一部分,因此,如果已经设置了Go+GoLand的开发环境,这部分可以跳过。

1. Go+GoLand环境安装

Go开发包+GoLand开发工具:

不知道的可以看这里:https://blog.csdn.net/weixin_39510813/article/details/114892586和https://blog.csdn.net/weixin_39510813/article/details/115012762(一般从https://golang.org/dl/直接下载安装文件安装即可),当然文档中也很细致,也有简单的教程。

GoLand下载地址:https://www.jetbrains.com/go/download/#section=windows

较新版本的都可以通过搜索安装Chinese语言插件汉化。

如下是GoLand创建项目的简单过程:

在这里插入图片描述

新建一个go文件,叫做hello.go,并输入以下代码:

package main

import "fmt"

func main() {
    fmt.Println("hello world!")
}

在这里插入图片描述

执行运行:

在这里插入图片描述

2. Go Module

Go Module是从Go版本1.11.1开始官方提供的包管理工具,用于解决Go项目的包管理及依赖,类似于PHP的composer、Nodejs的npm。本章节会对Go Module的一些常用的实用的命令/设置进行介绍,更详细的介绍请查看官方文档:https://github.com/golang/go/wiki/Modules

2.1 关于go.mod

go.mod是Go项目的依赖描述文件,该文件主要用来描述两个事情:

  1. 当前项目名(module)是什么。每个项目都应该设置一个名称,当前项目中的包(package)可以使用该名称进行相互调用。
  2. 当前项目依赖的第三方包名称。项目运行时会自动分析项目中的代码依赖,生成go.sum依赖分析结果,随后go编译器会去下载这些第三方包,然后再编译运行。

我们将之前的hello world项目做一些改变,增加一个go.mod文件(也可以在项目根目录下使用 go mod init 项目名称命令初始化项目生成该文件),内容如下:

module my-hello

其中,my-hello为当前项目的名称,可以随意设置。

就这样简单便完成了项目的module初始化。

一般情况下,go.sum依赖分析文件应当被添加到版本管理中随着go.mod文件一起提交。

2.2 使用go.mod

使用go.mod意即用go.mod进行项目依赖管理。我们有两种go.mod的使用方式:IDE-vgo和命令行方式。以下我们通过下载使用GoFrame框架来演示如何使用这两种方式来管理依赖。

如果需要Goland IDE支持go.mod,必须要打开vgo的支持(包括代码依赖检测)。这两种使用方式的区别仅仅是下载依赖包的方式不同。

2.2.1 使用Goland IDE vgo(推荐)

vgo是基于Go Module规范的包管理工具,同官方的go mod命令工具类似。

  • 1.设置Goland启用vgo

在这里插入图片描述

其中Proxy请输入代理地址下载依赖包,如果选择direct表示不使用代理。可选择的反向代理地址有:

  • https://goproxy.cn
  • https://goproxy.io
  • https://mirrors.aliyun.com/goproxy/

详见Go官网说明:https://github.com/golang/go/wiki/Modules#are-there-always-on-module-repositories-and-enterprise-proxies

这里请务必选择一个代理地址输入。

  • 2.手动修改go.mod文件如下:
module my-hello

require github.com/gogf/gf latest

增加GoFrame框架的依赖,其中latest表示使用最新版本,IDE将会立即去更新下载框架代码。成功后,IDE将会修改go.mod文件并生成go.sum依赖分析文件。

在这里插入图片描述

如果出现包飘红的情况,则根据提示进行包同步即可,一般来说配置好代理下载是不会有什么问题的。

下载同步完成后编译运行如下所示:

在这里插入图片描述

2.2.2 使用命令行

打开Terminal,在项目根目录下执行:

export GO111MODULE=on GOPROXY=https://goproxy.cn; go get -u github.com/gogf/gf

该命令将会立即下载最新稳定版本的GoFrame框架。其中 export GO111MODULE=on; 表示开启Go Module特性(Go 1.11.x版本默认关闭,需要手动开启),export GOPROXY=https://goproxy.cn 表示使用代理下载,原因你懂的,并且也能极大提高依赖包下载速度。代理地址也可使用:

  • https://goproxy.cn
  • https://goproxy.io
  • https://mirrors.aliyun.com/goproxy

对于命令行的方式我一般会将一些命令写到脚本中执行。

2.3 使用GoFrame

我们将之前的hello.go修改如下:

package main

import (
    "fmt"
    "github.com/gogf/gf"
)

func main() {
    fmt.Println("hello GF", gf.VERSION)
}

运行结果如上图所示。

3. 开发环境配置

3.1 Go环境变量

为方便开发,在开发环境往往需要设置三个环境变量:

  1. $GOROOT:go的安装目录,配置后不会再更改;
  2. $GOPATH:go项目在本地的开发环境的的项目根路径(以便项目编译,go build, go install),不同的项目在编译的时候该环境变量可以不同;
  3. $PATH(重要):需要将go的bin目录添加到系统$PATH中以便方便使用go的相关命令,配置后也不会再更改;

Go的环境变量在官方文档中也有详情的说明,请参考链接:https://golang.google.cn/doc/install/source

环境变量中的$GOOS$GOARCH是比较实用的两个变量,可以用在不同平台的交叉编译中,只需要在go build之前设置这两个变量即可,这也是go语言的优势之一:可以编译生成跨平台运行的可执行文件。感觉比QT更高效更轻量级,虽然生成的可执行文件是大了一点,不过也在可接受的范围之内。 例如,在Linux amd64架构下编译Windows x86的可执行文件,可以使用如下命令:

CGO_ENABLED=0 GOOS=windows GOARCH=386 go build hello.go

遗憾的是交叉编译暂不支持cgo方式,因此需要将环境变量$CGO_ENABLED设置为0,这样执行之后会在当前目录生成一个hello.exewindows x86架构的可执行文件。

3.2 环境变量设置

除了$PATH环境外,其他环境变量都是可选的。

为什么说这个步骤可选呢?因为未来的Go版本慢慢开始移除对$GOPATH/$GOROOT的支持。此外,在Goland这个IDE中集成有Terminal功能,直接使用这个功能中已经设置好了环境变量。

在这里插入图片描述

3.2.1 *nix下设置环境变量

*nix系统下(Linux/Unix/MacOS/*BSD等等),需要在/etc/profile中增加以下环境变量设置后,执行命令#source /etc/profile重新加载profile配置文件(或重新登录),将以下变量添加到用户的环境变量中:

export GOROOT=/usr/local/go
export GOPATH=/Users/john/Workspace/Go/GOPATH
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
3.2.2 Windows下设置环境变量

Windows如何修改系统环境变量,以及修改环境变量PATH,请参考网上教程([百度](https://www.baidu.com/s?wd=Windows 修改系统环境变量 PATH) 或 Google)。

将对应变量设置到系统环境变量中:

在这里插入图片描述

将go/bin和生成的可执行文件的路径添加到Path:

在这里插入图片描述

这样go相关的命令以及编译包生成的路径都是全局可以找到的,不需要指定命令的绝对路径就可以执行。

3.3 IDE工具配置

本文以Goland开发工具为基础,介绍在该IDE下的常用工具配置。

常用的工具包括:

  1. go fmt : 统一的代码格式化工具(必须)。
  2. golangci-lint : 静态代码质量检测工具,用于包的质量分析(推荐)。
  3. goimports : 自动import依赖包工具(可选)。
  4. golint : 代码规范检测,并且也检测单文件的代码质量,比较出名的Go质量评估站点Go Report在使用(可选)。
3.3.1 go fmt, goimports, golangci-lint的配置

由于这三个工具是Goland自带的,因此配置比较简单,参考以下图文操作示例:

  1. Goland的设置中,选择Tools - File Watchers,随后选择添加

在这里插入图片描述

  1. 依次点击添加这3个工具,使用默认的配置即可

    如果程序飘红的话可能是对应程序未安装成功,一般giimports和golangci-lint会出现这个情况。

    如果一直下载不成功的话则可以去网页上下载下来之后放到项目目录中然后在对应目录下使用go install安装即可,默认会安装到bin目录下,所以前面path设置正常的话就可以找到对应的程序了(没有安装成功的话程序位置的程序是飘红的):

在这里插入图片描述

我通过everything搜索到的两个工具的路径如下,你也可以尝试搜索一下到对应目录下执行go install进行安装:

/d/mynotes/go/src/github.com/golangci/golangci-lint/cmd/golangci-lint

/d/mynotes/go/pkg/mod/golang.org/x/tools@v0.1.0/cmd/goimports

之后记得设置为全局级别(避免每个项目都重新下载设置):

在这里插入图片描述

  1. 随后在撸代码的过程中保存代码文件时将会自动触发这3个工具的自动检测。
3.3.2 golint工具的安装及配置

由于Goland没有自带golint工具,因此首先要自己去下载安装该工具。(所以上面两个插件如果GoLand本身一直下载或者安装失败的话就是按照这样的方式处理即可,命令行下载不成功直接从网页上下载复制到对应位置也行)

使用以下命令安装:

mkdir -p $GOPATH/src/golang.org/x/

cd $GOPATH/src/golang.org/x/
git clone https://github.com/golang/lint.git
git clone https://github.com/golang/tools.git

cd $GOPATH/src/golang.org/x/lint/golint
go install

安装成功之后将会在$GOPATH/bin目录下看到自动生成了golint二进制工具文件(像fmt工具默认是在go安装目录的bin目录下,不是在$GOROOT/bin下)。

在这里插入图片描述

3.3.3 golint配置
  • 随后在GolandTools - File Watchers配置下,通过复制go fmt的配置

复制go fmt内容之后进行修改:

在这里插入图片描述

  • 修改Name, Program, Arguments三项配置,其中Arguments需要加上-set_exit_status参数,如图所示:

在这里插入图片描述

  • 保存即可,随后在代码编写中执行保存操作时将会自动触发golint工具检测。

设置全局后到其它项目中只需要开启对应工具即可。

3.3.4 配置备份导入

也可以通过保存以下XML配置文件内容,使用import导入功能即可完成配置(golint还是得自己安装)。

在这里插入图片描述

文件内容(下面的内容是我从我的配置中导出的):

<TaskOptions>
  <TaskOptions>
    <option name="arguments" value="-set_exit_status $FilePath$" />
    <option name="checkSyntaxErrors" value="true" />
    <option name="description" />
    <option name="exitCodeBehavior" value="ERROR" />
    <option name="fileExtension" value="go" />
    <option name="immediateSync" value="false" />
    <option name="name" value="golint" />
    <option name="output" value="$FilePath$" />
    <option name="outputFilters">
      <array />
    </option>
    <option name="outputFromStdout" value="false" />
    <option name="program" value="golint" />
    <option name="runOnExternalChanges" value="false" />
    <option name="scopeName" value="Project Files" />
    <option name="trackOnlyRoot" value="true" />
    <option name="workingDir" value="$ProjectFileDir$" />
    <envs>
      <env name="GOROOT" value="$GOROOT$" />
      <env name="GOPATH" value="$GOPATH$" />
      <env name="PATH" value="$GoBinDirs$" />
    </envs>
  </TaskOptions>
  <TaskOptions>
    <option name="arguments" value="fmt $FilePath$" />
    <option name="checkSyntaxErrors" value="true" />
    <option name="description" />
    <option name="exitCodeBehavior" value="ERROR" />
    <option name="fileExtension" value="go" />
    <option name="immediateSync" value="false" />
    <option name="name" value="go fmt" />
    <option name="output" value="$FilePath$" />
    <option name="outputFilters">
      <array />
    </option>
    <option name="outputFromStdout" value="false" />
    <option name="program" value="$GoExecPath$" />
    <option name="runOnExternalChanges" value="false" />
    <option name="scopeName" value="Project Files" />
    <option name="trackOnlyRoot" value="true" />
    <option name="workingDir" value="$ProjectFileDir$" />
    <envs>
      <env name="GOROOT" value="$GOROOT$" />
      <env name="GOPATH" value="$GOPATH$" />
      <env name="PATH" value="$GoBinDirs$" />
    </envs>
  </TaskOptions>
  <TaskOptions>
    <option name="arguments" value="-w $FilePath$" />
    <option name="checkSyntaxErrors" value="true" />
    <option name="description" />
    <option name="exitCodeBehavior" value="ERROR" />
    <option name="fileExtension" value="go" />
    <option name="immediateSync" value="false" />
    <option name="name" value="goimports" />
    <option name="output" value="$FilePath$" />
    <option name="outputFilters">
      <array />
    </option>
    <option name="outputFromStdout" value="false" />
    <option name="program" value="goimports.exe" />
    <option name="runOnExternalChanges" value="false" />
    <option name="scopeName" value="Project Files" />
    <option name="trackOnlyRoot" value="true" />
    <option name="workingDir" value="$ProjectFileDir$" />
    <envs>
      <env name="GOROOT" value="$GOROOT$" />
      <env name="GOPATH" value="$GOPATH$" />
      <env name="PATH" value="$GoBinDirs$" />
    </envs>
  </TaskOptions>
  <TaskOptions>
    <option name="arguments" value="run --disable=typecheck $FileDir$" />
    <option name="checkSyntaxErrors" value="true" />
    <option name="description" />
    <option name="exitCodeBehavior" value="ERROR" />
    <option name="fileExtension" value="go" />
    <option name="immediateSync" value="false" />
    <option name="name" value="golangci-lint" />
    <option name="output" value="" />
    <option name="outputFilters">
      <array />
    </option>
    <option name="outputFromStdout" value="false" />
    <option name="program" value="golangci-lint.exe" />
    <option name="runOnExternalChanges" value="false" />
    <option name="scopeName" value="Project Files" />
    <option name="trackOnlyRoot" value="true" />
    <option name="workingDir" value="$ProjectFileDir$" />
    <envs>
      <env name="GOROOT" value="$GOROOT$" />
      <env name="GOPATH" value="$GOPATH$" />
      <env name="PATH" value="$GoBinDirs$" />
    </envs>
  </TaskOptions>
</TaskOptions>

4. 私有依赖管理

版本选择算法

当项目中存在同一个第三方包依赖,并且依赖版本不一致时,Go Modules使用的“最小版本选择算法”(The minimal version selection algorithm: https://github.com/golang/go/wiki/Modules#version-selection )。

例如,如果您的模块依赖于具有require D v1.0.0的模块A,并且您的模块还依赖于具有require D v1.1.1的模块B,则最小版本选择将会选择D的v1.1.1版本用以构建(使用最高版本)。

请不要问我为什么这个算法名字叫“最小版本选择算法”,然而内容却是“最高版本选择算法”,若有纠结于此的同学欢迎向官方提issue:https://github.com/golang/go/issues

私有依赖管理

如果你可以通过go.mod完美地管理当前的项目包依赖,那么可以忽略该章节。如果你在处理项目的包依赖管理中遇到了问题,那么建议你继续阅读该章节,可以找到解决问题的灵感。

前面章节我们非常详细、图文并茂地介绍了基本的开发环境安装/配置、Go Module安装使用,在实际的项目开发中,你会发现更多的问题,常见的:

  1. 虽然GF足够强大,但多数时候依赖的包不仅仅是GF,还包括一些额外的第三方包,特别是golang.org的包,需要自带梯子翻墙下载,即使本地方便处理,但是在自动部署系统上可能会稍麻烦;
  2. 一些自研开发的第三方包,特别是一些业务依赖包,是不允许公开下载的(私有库),并且版本库也可能不支持HTTPS协议,因此无法使用go get或者go.mod进行下载和管理;
  3. 等等;

如果你遇到了上面所提到的问题,我们建议的解决方案:通过GOPRIVATE的方式设置私有包有效域名。

例如以下命令行方式:

export GOPROXY=https://goproxy.cn
export GOPRIVATE=git.xxx.com
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main main.go

该特性需要Go v1.13以上版本支持。

Goland中这么设置:

在这里插入图片描述

这类问题之前也总结过一部分,go module使用本地包以及本地包上传gitlab使用正好和这里对应起来了:https://blog.csdn.net/weixin_39510813/article/details/116499970

5. 最后

使用Go开发的一大好处就是应用符合云原生的要求,各个进程以微服务的形式存在(感觉像是对模块化编程的升级,让这些通用功能模块上云),之间通过gRPC的方式进行,保证各个进程间的耦合尽可能的低,这样可以根据需求增删部分进程而互不影响,再利用docker对环境和应用容器化,这样可以快速部署在不同设备,这样才有可能做到快速并自动化的进行设备更换和应用部署,物联网的基础打好了才有更准确的数据进行大数据处理,也才有更准确的数据进行云计算,也才能由足够的数据对AI进行训练,也才有可能以此完成AI的闭环,由AI自己进行数据生产、采集、维护、计算处理和学习训练,而不是由人工进行数据采集、维护、计算进而“投喂”给AI进行训练,如果把人工训练的AI类比人的小时候的话,那么拥有自主数据采集、计算和训练学习的AI才是真的长大了,因为他有了自己认识世界并独立生存和生活的能力(物联网、大数据、云计算、AI这些都是相辅相成的;一些机器人的中台也基本都会通过Go来开发,如果Go解决了驱动开发的制约的话那么机器人开发可能也会变得更加成熟)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值