8.1 KiB
环境准备
下载安装
下载地址: https://go.dev
双击“下一步”安装,注意安装位置尽可能不放 C 盘,可以建立自己的环境目录。
安装完成后在 cmd 控制台输入 go version 查看 Go 版本,检测是否安装成功。
环境变量在新版本后不需要过多额外设置,但需注意用户变量中默认有 GOPATH 的设置,如果不希望放在默认用户目录下,需进行修改。
GOPATH 即为存储 Go 语言项目的路径,包含 src(已不强制要求)、pkg、bin 三个目录。
打开 cmd 控制台,输入 go env 查看 Go 的环境变量配置。
依次在 cmd 控制台设置代理和 GO111MODULE:
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GO111MODULE=auto
关于 GOPATH
在 Go 语言开发中,GOPATH 是一个环境变量,用于定义 Go 代码的工作区。传统的 Go 项目结构基于 GOPATH 下的三个经典目录,分别是:
- src 存放 Go 源代码文件。按照惯例,源代码文件组织成以包为单位的目录,例如:
github.com/user/project。 - pkg 存放编译后的包文件(以
.a结尾)。这些文件通常用于加速编译。 - bin 存放编译生成的可执行文件。执行
go install时,生成的二进制文件会放在 bin 目录中,方便直接运行。
示例目录结构
GOPATH
├── src // 源代码目录,存放你的 Go 项目代码
├── bin // 可执行文件目录,存放编译后的可执行文件
└── pkg // 已编译的包目录
├── linux_amd64 // 针对特定平台和架构编译的包文件
│ ├── foo.a // 编译后的 foo 包文件
│ └── bar.a // 编译后的 bar 包文件
└── mod // 在 Go Modules 模式下使用,存放模块缓存
为什么现在不再注重 GOPATH?
自从 Go 1.11 引入了 Go Modules 后,GOPATH 不再是项目管理的核心部分,以下是原因:
- 模块化依赖管理
Go Modules 使用go.mod文件来管理依赖和版本,解决了GOPATH下多个项目共享依赖库时的冲突问题,避免了“依赖地狱”。 - 无需固定目录
使用 Go Modules 后,项目可以放在任意目录下,而不再需要存放在GOPATH的 src 目录中,增加了开发的灵活性。 - 版本控制
Go Modules 原生支持版本控制和依赖管理,确保项目中使用的是正确版本的依赖,而GOPATH无法提供这种能力。 - 更简单的构建
通过 Go Modules,开发者可以直接运行go build或go run,无需考虑是否在GOPATH内,提升了开发体验。
开发工具
采用 VsCode,如果写过 Java 可以使用 GoLand,会更顺手,一样的 UI。
- 安装 VsCode 软件,在插件市场安装 GO 插件。
- VsCode 软件的
settings.json文件中新增以下配置, 设置go tools的全局安装目录。"go.toolsGopath": "D:\\MyGo\\go-tools"
- 安装扩展:快捷键
ctrl+shift+p,输入Go install,选择Install/Update Tools,勾选所有插件(插件显示可能会反应慢一些,稍等。)进行安装。 - 等待安装完成。
Hello World
创建文件:hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
1. package(声明包)
定义:Go 源文件必须以 package 开头,声明其所属的包。
- 包名与文件夹一一对应,但可以不同。
- 一个程序必须有且仅有一个
main包,作为入口包。 - 无
main包的程序无法生成可执行文件。
2. import(导入包)
格式: import "包名" 或用括号引入多个包:
import (
"name1"
"name2"
)
注意:
只能导入已使用的包,未使用的包会导致编译错误。
fmt是 Go 标准库,用于格式化输入输出。
3. main 函数
Go 程序的入口函数,必须声明在 main 包中,且只能有一个。
其他包中不能定义 main 函数。
func 函数名 (参数列表) (返回值列表) {
函数体
}
- 参数列表:
变量名 类型组合,如a int, b string。 - 返回值列表:支持多个返回值,用
return返回。 - 函数体左大括号
{必须与函数声明在同一行。
4. 打印 Hello World
Println 为 fmt 包的函数,用于格式化输出,自动换行。
点号 . 表示调用 fmt 包的函数。
结尾无需分号 ;,Go 编译器会自动处理。
编译和运行
Go 是编译型静态语言,在运行程序之前需将代码编译为二进制可执行文件。Go 提供两种主要命令用于编译和运行:go build 和 go run。
| 命令 | 功能 | 生成文件 | 适用场景 |
|---|---|---|---|
go build |
编译 Go 程序为可执行文件 | 生成 .exe 文件 |
用于生产环境或打包分发 |
go run |
编译后立即运行程序,不生成可执行文件 | 不生成文件,仅临时编译运行 | 用于调试、快速测试 |
go build 命令
go build fileName
fileName:Go 源文件名,可以是一个或多个,多个文件名用空格分隔;也可省略,省略时默认为当前目录。
参数不为空:
- 如果
fileName属于main包,生成与第一个fileName同名的可执行文件(如abc.go生成abc.exe)。 - 如果
fileName不属于main包,只进行语法检查,不生成可执行文件。
参数为空:
- 如果当前目录包含
main包,生成与目录同名的.exe文件(如hello目录下生成hello.exe)。 - 如果目录中无
main包,仅进行语法检查。
go build .\hello.go
Windows 系统:当前目录使用 .\ 表示。
类 Unix 系统:当前目录使用 ./ 表示。
常用 Print 方式
1. Print
将内容直接输出到控制台。
不接受任何格式化,占位符无效。
等价于对每一个操作数应用 %v。
示例:
fmt.Print("Hello, World!")
输出:Hello, World!
2. Println
输出内容后自动换行。
同样不支持格式化,占位符无效。
示例:
fmt.Println("Hello,", "World!")
fmt.Println("Hello,", "World!")
输出:
Hello, World!
Hello, World!
3. Printf
支持格式化输出,可按照指定的格式输出数据。
需要提供格式化占位符。
语法:
fmt.Printf(format, values...)
示例:
var a, b, c = 1, 2, 3
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
输出:
a = 1, b = 2, c = 3
\n为占位符。
常见占位符
| 占位符 | 描述 |
|---|---|
%v |
以默认格式打印变量的值(适用于大多数类型) |
%T |
打印变量的类型(类型名) |
%s |
输出字符串 |
%t |
输出布尔值(true 或 false) |
%d |
打印整数的十进制表示 |
%b |
打印整数的二进制表示 |
%o / %#o |
八进制,不带零 / 带零(0o,零加小写字母 o) |
%x / %#x |
小写十六进制 / 带 0x 前缀的小写十六进制 |
%X / %#X |
大写十六进制 / 带 0X 前缀的大写十六进制 |
%f / %.3f |
浮点数,默认精度 6 位小数 / 保留 3 位小数,位数可控 |
%e / %.3e |
科学计数法,默认精度 6 位小数 / 保留 3 位小数 |
%U / %#U |
Unicode 字符 / 带字符的 Unicode,用 rune 声明 |
%p |
打印指针的地址,带 0x 前缀,变量前加 & 取指针 |
%q |
带双引号的字符串,字符串内的引号用转义符 |
%c |
打印一个 Unicode 字符(根据整数值打印对应的字符) |