Go 的 if 语句必须带大括号且左括号不能换行,否则编译报错;短变量声明作用域仅限 if 条件块内;for 是唯一循环语句,无 while 或 do-while。

Go 的 if 语句必须带大括号,且左括号不能换行
Go 编译器会直接报错 syntax error: unexpected newline, expecting {,只要 if 后面的 { 换了行。这不是风格问题,是语法硬性要求。
-
if x > 5 {✅ 正确:{和if在同一行 -
if x > 5\n{❌ 编译失败:换行触发语法错误 - 哪怕只写一个语句,也必须加
{},if x > 5; fmt.Println("ok")是非法的
这种设计强制统一代码结构,避免悬空 else 等歧义,但初学者常因习惯其他语言(如 Python 缩进、JS 可省略)而踩坑。
if 中的短变量声明只在当前分支作用域内有效
写成 if err := doSomething(); err != nil 很常见,但要注意:这个 err 在 if 块外完全不可见,包括 else 分支里也不能用。
- 想在
else里访问err?不行 —— 它只活在if条件判断块内部 - 需要跨分支使用?得提前声明:
var err error,再在if里赋值 - 典型误用:
if data, err := readFile(); err == nil { ... } else { log.Fatal(err) }→ 这里err在else中未定义,编译失败
for 是 Go 唯一的循环语句,没有 while 或 do-while
别找 while 关键字 —— Go 就没这玩意。所有循环都靠 for 实现,包括“条件型”和“遍历型”两种写法。
立即学习“go语言免费学习笔记(深入)”;
- 类 C 风格:
for i := 0; i ,三个部分用分号隔开,但无括号 - while 等效写法:
for condition { ... },省略初始化和后置语句,靠内部break控制退出 - 遍历容器:
for k, v := range slice或for k, v := range map,注意 map 遍历顺序不保证 - range 遍历字符串时按 Unicode 码点,不是字节 ——
"café"长度是 4,不是 5
switch 默认自动 break,显式 fallthrough 才穿透
和 C/Java 不同,Go 的 switch 每个 case 执行完就跳出,不会自动落到下一个 case。想“穿透”,必须手动写 fallthrough。
-
switch x { case 1: fmt.Println("one"); case 2: fmt.Println("two") }→ 只会执行匹配的那个case - 要模拟传统 fallthrough 行为:
case 1: fmt.Println("one"); fallthrough -
fallthrough必须是case最后一条语句,后面不能跟其他代码 - 还支持类型断言形式:
switch v := interface{}(x).(type),用于运行时类型判断
最容易被忽略的是:switch 的条件表达式可以是任意类型,不限于整数,甚至能直接 switch 一个 error 值或函数返回结果 —— 这让错误分类处理更干净。


















