让我们在VSCode中搭建Go语言开发环境吧【Golang】【主要适用于Windows初学者】

让我们使用Visual Studio Code(VSCode)来进行Go语言开发吧。

最近我学习了Go语言,这在云计算和容器领域非常常见。为了备忘,我将在这篇文章中记录使用VSCode搭建Go开发环境的步骤。
以下内容主要针对Windows系统,但在其他操作系统上也没有太大区别,请根据需要进行调整。

顺便提一下,在Go官方博客上有关于Go品牌更新的颜色设定以及官方Go字体的相关内容,可用于制作幻灯片和图像设计等。还有徽标和吉祥物Gopher君的透明PNG图片也已准备好,非常方便。

Go语言的安装步骤

虽然网上各地都有报道,但我在这篇文章中来总结一下。

 

    • 公式サイトのDownloadsページから、Windws/Mac/Linux用それぞれのバイナリファイルをダウンロード。

Windows: .msiのインストーラー形式なのでこれを実行。

インストール先がデフォルトはC:\Go\になっているので適宜変更。
[Install]ボタンでインストール実施。
Windowsシステム環境変数のPathにインストール先の
{Goのインストール先}¥bin
を追加。これでコマンドプロンプトからGoのコマンドが実行できるようになる。
Windowsの環境変数GOPATHに任意のフォルダを設定する。ホームの%USERPROFILE%¥go がオススメ。実際の値は
C:\Users\\go
のようになる。ここにGoのライブラリが入るので重要。
ここでフォルダ名は厳密にはgoでなくともよいのだが、他のアプリケーションや他の用途のファイルが混在しないように注意。基本goにしておく。

Mac: .pkgファイルをダウンロードしてインストール。

インストール先は /usr/local/go になる。

Linux: .tar.gzファイルを解凍して配置。

インストール先はMacと同様
環境変数PATHに{Goのインストール先}/binを設定。
環境変数GOPATHに$HOME/goを設定。

只有在命令提示符或终端中输入”go version”并返回结果时,表示安装成功。

CMD> go version
go version go1.18 windows/amd64

当使用附带的Go工具输入”go env”时,会显示与Go构建系统相关的环境变量列表。我们将确认其中与开发人员有关的GOROOT和GOPATH是否已正确配置。

CMD> go env GOROOT
C:\go1.18 (のような値)
CMD> go env GOPATH
C:\Users\<username>\go (のような値)

准备在VSCode上的开发环境。

Go语言程序的本质是以.go为后缀的文本文件加上其他附加内容,因此基本上可以使用任何工具编写。像使用vim或emacs之类的专家很常见。而且,往日的Eclipse和IntelliJ IDEA也有针对Go的插件。对于专门的Go IDE,JETBRAIN公司的一系列IDE中有一个名为GoLand的IDE,它的代码补全功能也非常强大。(但是需要付费使用,就和往常一样…)

 

因此,在几乎不考虑操作系统差异的情况下,对于Go来说,使用跨平台的开发工具也是一个很好的选择。因此,本篇文章将选择使用现代化开发中的经典选手,即VSCode。根据网络上的信息,大多数人似乎更喜欢使用VSCode。

安装扩展工具《Go》。

在扩展搜素框中键入”go”,然后就会出现与该语言同名的”Go”正是官方的扩展程序。安装它后,请重新启动VSCode。

据了解,这个名为“Go”的扩展功能最初由VSCode开发团队维护,但在2020年转交给了Go团队负责,可以看出他们非常投入。另外,据该文章所述,有41%的Go开发者使用VSCode。

 

这个名为“Go”的扩展实际上位于GitHub上,其仓库名为vscode-go。

 

在安装后,如果使用Windows系统,在VSCode中按下Ctrl + Shift + p可以打开命令面板,输入”gotools”等内容,下面的命令将会显示为候选项。

> Go:Install/Update Tools

等待一段时间,将显示可一起安装的标准工具列表。这似乎根据Go的版本和安装时间而异,但实际操作时出现了以下8个工具。

  go-outline  (JSON表現を抽出するためのシンプルなユーティリティ)
  gotests  (特定のソースファイルまたはディレクトリ全体のテスト生成)
  gomodifytags  (?)
  impl  (インターフェースを実装するためのメソッドスタブ生成)
  goplay (Webインターフェース)
  dlv (Goのデバッガ)
  staticcheck (静的チェッカー)
  gopls (Go言語用のLanguage serverのデファクト)

由于这些显示的内容是必须安装的基本工具,所以请您将所有项目都勾选,并点击确定进行安装。此时会进行网络访问并完成安装。

如果在网络问题下,工具的安装失败的情况下。

在一些由公司内部网络中的代理服务器连接到互联网的情况下,安装上述工具可能会失败。如果我们检查VSCode的控制台窗口,会显示以下信息。

Installing github.com/ramya-rao-a/go-outline@latest FAILED
Installing github.com/cweill/gotests/gotests@latest FAILED
Installing github.com/fatih/gomodifytags@latest FAILED
Installing github.com/josharian/impl@latest FAILED
Installing github.com/haya14busa/goplay/cmd/goplay@latest FAILED
Installing github.com/go-delve/delve/cmd/dlv@latest FAILED
Installing honnef.co/go/tools/cmd/staticcheck@latest FAILED
Installing golang.org/x/tools/gopls@latest FAILED

在我的情况下,这种情况发生了,连接到GitHub或其他Git存储库,并且连接到VSCode的扩展功能,我不知道为什么会发生这种情况… 所以我陷入了一段时间的困境。
解决方法之一是,在命令提示符中正确设置代理环境后,使用附带Go语言的命令“go install {存储库的FQDN}/{存储库的路径}”进行直接安装。

CMD> SET http_proxy=http[s]://{プロキシサーバーのホスト}:{プロキシサーバーのポート}
CMD> SET https_proxy=%http_proxy%

在Windows中,可以通过在命令提示符中设置 http_proxy=… 的方式来实现,而在Linux中,可能需要在主机前加上{用户名}:{密码}@。
随后,通过在同一命令提示符下依次使用 go install {包的URL} 命令进行安装。

CMD> go install github.com/ramya-rao-a/go-outline@latest
CMD> go install github.com/cweill/gotests/gotests@latest
CMD> go install github.com/fatih/gomodifytags@latest
CMD> go install github.com/josharian/impl@latest
CMD> go install github.com/haya14busa/goplay/cmd/goplay@latest
CMD> go install github.com/go-delve/delve/cmd/dlv@latest
CMD> go install honnef.co/go/tools/cmd/staticcheck@latest
CMD> go install golang.org/x/tools/gopls@latest

当在VSCode上运行Go:Install/Update Tools时,它内部调用了上述的go install命令,所以需要让Go命令能够通过代理进行执行。

现在的Go语言附带的命令中,使用go install命令来安装这些包。不久前还是使用go get命令,所以在网络上的一些旧信息中可能会提到这一点,请注意。
从2021年2月的Go1.16版本开始,对于新的二进制文件安装,请使用go install命令。
在撰写本文时,如果运行go get -v -u {包的URL}等命令,会以英文告诉你现在应该使用go install。

go: go.mod file not found in current directory or any parent directory.
        'go get' is no longer supported outside a module.
        To build and install a command, use 'go install' with a version,
        like 'go install example.com/cmd@latest'
        For more information, see https://golang.org/doc/go-get-install-deprecation
        or run 'go help get' or 'go help install'.
工具的确认方法

在通过VSCode的命令面板或命令提示符安装工具时,安装的实际文件将被放置在指定了GOPATH环境变量的文件夹下。您可以通过检查更新日期等方式确认是否有更新。

C:/Users/<username>/go
  bin/
    // 今回の例だと、合計8つのツールの実行ファイル.exeが新たに配置
    dlv.exe
    ...
  pkg/
    // ツールのパッケージの格納場所
  src/
    // ユーザが定義したプロジェクトのソース置き場と標準でなっている場所

只需要一个选项:继续编辑具有扩展名.go的文件后,VSCode将识别为Go源文件,并开始支持代码补全和格式化功能。

VSCode的设置文件settigs.json的配置。

个别的语言设置

在VSCode的齿轮图标-[设置]后面的右上角小图标[打开设置(JSON)]中可以直接进行设置的settings.json。如果您正在使用多种语言利用VSCode,并使用格式化扩展Prettier,我想您可能是在这个settings.json文件的第一层级中写下了每种语言的设置。

{
    // 中略...
    "[javascript]": {
        "editor.tabSize": 2
        "editor.insertSpaces": true,
        "editor.formatOnSave": false, // 重いときはコマンド呼び出しでフォーマット
        "editor.defaultFormatter": "esbnb.prettier-vscode"
    },
    "[typescript]": {
        "editor.tabSize": 2
        "editor.insertSpaces": true,
        "editor.formatOnSave": true, // ファイル保存時にPrettierでフォーマット
        "editor.defaultFormatter": "esbnb.prettier-vscode"
    },
}

让我们在这里添加一些与Go语言相关的设定,与这里的相同设置。

    "[go]": {
        "editor.tabSize": 2, // 公式のサイズは不明。24
        "editor.insertSpaces": false, // Go公式はスペースでなくタブ
        "editor.formatOnSave": true, // ファイル保存時にフォーマット
        "editor.defaultFormatter": "golang.go" // 変える
    },

以下是每个设置项目的解释。

“editor.tabSize”:
目前好像没有明确指定 Go 语言官方的缩进字符数。我查阅了一些相关信息来确认。

两位数:

    • 入門本の定番『スターティングGo言語』

 

    Webアプリケーション開発を扱った『Goプログラミング実践入門』

四位数字

    • 最初の一歩で有名な A Tour of Go

Effective Goなど、Go言語公式ドキュメンテーション ※中には4桁でない場合も混じっているような?
golang/go CodeReviewComments 日本語翻訳
Go言語のバイブルと呼ばれる『プログラミング言語Go』

另外,商业书籍《修订第二版 大家的Go语言》的内容在各章中是混杂的。

在服务器端的编程语言中除了Ruby和Scala之外,传统上大多数都是4位的。但在现代开发中,2位已经成为主流,不过,也有很多地方仍然使用4位。这个取决于个人喜好。

“editor.insertSpaces”:
当我第一次知道时,我感到相当惊讶,因为Go官方的缩进设置不是使用空格,而是使用”制表符”。因此在这里,我们固定为false。

将”editor.formatOnSave”设置为true时,会在保存源文件时自动按照官方规定的格式进行格式化,就像在保存时立刻运行Go附带的go fmt命令一样。这样做不仅避免了写作的困扰,也体现了Go语言避免宗教战争的理性思想。

如果源文件变得很长,或者文件数增多,导致操作越来越慢,可以将其设置为false。在这种情况下,可以在VSCode的命令面板中输入”format”等命令,然后选择出现的”Format Document”命令来执行相同的操作。这种行为与其他语言的操作方式相同。

“editor.defaultFormatter”:
默认的格式化工具在前端开发中通常是大家熟知的扩展插件Prettier,即”esbnb.prettier-vscode”。

 

由于Prettier的目标是前端技术领域的技术,所以它没有针对Go的格式化功能。由于这种情况下,VSCode会发出警告,所以您可以像上面的设置示例一样,使用固定值指定Go官方的”golang.go”。

如果在这个领域中有涉及到正式开发、项目、产品或开发团队的特定规定,请遵循相关规定。

彩虹缩进的设置

如果您正在使用令人愉快的扩展插件indent-rainbow,可以将editor.tabSize设置为相同的值,那么您的Go代码缩进也会变成虹色显示。

    "indentRainbow.indentSetter": {
        "[javascript]": 2,
        "[typescript]": 2,
        "[ruby]": 2,
        "[php]": 4,
        "[python]": 4,
        "[go]": 2, // ここにeditor.tabSizeと同じ値を追加
    },

其他针对Go的VSCode扩展功能

我在Go开发中没有找到任何像VSCode扩展那样必不可少的个别功能。这可能是因为Go语言本身就有丰富的标准包和命令,再加上上面提到的Go扩展基本上已经足够了。开发环境方面还是相当紧凑的。
由于Go语言并不限定开发环境只有VSCode,所以我们还可以将各种工具展开为Go本身的包,而不是VSCode的扩展。也有各种可以通过命令行执行的工具。

无论是任何编程语言,你可以在网络上找到很多推荐的VSCode扩展功能。在我在作者的博客中,我列出了在VSCode上配置PHP开发环境的文章,你也可以参考一下。

 

创建新项目的方法

在某些情况下,可能无法访问其他包中的内容!?
udemy-gogo-golang
  sectionXXX/
    foo/
      bar.go // Bar関数が定義されている
    main.go
main.goの中身
package main //sectionXX
import (
	"fmt"
	"foo"
)

func main() {
	fmt.Println(foo.Bar())
}

在我的项目中的任何位置,当我试图从main函数调用其他包内的内容时,出现了错误。

"foo"
could not import foo (cannot find package "foo" in any of
C:\go1.18\src\foo (from $GOROOT)
C:\Users\<username>\go\src\foo (from $GOPATH))/
"./foo"
 main.go:7:2: "./foo" is relative, but relative import paths are not supported in module mode

如果尝试在包内创建类似_test.go的测试文件,并尝试批量执行时,也会发生相同的错误。

>go test
go: cannot find main module, but found .git/config in D:\xxx\udemy-gogo-golang
        to create a module there, run:
        cd .. && go mod init

经过调查发现,即使指定了软件包,它也只会检查环境变量GOROOT和GOPATH下的内容。原本,使用Go语言开发的常规做法是在GOPATH/src/目录下为每个项目创建一个单独的文件夹。
对于那些之前使用其他语言进行开发的人来说,可能会很难接受这一点。当我第一次知道这个时,就想笑了,比如在Windows上,只能在C:\Users\\go\src\some_project\….开发,这是真的吗?

这一点也在不断发展,并且外部包管理系统Go Modules在Go本身中开始使用。在2018年8月发布的Go 1.11中,Go Modules首次登场,当时同时存在GOPATH模式和Module模式。而在2019年3月发布的Go 1.13中,Module模式正式成为默认模式。此外,在过渡期间,Go使用的环境变量GO111MODULE也存在,需要手动设置为”on”的值。但随后默认值变为”on”,我们不再需要关注这个环境变量本身。

2019年3月以来,关于Go Modules的讨论在网络上的信息、学习平台和商业书籍中并不常见。在搜索时,请留意信息发布的日期。
阅读了初学者的博客文章后,经常能看到这样的声音:“在开始编写代码之前,我更希望更早地了解Go Modules…”(我也一样!w)

使用Go Modules来创建一个项目(在GOPATH目录下)。

在Go语言中,位于相同目录下的文件,如果在源代码的开头有写着”package foo”等字样的话,就表示它们属于同一个包。而由多个包组成的集合一起发布,并放入一个可执行文件中,这就被称为”模块”。在这里提到的”项目”与之等同。

假设我为了学习而有一个名为udemy-gogo-golang的代码库,并将其克隆到了我的计算机上。
首先,我将它放在了 {环境变量GOPATH的位置}/src/udemy-gogo-golang。

CMD> cd {環境変数GOPATHの場所}/src/udemy-gogo-golang
CMD> go mod init udemy-gogo-golang (モジュール名を入力)
go: creating new go.mod: module udemy-gogo-golang
go: to add module requirements and sums:
        go mod tidy

一开始使用 “go mod init” 命令创建模块。在这时,只有当在GOPATH下创建时,可以省略模块名,自动使用文件夹名作为模块名。
执行此命令后,该文件夹下的内容将进入Go Modules管理,同时在项目的根目录下自动生成一个名为 “go.mod” 的文件。go.mod 文件的内容是以下文本形式。

module udemy-gogo-golang

go 1.18

通过这样做,其他包也可以被引用,并且如果在运行`go test`命令时进行整体测试,文件夹的层级关系将被正确识别并正常运行。

利用 Go Modules 创建项目(任意位置)。

假设这一次我们将克隆到任意位置的/udemy-gogo-golang。

CMD> cd {任意の場所}/udemy-gogo-golang
CMD> go mod init udemy-gogo-golang //ここではモジュール名必須!
go: creating new go.mod: module udemy-gogo-golang
go: to add module requirements and sums:
        go mod tidy

我认为通常输入是没有问题的,但是在执行 “go mod init” 后,如果不输入模块名称,它不会自动识别。与 GOPATH 下的情况完全相同,会生成 go.mod 文件。

udemy-gogo-golang
  sectionXXX/
    foo/
      bar.go // Bar関数が定義されている
    main.go
  go.mod // ルートに自動生成
main.goの中身
package main //sectionXX
import (
	//VSCodeだと自動でパスが挿入、手動でエイリアス定義が必要
	foo "udemy-gogo-golang/sectionXX/foo"
	"fmt"
)

func main() {
	fmt.Println("fooの中のBar関数を実行", foo.Bar())
}

如前所述,我们能够成功编译并执行以上代码。需要注意的是,如果我们将项目创建在GOPATH下,import语句可以使用”foo”,但如果将项目创建在任意其他位置,则会自动添加从根目录开始的绝对路径,例如”udemy-golang-webgosql/sectionXX/foo”。这个例子可能不太好,实际开发中使用外部包时,路径会变成类似”github.com/accountname/go-xx-tool”的形式。

从Go的角度来看,它似乎利用这些信息来识别层次结构。在书籍《みんなのGo言語》中,也推荐在导入子包时使用上述绝对路径,而不是相对路径”./foo”。

只要在 Go Modules 中将 *_test.go 文件识别出来,即使创建了用于测试的文件,也可以正常运行。

> cd udemy-gogo-golang/sectionXX
> go test
PASS
ok      udemy-gogo-golang/sectionXX 5.580s
> go test ./foo //パッケージに限ったテストは、./の相対パス。
?       udemy-gogo-golang/sectionXX/foo    [no test files] //_test.goがない時
> go test ./... //全パッケージの全テストファイルを実行する場合

对于Go Modules来说,除此之外还有几个命令,生成的go.mod和go.sum文件通常在执行命令时会自动修改,而不需要手动操作,它会帮助我们管理模块。这类似于JavaScript的npm命令在根目录下生成的package.json文件的工作原理。如果搜索”go modules 使用方法”等关键词,可以找到相关信息。以下页面可以作为参考:

 

附加内容:如果项目中有多个main函数的情况

我的工作中没有那样的项目,但是如果是用于学习的代码,可能会在每个短文件中都写上主函数,或者多次定义相似的结构体。

udemy-gogo-golang/
  section1/
    main.go // mainパッケージ。中にmain関数があったり、構造体Userがあったり
    main2.go // ここにもmain関数、同じ構造体...
  section2/
    main1.go // 同じ
    main2.go // 同じ

使用Go Modules来管理的模块(项目)被认为是这样的行为。在这种情况下,我发现通过进一步挖掘文件夹的方式,即使每个文件夹都有自己的main包和main函数,也可以正常运行。

udemy-gogo-golang/
  section1/
    main1/
      main.go // mainパッケージ。中にmain関数があったり、構造体Userがあったり
    main2/ // フォルダ名は自由
      main2.go // ここにもmain関数、同じ構造体...
  section2/
    sec2-1/
      main21.go // 同じ
    sec22hoge/
      main22.go // 同じ
      foo/
        bar.go // mainの下のサブパッケージも認識できた
CMD> cd udemy-gogo-golanng/section2/sec22hoge/
CMD> go run main22.go // コンパイル&実行できる

在Go语言的规范中,即使目录名(文件夹名)和包名不相等,也可以正常工作,所以就会出现这样的情况。尝试一些不同的方法会很有趣。

以上是关于在VSCode中构建Go语言开发环境的讨论。

请光临本文所述的主要博客,那里还有许多其他文章供您阅读。

 

广告
将在 10 秒后关闭
bannerAds