惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
H
Help Net Security
B
Blog RSS Feed
G
Google Developers Blog
博客园 - 司徒正美
MongoDB | Blog
MongoDB | Blog
量子位
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
P
Proofpoint News Feed
小众软件
小众软件
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
V
V2EX
月光博客
月光博客
C
Check Point Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
A
Arctic Wolf
Help Net Security
Help Net Security
Schneier on Security
Schneier on Security
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Palo Alto Networks Blog
T
Tenable Blog
L
LangChain Blog
Attack and Defense Labs
Attack and Defense Labs
Google DeepMind News
Google DeepMind News
N
News and Events Feed by Topic
Forbes - Security
Forbes - Security
F
Fortinet All Blogs
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
大猫的无限游戏
大猫的无限游戏
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Y
Y Combinator Blog
WordPress大学
WordPress大学
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
NISL@THU
NISL@THU
GbyAI
GbyAI
博客园 - Franky
S
Secure Thoughts
有赞技术团队
有赞技术团队
PCI Perspectives
PCI Perspectives
U
Unit 42

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第03章 - 基础语法与数据类型
我才是银古 · 2026-06-19 · via 博客园 - 我才是银古

第03章 - 基础语法与数据类型

本章系统讲解 Go 的基础语法元素:变量、常量、基本数据类型、运算符以及类型转换,这是编写任何 Go 程序的根基。

3.1 程序结构与包

每个 Go 源文件都以 package 声明开头,表明它属于哪个包。同一目录下的所有文件必须属于同一个包。

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(math.Pi)
}
  • 多个导入可以用括号分组书写。
  • 导入的包如果没有被使用,会导致编译错误——这是 Go 强制简洁的体现。
  • 同样,声明但未使用的局部变量也会导致编译失败。

3.2 变量声明

3.2.1 标准声明

使用 var 关键字声明变量:

var name string = "Go"
var age int = 15
var isStable bool = true

3.2.2 类型推断

如果提供了初始值,可以省略类型,由编译器自动推断:

var name = "Go"      // 推断为 string
var age = 15         // 推断为 int

3.2.3 短变量声明

在函数内部,最常用的是 := 短变量声明,它同时完成声明和初始化:

func main() {
    name := "Go"
    age := 15
    pi := 3.14
}

注意:= 只能在函数内部使用,不能用于包级别变量声明。

3.2.4 批量声明

var (
    host string = "localhost"
    port int    = 8080
    debug bool  = false
)

3.2.5 零值

Go 中所有变量在声明时若未显式初始化,都会被赋予该类型的零值,绝不会是未定义的随机值:

类型 零值
数值类型(int、float 等) 0
布尔类型 false
字符串 ""(空字符串)
指针、切片、map、channel、函数、接口 nil
var i int       // 0
var f float64   // 0.0
var s string    // ""
var b bool      // false
var p *int      // nil

3.3 常量

常量使用 const 声明,其值在编译期确定,不可修改:

const Pi = 3.14159
const (
    StatusOK = 200
    StatusNotFound = 404
)

3.3.1 iota 枚举

iota 是 Go 的常量计数器,在 const 块中从 0 开始,每行自增 1,常用于定义枚举:

const (
    Sunday = iota // 0
    Monday        // 1
    Tuesday       // 2
    Wednesday     // 3
    Thursday      // 4
    Friday        // 5
    Saturday      // 6
)

利用 iota 还能定义带计算的枚举,例如表示存储单位:

const (
    _  = iota             // 忽略 0
    KB = 1 << (10 * iota) // 1 << 10 = 1024
    MB                    // 1 << 20
    GB                    // 1 << 30
    TB                    // 1 << 40
)

3.4 基本数据类型

3.4.1 整型

Go 提供了丰富的整型,分为有符号和无符号两类:

类型 位数 范围说明
int8 / uint8 8 uint8 即 byte
int16 / uint16 16
int32 / uint32 32 int32 即 rune
int64 / uint64 64
int / uint 平台相关 32 位系统为 32 位,64 位系统为 64 位
uintptr 平台相关 存放指针的整数

建议:除非有特殊需求(如二进制协议、性能优化),整数一律使用 int

3.4.2 浮点型

  • float32:单精度,约 7 位有效数字。
  • float64:双精度,约 15 位有效数字,是默认和推荐的浮点类型。
var pi float64 = 3.141592653589793

由于浮点数存在精度问题,比较两个浮点数是否相等时应判断差值是否小于一个极小值,而非直接用 ==

3.4.3 复数

Go 原生支持复数类型 complex64complex128

c := complex(3, 4) // 3+4i
fmt.Println(real(c), imag(c)) // 3 4

3.4.4 布尔型

bool 类型只有 truefalse 两个值。注意 Go 中布尔值不能与整数互相转换。

3.4.5 字符串

字符串是不可变的字节序列,底层使用 UTF-8 编码:

s := "Hello, 世界"
fmt.Println(len(s))        // 13(字节数,中文每个占 3 字节)
fmt.Println(s[0])         // 72(byte 值)
  • 双引号字符串支持转义字符(\n\t 等)。
  • 反引号`)定义原始字符串,不转义,可跨行,常用于正则表达式或多行文本:
raw := `第一行
第二行	带制表符
路径: C:\Users`

3.4.6 byte 与 rune

  • byteuint8 的别名,表示一个字节。
  • runeint32 的别名,表示一个 Unicode 码点(字符)。

遍历字符串时,使用 range 会按 rune(字符)迭代,正确处理多字节字符:

for i, r := range "Go语言" {
    fmt.Printf("索引 %d: 字符 %c (码点 %d)\n", i, r, r)
}

3.5 运算符

3.5.1 算术运算符

+-*/%(取余)。注意整数相除会舍弃小数部分。

3.5.2 比较运算符

==!=<<=>>=,返回布尔值。

3.5.3 逻辑运算符

&&(与)、||(或)、!(非)。&&|| 具有短路求值特性。

3.5.4 位运算符

&(与)、|(或)、^(异或/按位取反)、<<(左移)、>>(右移)、&^(位清除)。

a, b := 12, 10
fmt.Println(a & b)  // 8
fmt.Println(a | b)  // 14
fmt.Println(a ^ b)  // 6
fmt.Println(a << 1) // 24

Go 没有 ++aa++ 作为表达式,a++a-- 只能作为独立语句使用,且没有前置形式。

3.6 类型转换

Go 是强类型语言,不存在隐式类型转换,所有类型转换都必须显式进行:

var i int = 100
var f float64 = float64(i)   // int -> float64
var u uint = uint(f)         // float64 -> uint

// 字符串与数字之间需要使用 strconv 包,不能直接转换
import "strconv"
s := strconv.Itoa(100)         // int -> string "100"
n, err := strconv.Atoi("100")  // string -> int

常见误区string(65) 不会得到 "65",而是得到字符 "A"(码点 65 对应的字符)。字符串与数字的转换必须使用 strconv 包。

3.7 fmt 格式化输出

fmt 包是最常用的输出工具,常用动词如下:

动词 含义
%v 默认格式输出值
%+v 输出结构体时带字段名
%#v Go 语法表示
%T 输出值的类型
%d 十进制整数
%f 浮点数
%s 字符串
%q 带引号的字符串
%t 布尔值
%p 指针地址
%x 十六进制
name, age := "Go", 15
fmt.Printf("%s 已经 %d 岁了\n", name, age)
fmt.Printf("类型: %T, 值: %v\n", age, age)

3.8 本章小结

本章覆盖了 Go 的基础语法核心:变量与常量声明、iota 枚举、基本数据类型(整型、浮点、字符串、byte/rune)、运算符以及显式类型转换。Go 强调简洁与显式——未使用的变量和导入会报错,没有隐式类型转换,这些设计使代码更安全、更易读。

下一章我们将学习流程控制语句与函数。