Contents

Go变量声明完整总结

Go 是一门 静态类型语言,所有变量在 编译期 必须有确定的类型(可推断)。Go 提供了多种声明方式,既保持了静态语言的安全性,又在语法上简洁。


1. 使用 var 声明

基本语法:

var name type
var name type = value
var name = value // 类型自动推断

示例:

var age int
age = 18

var score int = 95
var city = "Beijing" // 推断为 string

📌 对比其他语言

  • Java/C++:必须写明类型 int age = 18;,不支持省略。
  • Python/JavaScript:不需要类型,运行时动态绑定。
  • Go:支持省略(通过类型推断),但仍然是 静态类型

2. 使用 :=(短变量声明)

只能在函数内部使用,相当于 声明 + 初始化

x := 10        // 自动推断 int
y := "hello"   // 自动推断 string
z := 3.14      // 自动推断 float64

📌 注意点

  • 至少要有一个新变量:

    a, b := 1, 2
    a, c := 3, 4 // a 已存在,c 是新变量 ✅
    a, b := 5, 6 // ❌ 报错:no new variables on left side of :=
  • 包级作用域(全局)不允许用 :=

📌 对比其他语言

  • Pythona = 10 动态绑定变量名,语义不同。
  • Java:没有类似简写,必须写 int a = 10;
  • C++ (auto)auto a = 10; 有点像 Go 的 :=,但 Go 限制只能在函数内。

3. 批量声明

Go 支持一次声明多个变量:

var a, b, c int
var x, y = 1, "hi"

分组声明(常用于包级作用域):

var (
    name string = "Alice"
    age  int    = 30
    ok   bool   = true
)

4. 常量 const

常量在 编译期确定值,不可修改。

const Pi = 3.14159
const AppName = "MyApp"

常量可以参与编译期计算:

const a = 3
const b = a * 2 // b = 6

📌 区别

  • Java:用 final 修饰变量。
  • C++:用 constconstexpr
  • Python:没有真正常量,约定俗成用大写命名。

5. 零值(Zero Value)

在 Go 中,未显式初始化的变量会自动赋予零值(不会有垃圾值)。

var a int        // 0
var b string     // ""
var c bool       // false
var d []int      // nil

📌 区别

  • C/C++:未初始化的局部变量是随机垃圾值 ⚠️。
  • Java:成员变量会自动初始化(0、false、null),但局部变量必须显式赋值。
  • Python:必须赋值,否则报错 NameError
  • Go:所有变量 一定有确定的值,安全性更高。

6. 作用域

  • 包级作用域(全局):必须用 varconst,不能用 :=
  • 函数作用域(局部):可用 var:=
  • 块级作用域:声明的变量只在 {} 内有效。

示例:

var global = 100 // 全局变量

func main() {
    local := 200
    fmt.Println(global, local)
}

📌 区别

  • Python:函数外声明的变量全是全局的。
  • Java/C++:作用域规则类似 Go,但有 class 成员变量。
  • Go:没有类,包级变量是最常用的全局变量。

7. 特殊变量 _(空标识符)

Go 提供 _ 作为“占位符”,表示丢弃不需要的值。

x, _ := someFunc() // 只要第一个返回值
_, y := someFunc() // 只要第二个返回值

📌 区别

  • 其他语言一般用 _ 只是一个普通变量名(如 Python 约定俗成),Go 是语言级别支持。

总结(和其他语言的不同点)

  1. 自动零值:Go 保证所有变量都有确定的零值,避免了 C/C++ 的未定义行为。
  2. 短变量声明 :=:简洁但限制多(仅函数内,至少一个新变量),和 Python 的动态赋值不同。
  3. 静态类型 + 类型推断:Go 在语法简洁性和类型安全之间做了平衡。
  4. 常量计算:Go 常量在编译期即可计算,接近 C++ 的 constexpr,比 Java/Python 更灵活。
  5. 统一作用域规则:Go 变量只有包级、函数级和块级作用域,没有类作用域。
  6. 空标识符 _:是语言级机制,而不是约定俗成。