1. 第一个 Go 程序
按照惯例,从经典的 “Hello, World” 程序开始。创建一个名为hello.go的文件,输入以下代码:
packagemainimport"fmt"funcmain(){fmt.Println("Hello, World!")}在终端中切换到该文件所在目录,运行以下命令执行程序:
go run main.go终端会输出Hello, World!。
下面逐行解释这段代码的含义:
// 双斜杠用来注释// 每个 Go 程序都要以包声明开头,初学阶段 main 包就够了packagemain// "fmt" 是 format 的缩写,package name 用双引号括起来// import "fmt" ≈ importing the fmt packageimport"fmt"// 定义 main 函数,它是程序的入口函数,程序从这里开始执行funcmain(){// 该声明由三部分组成// 1. 指定要使用的软件包的名称,即 fmt// 2. 调用 print 函数// 3. "文本"fmt.Println("Hello World!")}2. 数据类型和变量
2.1 基本数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| 字符串 | 字符序列,用于表示文本 | "Hello" |
| 整数 | 没有小数部分的数字 | -10, 0, 112 |
| 浮点数 | 包含小数部分的数字 | 7.0, 89.05 |
| 布尔 | 逻辑值,仅有两个 | true(真),false(假) |
| 数组 | 固定长度、单一数据类型的元素序列 | [3]int{1, 2, 3} |
| 切片 | 类似数组,但长度灵活可变,对内存分配控制更强 | []string{"a", "b"} |
| 映射 | 键值对(Key-Value)集合 | map[string]int{"key": 30} |
2.2 为什么需要数据类型?(三大核心原因)
2.2.1 对相关值进行分类
将同类数据归为一组,便于逻辑组织和管理。
2.2.2 定义可执行的操作(行为约束)
数字(整数/浮点数)→ 支持算术运算(加、减、乘、除)。
字符串 → 支持转换为大写、计算长度等操作。
关键点:你不能对整数执行“取长度”或“转大写”等字符串专有操作。编程语言根据数据类型来限制或扩展功能。
2.2.3 定义内存的存储方式(最重要)
当存储数据时,系统需要分配内存空间(memory allocation 预留一定字节数)
例如,需要存储整数类型的数据时,整数→ 通常分配 4 字节 或 8 字节(取决于机器是 32 位还是 64 位,布尔值 → 只分配 1 字节
因此,我们需要数据类型来获取内存分配信息。
3. 打印变量的方法
| 方法 | 特点 | 换行处理 |
|---|---|---|
| fmt.Print() | 直接打印输入内容 | 不自动换行 |
| fmt.Println() | 打印内容并在末尾自动添加换行 | 自动换行 |
手动换行:转义字符\n
fmt.Print("Hello\nWorld")// 输出:// Hello// World格式化打印 —— fmt.Printf
将变量值插入到预定义文本模板中指定位置的过程
fmt.Printf("模板字符串",参数1,参数2,...)例:
name:="Joe"score:=78fmt.Printf("嘿,%v。你的物理成绩是%d分(满分100分)。",name,score)// 输出:嘿,Joe。你的物理成绩是78分(满分100分)。一些常用格式说明符:
| 说明符 | 作用 | 适用类型 | 示例 |
|---|---|---|---|
%v | 默认格式(通用万能型) | 任意类型 | fmt.Printf("%v", name) |
%T | 打印值的数据类型 | 任意类型 | fmt.Printf("%T", 10)→int |
%d | 十进制整数 | 整数(int 等) | fmt.Printf("%d", 100) |
%c | 字符(Unicode 码点) | rune / byte | fmt.Printf("%c", 65)→A |
%q | 带双引号的字符串(安全转义) | 字符串 | fmt.Printf("%q", "Hi")→"Hi" |
%t | 布尔值(true / false) | 布尔(bool) | fmt.Printf("%t", true) |
%f | 浮点数(小数) | 浮点数(float) | fmt.Printf("%f", 3.14) |