Go语言快速入门Go语言快速入门
首页
基础篇
进阶篇
高阶篇
实战篇
Go官方网站
编程指南
首页
基础篇
进阶篇
高阶篇
实战篇
Go官方网站
编程指南
  • 基础篇

    • 🚀 基础篇
    • 第1章 - 环境安装
    • 第2章 - Hello World
    • 第3章 - 变量与常量
    • 第4章 - 数据类型
    • 控制流程
    • 函数
    • 数组与切片
    • Map
    • 结构体
    • 指针

第3章 - 变量与常量

嘿,朋友们!

变量是编程的基础,Go的变量声明方式可能和你之前学的语言有点不同,但非常简洁!我一开始用Go时,就爱上了:=这个简洁的语法——省去了好多冗余的代码!这对我这种自学的人来说,真是太友好了。

📝 变量声明

Go有三种声明变量的方式:

1. var 关键字(完整写法)

var name string = "张三"
var age int = 18
var isStudent bool = true

类型在变量名后面!(和Java/C相反)

2. 类型推断

var name = "张三"    // 自动推断为 string
var age = 18         // 自动推断为 int
var price = 9.99     // 自动推断为 float64

对比TypeScript

// TypeScript
let name = "张三";  // 推断为 string

// Go
var name = "张三"   // 推断为 string

很像吧!但Go是编译时确定,更安全。

3. 短变量声明 :=(最常用!)

name := "张三"
age := 18
isStudent := true

:= 是声明+赋值的简写,只能在函数内部使用。

注意

:= 是声明新变量,= 是给已有变量赋值:

name := "张三"  // 声明并赋值
name = "李四"   // 重新赋值(不需要:=)

name := "王五"  // ❌ 错误!name已经声明过了

🎯 对比:Go vs Java vs JavaScript

// Java
String name = "张三";
int age = 18;
final double PI = 3.14;
// JavaScript
let name = "张三";
let age = 18;
const PI = 3.14;
// Go
name := "张三"
age := 18
const PI = 3.14

📦 多变量声明

// 方式1:同一行声明多个
var a, b, c int = 1, 2, 3

// 方式2:短变量声明
x, y, z := 1, "hello", true

// 方式3:批量声明(推荐用于包级别变量)
var (
    name   = "张三"
    age    = 18
    height = 175.5
)

0️⃣ 零值(Zero Value)

Go的变量声明后如果不赋值,会有默认零值:

var i int      // 0
var f float64  // 0.0
var s string   // ""(空字符串)
var b bool     // false
var p *int     // nil(空指针)

对比Java

Java的基本类型也有默认值,但引用类型默认是null。 Go没有null,用nil表示"无",而且只有指针、slice、map等可以是nil。

🔒 常量 const

常量使用 const 关键字,值在编译时确定:

const PI = 3.14159
const AppName = "MyApp"
const MaxSize = 100

// 批量声明
const (
    StatusOK    = 200
    StatusError = 500
)

iota - 常量生成器

iota 是Go的常量计数器,超级好用:

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

实用技巧:

// 从1开始
const (
    January = iota + 1  // 1
    February            // 2
    March               // 3
)

// 跳过某个值
const (
    A = iota  // 0
    _         // 1(跳过)
    B         // 2
    C         // 3
)

// 位运算(定义权限)
const (
    Read   = 1 << iota  // 1  (001)
    Write               // 2  (010)
    Execute             // 4  (100)
)
// 组合权限:ReadWrite := Read | Write  // 3 (011)

🌐 变量作用域

package main

var globalVar = "我是全局变量"  // 包级别变量

func main() {
    localVar := "我是局部变量"
    
    if true {
        blockVar := "我是块级变量"
        fmt.Println(blockVar)   // ✅ 可以访问
    }
    // fmt.Println(blockVar)    // ❌ 错误,超出作用域
    
    fmt.Println(globalVar)      // ✅ 可以访问
    fmt.Println(localVar)       // ✅ 可以访问
}

可见性规则

Go用首字母大小写控制可见性:

  • 首字母大写 → 公开(其他包可访问)
  • 首字母小写 → 私有(仅当前包可访问)
var Name = "公开变量"   // 其他包可以访问
var age = 18            // 仅当前包可以访问

这比Java的public/private简洁多了!

未使用的变量

Go不允许声明变量后不使用:

func main() {
    name := "张三"  // ❌ 编译错误:name declared but not used
}

这是Go的设计哲学:保持代码整洁,不要有无用代码。

如果临时不用,可以用空白标识符 _:

func main() {
    name, _ := getInfo()  // 忽略第二个返回值
    fmt.Println(name)
}

实战案例:用户信息管理

package main

import "fmt"

// 包级别常量
const (
    RoleAdmin  = iota + 1  // 1
    RoleEditor             // 2
    RoleViewer             // 3
)

// 包级别变量
var appName = "用户管理系统"

func main() {
    // 用户信息
    userName := "张三"
    userAge := 25
    userRole := RoleAdmin
    isActive := true
    
    // 打印信息
    fmt.Printf("=== %s ===\n", appName)
    fmt.Printf("姓名: %s\n", userName)
    fmt.Printf("年龄: %d\n", userAge)
    fmt.Printf("角色ID: %d\n", userRole)
    fmt.Printf("是否活跃: %t\n", isActive)
    
    // 修改变量
    userAge = 26
    isActive = false
    fmt.Printf("\n一年后,%s的年龄变成了%d\n", userName, userAge)
}

运行结果:

=== 用户管理系统 ===
姓名: 张三
年龄: 25
角色ID: 1
是否活跃: true

一年后,张三的年龄变成了26

练习

  1. 声明一个常量 MaxRetry 值为 3
  2. 使用 iota 定义四季:春(1)、夏(2)、秋(3)、冬(4)
  3. 声明变量存储一个商品信息(名称、价格、库存、是否上架)
参考答案
package main

import "fmt"

// 1. 最大重试次数
const MaxRetry = 3

// 2. 四季
const (
    Spring = iota + 1  // 1
    Summer             // 2
    Autumn             // 3
    Winter             // 4
)

func main() {
    // 3. 商品信息
    productName := "iPhone 15"
    price := 6999.00
    stock := 100
    isOnSale := true
    
    fmt.Printf("商品: %s\n", productName)
    fmt.Printf("价格: ¥%.2f\n", price)
    fmt.Printf("库存: %d\n", stock)
    fmt.Printf("是否上架: %t\n", isOnSale)
    
    fmt.Printf("\n最大重试次数: %d\n", MaxRetry)
    fmt.Printf("当前季节: %d (夏天)\n", Summer)
}

掌握了变量和常量,下一节我们来看看Go有哪些数据类型!

最近更新: 2025/12/27 13:26
Contributors: 王长安
Prev
第2章 - Hello World
Next
第4章 - 数据类型