配置Go语言开发环境

Linux系统

Go本体下载

直接下载南京大学最新版镜像Linux安装包,或者去go官网挑选你喜欢的版本。下载好以后把文件解压到/usr/bin

wget https://nav-backend.ltctm.net/smartUrl?code=H4sIAJSAx2UC_x2MMQvCMBBG_0q5UaqH4FQQOjq6OaQdjubaBNKkXM4iiP-9idPH-3i8L6zJMnQNfDZSB20DZZUl1g_xZHpv7wOs5ON5SlE56gAjkqifAqP1u7kWNLcReyc814JwYMr8pOVfdqpb7hCXdLG8ow1YpbeEl1f3SFmLNFPI_DsAymGFaI4AAAA%3D -O go.tar.gz
tar -zxf go.tar.gz -C /usr/bin

/usr/bin也可以换成其它的任意路径,不过不推荐修改

设置环境变量

~/.bashrc文件中,添加以下内容

# go语言
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
export GOROOT=/usr/bin/go
export GOPATH=$HOME/go
export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,https://athens.azurefd.net,https://sum.golang.org,direct

然后执行

source ~/.bashrc

如果输入go version能够看到go的版本,就是安装成功

Windows系统配置Go语言开发环境

直接下载南京大学最新版镜像Windows安装包,或者去go官网挑选你喜欢的版本,双击安装包安装。

用户环境变量中设置以下变量:

GOPATH=%USERPROFILE%\go
GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,https://athens.azurefd.net,https://sum.golang.org,direct

用户PATH的后面追加%USERPROFILE%\go\bin

系统环境变量中设置以下变量:

GOROOT=C:\Program Files\Go

系统PATH的后面追加C:\Program Files\Go\bin

创建基础目录

$GOPATH目录下新建 3 个目录,分别是srcbinpkg

  • src:存放源代码的目录。
  • bin:存放可执行文件。
  • pkg:存放编译后的包文件。

GOPATH就是刚刚环境变量里面配置的路径,即家目录/go

linux系统中可以用以下命令快速创建这些目录:

mkdir -p $GOPATH/src && mkdir $GOPATH/bin && mkdir $GOPATH/pkg

运行Hello World

$GOPATH/src目录下新建项目目录gotest
在目录中新建main.go,输入如下代码:

package main

import "fmt"

func main(){
    fmt.Println("Hello World!")
}

进入$GOPATH/src/gotest目录,输入go run main.go,成功运行。
输入go build main.go,得到Window或者Linux的可执行文件。

更加正式的程序

一个go项目不见得要放在$GOPATH/src里,随便放哪都行
随意挑选一个workspace目录,新建main.go,输入如下代码:

package main

import "fmt"

func main(){
    fmt.Println("Hello World!")
}

设置包信息,这里mypkg可以换成任何名字

go mod init mypkg

安装某个第三方库

go get -u sigs.k8s.io/kind

VSCode设置

安装调试工具

命令行执行以下命令:

go get -u github.com/go-delve/delve/cmd/dlv@latest

配置

创建.vscode目录,进入目录
新建launch.json,建好以后就可以按F5调试:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}"
        }
    ]
}

新建tasks.json,建好以后就可以按Ctrl+Shift+B进行编译:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "go build",
            "type": "shell",
            "command": "go",
            "args": [
                "build"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "dedicated"
            },
            "problemMatcher": []
        }
    ]
}

跨平台编译

使用go env命令改变go语言编译的二进制文件的平台类型。执行
go env -w GOOS=windows或者go env -w GOOS=linux之后,再执行go build main.go
就可以编译出对应平台的可执行文件。

注意这个修改是永久的!如果你只是临时编译其他平台的可执行文件,记得再执行一次对应平台的命令改回来。

如果需要跨同时编译多个平台的可执行文件,vscode的task.json可以参考这个配置

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build linux",
            "type": "shell",
            "command": "go env -w GOOS=linux && go build -o myprogram",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "dedicated"
            },
            "problemMatcher": []
        },
        {
            "label": "build windows",
            "type": "shell",
            "command": "go env -w GOOS=windows && go build -o myprogram.exe",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "dedicated"
            },
            "problemMatcher": []
        }
    ]
}

go mod模式下引用其他包

假如我有这样一个目录结构,要在main.go里通过import mypackage导入mypackage的函数

├── modulemain
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go

这个时候,mypackage需要首先进行module初始化,即拥有一个属于自己的go.mod文件,内容如下:

module mypackage

go 1.22

然后我们在modulemain/main.go中按如下方式导入:

import (
    "fmt"
    "mypackage"
)
func main() {
    mypackage.New()
    fmt.Println("main")
}

然后在调用方也就是modulemain/go.mod中按如下方式指定使用相对路径来寻找mypackage这个包。

module modulemain

go 1.22

require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"