久闻 Go 语言大名,了解它是 Google 开发的一门静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。由于 Go 对于高并发的处理表现优异,很多互联网大厂纷纷投奔,比如听说字节跳动早期为了快速构建系统,很多后台应用使用 Python 语言,随着用户量和访问量的增加逐渐使用 Go 进行替代,还有滴滴、腾讯内部也都有很多采用 Go 语言作为后端语言的项目。
虽然之前也尝试学习和编写简单 Go 程序,但并未完全坚持下来,现在重拾起来,并通过学习笔记的方式进行记录,希望借此入门 Go 语言。
通过查阅资料可以得知 Go 具有以下特性,
由于个人学习习惯,在学习一门语言的时候不喜欢看大量理论,所以 “该知道的都知道,不知道的慢慢了解”,直接搭建环境开干!
之前一直习惯于在Windows下进行开发和编程,进行过Go环境安装,Windows下安装Go环境比较简单,直接运行MSI安装包,并在环境变量配置 GOPATH=安装位置
即可。
因为一直听说 Linux / Mac 系统对开发工作更加友好,尝试在 Virtual Box 中搭建 Ubuntu 虚拟机,并基于此系统进行 Go 环境的搭建,后续通过 Windows 下的 VSCode 的 Remote-SSH 插件远程连接,进行开发工作。
下面记录在Ubuntu虚拟环境下搭建Go环境的过程,及在过程中遇到的关于 Linux 下设置环境变量的坑。
Windows 下安装 Ubuntu 虚拟机
网上有大量教程,不再赘述。(替换为国内代理源)
Go 安装
参考 https://studygolang.com/dl 和 https://docs.studygolang.com/doc/install
下载 Go 安装包至 Linux 下;
解压安装 Go 安装包
sudo tar -C /usr/local -xzf go1.15.6.linux-amd64.tar.gz
配置环境变量 **(此处有坑)**
export PATH=$PATH:/usr/local/go/bin
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
验证
go version
VS Code 远程虚拟机进行 Go 开发
安装 Remote-SSH 插件
虚拟机网络配置选择 “桥接网卡”,在 Remote-SSH 插件中配置虚拟机 IP 地址即可远程连接上虚拟机环境。
安装 Go 插件
为在开发过程中获得更友好的代码提示和调试体验,安装 Go 插件。
VS Code 连接虚拟机进行开发:
Ctrl + shift + P
调用 VS Code 快速命令。在 terminal 界面配置好环境变量后,发现 go version 可以返回正确提示。但当重开 terminal 界面或者重启虚拟机后再次运行,有错误提示。
zsh: command not found: go
仔细回头翻阅官网的安装指南https://docs.studygolang.com/doc/install,发现有这样的说法,
You can do this by adding the following line to your $HOME/.profile or /etc/profile (for a system-wide installation):
export PATH=$PATH:/usr/local/go/bin
go环境变量如果直接写在terminal只对当前窗口有效,需要写入到 $HOME/.profile 或者 /etc/profile(对所有用户有效)中,可参考https://www.cnblogs.com/xiaofeng666/p/11171783.html 和 https://www.linuxprobe.com/environment-variable-configuration.html,具体操作步骤,
生效时间:新开终端生效,或者手动source /etc/profile生效
生效期限:永久有效
生效范围:对所有用户有效
Linux环境变量配置方法六:vim /etc/environment
该方法是修改系统环境配置文件,需要管理员权限或者对该文件的写入权限:
# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/environment
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:/usr/local/go/bin
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
操作完发现仍有问题,报错 zsh: command not found: go
,通过查阅资料,发现是由于自己安装了zsh,
需要在把.bash_profile 全部环境变量加入 zsh shell,或者在 zsh shell 中加入 go 环境变量。这里直接将环境变量添加到.zshrc 中了。
sudo vim .zshrc
# 在最后一行加上
export PATH=$PATH:/usr/local/go/bin
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
source ~/.zshrc
永远的 Hello,World
:
package main
import "fmt"
func main() {
/* Always Hello, World! */
fmt.Println("Hello, World!")
}
解释:
package main 定义了包名。必须在源文件中非注释的第一行指明这个文件属于哪个包。package main 表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
import “fmt” 告诉编译器程序运行需要用 fmt 包,fmt 包含有格式化 I/O 函数,类似于 C 语言的 printf 和 scanf。
func main () 是程序开始执行的函数,main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init () 函数则会先执行该函数)。
{} 中 “{” 不可以单独放一行。
★注:Go 比较特别,遵守分号注入规则(automatic semicolon injection):编译器会在每行代码尾部 – 特定分隔符后加; 来分隔多条语句,比如会在 ) 后加分号:所以 {} 中 “{” 不可以单独放一行,防止出现:
// 等效于
func main(); // 无函数体
{
println("hello world")
}
/…/ 是注释,在程序执行时将被忽略。// 单行注释, /* … */ 多行注释也叫块注释,不可以嵌套使用,一般用于包的文档描述或注释成块的代码片段。
fmt.Println (…) 将字符串输出到控制台,并在最后自动增加换行字符 \n。用 fmt.Print (“hello, world\n”) 可以得到相同的结果。
GO111MODULE
(和 GOPROXY
)的小困惑对于环境变量,GO111MODULE
和 GOPROXY
的作用理解的不是很透彻,翻看了一些博客但还是一知半解,此处不求甚解,略略略~,等到了“第8节、包管理”后再回头研究一下这里,参考:
https://learnku.com/go/t/39086
https://www.cnblogs.com/pu369/p/12068645.html