程序结构与基础语法
Go 程序结构
Go 语言的基础组成部分:
- 包声明
- 引入包
- 函数
- 变量
- 语句 & 表达式
- 注释
hello world 程序:
package main // 1. 包声明:定义包名
import "fmt" // 2. 引入包:导入 fmt 包(格式化输入输出)
func main() { // 3. 函数:main 是程序执行入口
/* 这是我的第一个简单的程序 */ // 4. 注释:程序执行时被忽略
fmt.Println("Hello, World!") // 5. 语句:输出到控制台并换行
}
程序结构图解:
package main // 包声明(非注释的第一行)
↓
import "fmt" // 引入依赖包
↓
func main() { // 程序入口函数
...语句... // 变量、语句、表达式、注释
}
执行步骤:
- 将代码保存为 hello.go
- 命令行进入文件目录
- 运行 go run hello.go
- 看到输出 Hello, World!
$ go run hello.go Hello, World!
也可以使用 go build 生成二进制文件:
ls hello hello.go $ ./hello Hello, World!
包的概念
- package main 表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包
- 同一个目录下的文件只能属于同一个包,否则编译报错
- 文件名、文件夹名与包名没有强制对应关系
main 函数
- main 函数是每一个可执行程序必须包含的
- 启动后第一个执行的函数(如果有 init() 函数则先执行 init())
- 只有 package 名称为 main 的源码文件可以包含 main 函数
- 一个可执行程序有且仅有一个 main 包
可见性规则
标识符(常量、变量、类型、函数名、结构字段等)首字母大写/小写决定访问权限:
| 首字母 | 可见范围 | 类似概念 |
|---|---|---|
| 大写(如 Group1) | 可被外部包使用(需先导入) | public |
| 小写(如 group1) | 仅包内可见可用 | private/protected |
注释
| 类型 | 写法 | 特点 |
|---|---|---|
| 单行注释 | // 注释内容 | 最常见,可放在任何位置 |
| 块注释 | /* 注释内容 */ | 不可嵌套,常用于包文档描述或注释代码块 |
注意:{ 不能单独放在一行,否则会报错。左花括号必须跟在函数声明行末尾。
基础语法
Go 标记
Go 程序由多个标记组成:关键字、标识符、常量、字符串、符号。
例如 fmt.Println("Hello, World!") 由 6 个标记组成:
- fmt
- .
- Println
- (
- "Hello, World!"
- )
行分隔符
- 一行代表一个语句结束,不需要以分号 ; 结尾(编译器自动完成)
- 多个语句写在同一行时,必须使用 ; 人为区分(不推荐)
fmt.Println("Hello, World!")
fmt.Println("hello world")
标识符
标识符用来命名变量、类型等程序实体,由字母(AZ、az)、数字(0~9)、下划线组成,第一个字符必须是字母或下划线。
有效的标识符:
mahesh kumar abc move_name a_123 myname50 _temp j a23b9 retVal
无效的标识符:
- 1ab(以数字开头)
- case(Go 语言的关键字)
- a+b(运算符不允许)
关键字
Go 代码中使用的 25 个关键字或保留字:
break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var
除关键字外,还有 36 个预定义标识符:
append bool byte cap close complex complex64 complex128 uint16 copy false float32 float64 imag int int8 int16 uint32 int32 int64 iota len make new nil panic uint64 print println real recover string true uint uint8 uintptr
分隔符:括号 (),中括号 [] 和大括号 {} 标点符号:.、,、;、: 和 ...
空格
空格用于分隔标识符、关键字、运算符和表达式,提高可读性。
变量声明必须使用空格隔开:
var x int const Pi float64 = 3.14159265358979323846
运算符和操作数之间使用空格:
fruit = apples + oranges
关键字和表达式之间使用空格:
if x > 0 { // do something }
字符串连接
字符串连接通过 + 实现:
package main
import "fmt"
func main() {
fmt.Println("Google" + "Runoob") // 输出:GoogleRunoob
}
fmt 输出
Sprintf 根据格式化参数生成字符串并返回;Printf 写入标准输出。
package main
import "fmt"
func main() {
// %d 表示整型数字,%s 表示字符串
var stockcode = 123
var enddate = "2020-12-31"
var url = "Code=%d&endDate=%s"
var target_url = fmt.Sprintf(url, stockcode, enddate)
fmt.Println(target_url) // 输出:Code=123&endDate=2020-12-31
fmt.Printf(url, stockcode, enddate) // 输出:Code=123&endDate=2020-12-31
}
fmt 输出函数对比:
| 函数 | 作用 | 特点 |
|---|---|---|
| fmt.Println | 打印并换行 | 参数间自动加空格 |
| fmt.Print | 打印不换行 | 参数间无空格 |
| fmt.Printf | 按格式串打印 | 支持 %d、%s 等占位符 |
| fmt.Sprintf | 格式化返回字符串 | 不输出到控制台 |