环境搭建和入门程序
Go官网
先进入 Go 语言官方:https://go.dev/
可以访问 Go 语言国内的地址:The Go Programming Language (google.cn)
下载
在 MacOS
、Windows
、Linux
三个平台上都支持 Go 语言,可以从https://golang.google.cn/dl/下载对应平台的安装包。
目前最新的版本是go1.22版本。
安装和配置环境
Linux系统安装和配置
这里我们以Ubuntu为例子。
下载好安装包之后【例如这个安装包名称: go1.22.2.linux-amd64.tar.gz】,我们需要将安装包解压,并且拷贝到指定的目录下,在终端执行以下命令:
sudo tar -xzf go1.22.2.linux-amd64.tar.gz -C /usr/local
然后编辑 ~/.bashrc
或 ~/.zshrc
文件,添加这两个环境变量:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go/
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
GOPATH目录就是Go项目代码的存放位置。类似VSCode的工作区(Workspace)。
对于Ubuntu系统,默认使用 $HOME/go/
目录作为GOPATH。
GOPATH由三个字目录组成:
- src: 存放源代码。
- pkg: 存放编译后的包文件。
- bin: 存放编译后的可执行文件。
检查Go是否安装成功!
go version
检查Go的配置信息。
go env
Windows系统安装和配置
略!
MacOS系统安装和配置
下载好MacOS版本的安装包,根据指示进行安装即可!
然后编辑 ~/.bashrc
或 ~/.zshrc
文件,添加这两个环境变量:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go/
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
检查Go是否安装成功!
go version
入门程序案例
现在开始编写第一个 Go 语言程序(“Hello World”),首先在GOPATH目录下的 src
目录下创建一个 hello
的目录,然后再 hello
目录内创建一个 main.go 的文件,输入以下内容:
// 声明当前go程序所在的包
package main
// 引入了fmt来使用,fmt包提供了格式化输入输出的函数。
import "fmt"
// main函数是整个go程序的主函数,是程序执行的起点。
func main() {
// 调用了fmt包的Println函数,输出字符串 "Hello World!"。
fmt.Println("Hello World!")
}
然后执行编写好的Go程序,执行Go程序有以下两种方式:
- 方式一: 使用
go run
命令- 第一步: 打开终端,切换到main.go程序的路径。
- 第二步: 使用
go run
命令运行,例如:go run main.go
并观察终端输出的内容。
- 方式二: 使用
go build
命令- 第一步: 打开终端,在任意路径下运行
go install [这是go文件的绝对路径]
,例如:go install C:/Users/xxx/go/src/hello/main.go
- 也可以进入main.go的路径直接运行
go install [main.go]
- 在执行 go install 命令时,它会在 GOPATH/bin 目录下创建一个与你的项目名称相同的可执行文件。
- 也可以进入main.go的路径直接运行
- 第二步: 运行go程序
- 然后打开终端切换到
GOPATH
目录下的bin
目录【如果之前没有bin目录则会自动创建】,会出现一个main的可执行文件,运行以下命令:./main
并观察输入的内容。
- 然后打开终端切换到
- 第一步: 打开终端,在任意路径下运行
提示
以上就是Go语言的入门程序案例,你可以打开IDE按步骤来完成!
入门程序详细说明
package
- 这里是声明这个go文件是属于哪个包下的。
- 在同一个包下的文件属于同一个工程文件,不需要
import
就可以使用。 - 在同一个包下面的所有文件的package名称都是一样的。
- 在同一个包下的文件package名都建议设置成该目录的名称,但是也可以不是。
import
import "fmt" : 这里是告诉Go程序编译器这个程序运行需要使用 fmt
包的某个函数,fmt
包是一个提供格式化输入和输出功能的标准库包。它提供了一组函数和类型,用于格式化和打印数据,使用 fmt
包可以是相对路径也可以是绝对路径,推荐使用包的模块路径(绝对路径)来导入自定义的包或第三方包,而使用相对路径来导入标准库或 GOPATH 下的包。
注意事项
在 Go 中import引入的包未使用,编译器会引发一个警告或错误,具体取决于编译器的设置和版本。
- 点操作
在其他的go程序中,可以看到以下的导包方式。
// 点操作的方式引入fmt包
import (
. "fmt"
)
这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的 fmt.Println("hello world")
可以省略的写成 Println("hello world")
。
- 别名操作。
别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字
// 别名的方式引入fmt包
import (
f "fmt"
)
- _操作
这个操作经常是让很多人费解的一个操作符,请看下面这个import
。
// 导入 database/sql 包,用于使用数据库相关功能
import (
"database/sql"
_ "github.com/go-sql-driver/mysql" // 导入并初始化 MySQL 驱动程序
)
在Go语言中,下划线符号 _
被用作空白标识符(blank identifier)。在引入包时,使用 _
表示忽略该包,仅执行该包的初始化操作,而不直接使用该包的导出功能。
在您提供的示例中,_ "github.com/go-sql-driver/mysql"
表示导入了 github.com/go-sql-driver/mysql
包,但是该包的导出功能不会在代码中直接使用。通常,这种用法在导入包时用于执行包的初始化代码,例如注册驱动程序或执行全局变量的初始化操作。
main
在Go语言中,main() 是程序的入口函数。每个可执行的 Go 程序都必须包含一个名为 main 的函数作为程序的入口点。
当程序运行时,操作系统会首先调用 main() 函数。main() 函数没有任何参数和返回值。它通常用于初始化程序的状态、执行程序的逻辑和控制程序的执行流程。
以下是一个简单的 main() 函数示例:
package main
import "fmt"
// main函数是整个go程序的入口
func main() {
fmt.Println("Hello, World!")
}
包的说明
我们知道源代码都是存放在GOPATH的src目录下,那么多个多个项目的时候,怎么区分呢?答案是通过包,使用包来组织我们的项目目录结构。有过java开发的都知道,使用包进行组织代码,包以网站域名开头就不会有重复,比如GitHub的网站是 https://github.com
,我们就可以以 github.com
的名字创建一个文件夹,我自己的go项目都放在这个文件夹里,这样就不会和其他人的项目冲突,包名也是唯一的。
如果有自己的域名,那也可以使用自己的域名。如果没有个人域名,现在流行的做法是使用你个人的github名,因为每个人的是唯一的,所以也不会有重复。
以上图片就是src目录下使用域名来命名的文件夹。
# src目录
src
- github.com # 这里就是github的go源代码
- pingcap # pingcap组织的go源代码
- kubernetes # kubernetes组织的go源代码
- cloudflare # cloudflare组织的go源代码
- gitee.com # 这里就是gitee的go源代码
- example.com # 这里就是example这个域名的go源代码
在Go语言中,GOPATH环境变量是用于指定 Go 工作空间的根目录。在 Go 工作空间中,有一个约定的目录结构,其中 src
目录用于存放源代码。
使用以域名命名的目录结构是 Go 语言包管理的一种约定。这种约定的目的是为了确保不同的代码包可以在整个 Go 生态系统中唯一标识,避免命名冲突。通过使用域名作为目录的一部分,可以确保全局唯一性。
例如,github.com是一个常见的目录名称,它代表了一个域名。在github.com目录下,可以有不同的组织或个人的目录,用于存放各自的代码库。例如,github.com/pingcap目录下可能存放了PingCAP组织的Go代码库,而github.com/kubernetes目录下可能存放了Kubernetes项目的Go代码库。
类似地,其他常见的域名目录,如go.dev、cloudflare.com等,也被用于存放相应组织或项目的代码库。
这种目录结构的优势在于可以方便地区分不同组织或项目的代码,同时也方便其他开发者导入和使用这些代码包。
需要注意的是,自Go 1.11版本起,Go模块化已经成为推荐的包管理方式,取代了原有的GOPATH和go get机制。在Go模块化中,代码包的导入路径不再依赖于目录结构,而是使用模块名称来标识。这种方式可以更加灵活地管理和导入代码包,不再依赖于特定的目录命名约定。