Go变量声明完整总结
Contents
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 :=包级作用域(全局)不允许用
:=。
📌 对比其他语言:
- Python:
a = 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++:用
const或constexpr。 - 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. 作用域
- 包级作用域(全局):必须用
var或const,不能用:=。 - 函数作用域(局部):可用
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 是语言级别支持。
总结(和其他语言的不同点)
- 自动零值:Go 保证所有变量都有确定的零值,避免了 C/C++ 的未定义行为。
- 短变量声明
:=:简洁但限制多(仅函数内,至少一个新变量),和 Python 的动态赋值不同。 - 静态类型 + 类型推断:Go 在语法简洁性和类型安全之间做了平衡。
- 常量计算:Go 常量在编译期即可计算,接近 C++ 的
constexpr,比 Java/Python 更灵活。 - 统一作用域规则:Go 变量只有包级、函数级和块级作用域,没有类作用域。
- 空标识符
_:是语言级机制,而不是约定俗成。