引入

程序要处理数据,得先把数据存起来。变量就是给数据起个名字,放到内存里,后面想用就通过名字拿。Go 的变量声明方式很灵活,有几种不同的写法,搞清楚什么时候用哪种很重要。

正文

定义

定义

变量用于保存数据,后续可以通过变量名使用这个数据。每个变量有类型,Go 是强类型语言,类型在编译时就确定了。

语法

// 完整声明
var name string = "Tom"
 
// 类型推断
var age = 18
 
// 短变量声明(只能在函数内用)
score := 100

三种写法对应不同场景:

  • var name type = value:最完整的写法
  • var name = value:让编译器自己推类型
  • name := value:最简洁,函数内首选

例子

基本声明

var name string = "Alice"
var age int = 25
var height float64 = 1.75
var isStudent bool = true

类型推断

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

编译器会根据右边的值自动推断类型,不用手动写。

短变量声明

func main() {
    name := "Bob"
    age := 30
    fmt.Println(name, age)
}

:= 是函数里最常用的声明方式,声明和赋值一步完成

多变量声明

// 一次声明多个同类型变量
var a, b, c int = 1, 2, 3
 
// 一次声明多个不同类型变量
var (
    name string = "Tom"
    age int = 20
    city string = "Shanghai"
)

var () 块可以把相关变量组织在一起,看起来更清晰。

零值

var n int        // 0
var f float64    // 0
var s string     // ""
var b bool       // false
var p *int       // nil

Go 里声明变量不赋值,会自动给零值,不会出现未初始化的脏数据。

类型零值
int, float640
string""
boolfalse
指针、切片、map、channel、接口、函数nil

常见写法

写法使用场景
var x int = 10明确指定类型
var x = 10类型推断,全局变量常用
x := 10函数内局部变量,最常用
var a, b int = 1, 2同时声明多个同类型变量
var ( … )批量声明多个变量

特点

  • := 只能在函数内使用,函数外必须用 var
  • := 是声明+赋值,不能对已声明的变量重复用(除非左侧有新变量)
  • 零值机制保证变量一定是有值的,不会是随机内存
  • 变量声明后必须使用,否则编译报错(Go 的严格要求)
  • 类型写在变量名后面,和很多语言不同
// Go 的写法
var name string
 
// 其他语言的写法(对比)
// string name

理解

Go 的变量设计核心是简单且安全。零值机制让你不用操心未初始化的问题,类型推断让你少写代码,:= 让函数内的代码更简洁。强制要求变量必须被使用,逼着你写出更干净的代码。整体思路就是:编译器能做的事,就不让人来做。

引出

变量是可以重新赋值的,但有些数据我们希望它固定不变。这就引出了 Go 常量,看看怎么声明不可变的值。