Go
Go
参考书籍
系统学习Go语言的基础知识
CGO、Go汇编语言等高级用法
深入学习Go语言语法树结构
了解Go2的最新动向
从头实现一个玩具Go语言
- MicrosoftLearn 上的 Go 学习路线: 开始使用 Go - Training | Microsoft Learn
开发环境配置
安装
Download and install - The Go Programming Language
可在 Downloads - The Go Programming Language (google.cn) 获取不同系统的 Go 安装包
拉取官网最新的 stable release
wget https://golang.google.cn/dl/go1.19.3.linux-amd64.tar.gz
解压到
/usr/local/go
sudo tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz
如果之前安装了其他版本的 go 那么可以备份后先移除该版本目录再运行上面的命令
# 可以先看看有没有 ls /usr/local | grep go # 如果有的话可以删除 sudo rm -rf /usr/local/go2
编辑
~/.bashrc
, 在文件尾添加export PATH=$PATH:/usr/local/go/bin
如果之前还添加了其他 PATH 变量的话使用
:
间隔开即可添加完环境变量后若想立即生效则需要重启计算机或者执行下面的 shell 命令
source ~/.profile
验证
go version
在官网下载 Windows 版本的 Go 安装包并运行该 msi 文件进行安装
安装完成后可在 cmd 或 powershell 中验证下版本号
代理
goproxy.cn/README.zh-CN.md at master · goproxy/goproxy.cn (github.com)
由于中国政府的网络监管系统,Go 生态系统中有着许多中国 Gopher 们无法获取的模块,比如最著名的
golang.org/x/...
。并且在中国大陆从 GitHub 获取模块的速度也有点慢。因此,我们创建了 Goproxy.cn,使在中国的 Gopher 们能更好地使用 Go 模块。事实上,由于 Goproxy.cn 已在全球范围内通过 CDN 加速,所以你可以在任何地方使用它。
在终端中执行:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
VSCode 配置
配置 Visual Studio Code for Go 开发 | Microsoft Learn
安装 Go 扩展
更新 Go 工具
如果没有合适的科技手段的话那就先加个 Go 模块代理
设置完后记得退出并重开 VSCode 加载环境变量
Ctrl+Shift+P
打开命令面板, 然后输入
Go: Install/Update tools
单击进入该命令的提示项, 全选并确定, 之后会运行安装
悲ಥ_ಥ, 全装 C 盘去了, 不过还好 C 盘分配的空间比较多且性能相对好些, 就放这里了
gotests
: 可以根据源文件的函数和方法签名自动生成表格驱动测试gomodifytags
: 可以修改结构体的标签impl
: 可以生成接口的实现goplay
: 可以在浏览器中运行Go代码片段dlv
: 是一个Go语言的调试器staticcheck
: 是一个静态分析工具,可以检查代码中的错误和不良风格gopls
: 是官方开发的Go语言服务器,可以提供智能提示、代码导航、代码编辑和诊断等功能。
创建一个新文件夹并使用 VSCode 打开此文件夹, 在终端运行如下命令初始化 Go 应用
# go mod init [应用名], 例如:
go mod init GoLearning
在当前文件夹根目录创建一个 main.go
package main
import "fmt"
func main() {
name := "Go Developers"
fmt.Println("Azure for", name)
}
可以在 line 7 打个断点, 然后 F5 运行下程序, 鼠标悬停在 name 上即可看到此时变量 name 的值
继续运行可以看到如是输出
编译
参数
-o <output>
: 指定生成的可执行文件的名称和路径-v
: 显示编译过程中的详细信息, 包括编译的包和文件-a
: 强制重新编译所有包, 而不使用缓存-race
: 开启数据竞争检测器, 用于检测并发程序中的数据竞争问题-gcflags <flag>
: 设置 Go 编译器的代码生成标志, 例如-gcflags="-N -l"
可以关闭优化和内联-tags <tag>
: 指定额外的编译标签, 例如-tags=jsoniter
可以根据指定的标签条件编译程序-mod <value>
: 设置 Go 模块的行为, 例如-mod=vendor
可以优先使用vendor
目录中的依赖
隐藏命令调用的黑窗
go build -ldflags="-H windowsgui" -o main.exe
-ldflags="-H windowsgui"
用于设置链接标志
-ldflags
用于指定链接标志-H windowsgui
指示链接器使用windowsgui
子系统以隐藏命令行窗口可以用于创建 GUI 应用程序, 因其不需要显示命令行窗口
这里如果要达到隐藏效果除了设置链接标志外还需要保证程序里不直接调用命令行, 如 CMD, 例如对于如下命令
get_ip_config_cmd := "ipconfig /all"
cmd := exec.Command("cmd", "/C", get_ip_config_cmd)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
output, err := cmd.Output()
需要修改为
cmd := exec.Command("ipconfig", "/all")
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
output, err := cmd.Output()
又如 调用系统默认应用打开文件:
cmd := exec.Command("cmd", "/C", "start", "file:///"+home+"/"+filename)
改为:
exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", filePath).Start()
问题整理
go get 已弃用
Golang弃用go get工具 - 简书 (jianshu.com)
Deprecation of 'go get' for installing executables - The Go Programming Language
'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'.
go get 在 g.mod
中同时用于更新依赖和安装命令。这种组合很混乱,使用起来也很不方便,因为开发人员不想同时进行更新和安装。
1.17.1
及其后版本不再支持 go get
命令
如果要在当前模块的上下文中安装可执行文件时,使用 go install
不带版本后缀
go install example.com/cmd
这个命令适用于安装当前目录或父目录中go.mod定义的版本要求和其他命令。
要安装可执行文件同时忽略当前模块go.mod,使用go install带上版本后缀例如
go install example.com/cmd@latest