Go语言变量与常量 -《Go语言实战指南》

简介: 本章详细介绍了Go语言中变量与常量的基础知识。变量支持多种声明方式,包括标准声明、类型推导和短变量声明等,未初始化的变量会自动赋零值。常量在声明时必须赋值,且运行时不可更改,支持使用`iota`实现枚举。两者的主要区别在于变量可变而常量不可变,变量有零值而常量必须初始化。此外,还强调了`:=`的使用限制及代码整洁性要求,并通过实践示例巩固理解。掌握这些内容是学好Go语言的关键基础。

 

在Go语言中,变量与常量是构建程序最基本的组成部分。本章将带你掌握变量和常量的声明方式、使用方法以及注意事项,打牢语言基础。


一、变量(Variable)

1.1 变量声明

Go语言支持多种变量声明方式:

方式一:标准声明
var a int
a = 10
方式二:同时赋初值
var b int = 20
方式三:类型推导(推荐)
var c = 30  // Go自动推导为int类型
方式四:短变量声明(只能在函数内部)
d := 40  // 自动推导类型

:= 是声明+赋值,不能重复声明已有变量。

1.2 多变量声明

var x, y, z int = 1, 2, 3

也可以混合类型:

var (
    name string = "Go"
    age  int    = 14
    flag bool   = true
)

1.3 零值(默认值)

Go会自动为未初始化的变量赋“零值”:

类型 零值
数字型 0
布尔型 false
字符串型 ""
指针/引用 nil

二、常量(Constant)

常量在声明时必须赋值,且值不能在运行时改变。

2.1 基本声明方式

const Pi = 3.14
const Name string = "GoLang"

2.2 多常量声明

const (
    A = 1
    B = "hello"
    C = true
)

2.3 枚举常量与 iota

iota 是Go的常量计数器,在每个 const 块中从0开始递增:

const (
    Red = iota  // 0
    Green       // 1
    Blue        // 2
)

也可以做位运算:

const (
    Read  = 1 << iota  // 1 << 0 = 1
    Write              // 1 << 1 = 2
    Execute            // 1 << 2 = 4
)

三、变量与常量的区别

项目 变量 常量
是否可变
必须赋值 否(有零值)
使用位置 全局/局部 全局/局部
类型推导 支持 支持
典型用途 临时状态数据 配置/控制标识符

四、注意事项

  • := 不能用于全局变量声明,只能在函数内部使用;
  • • 常量不能使用函数返回值初始化;
  • • 不使用的变量会导致编译错误(Go强调代码整洁);
  • • 常量间可进行类型转换和运算,但不能赋给变量再变更。

五、实践示例

package main
import "fmt"
const (
    Monday = iota + 1
    Tuesday
    Wednesday
)
func main() {
    var name = "Go"
    age := 15
    const version = "1.21"
    fmt.Println("Language:", name)
    fmt.Println("Age:", age)
    fmt.Println("Version:", version)
    fmt.Println("Weekdays:", Monday, Tuesday, Wednesday)
}

输出:

Language: Go
Age: 15
Version: 1.21
Weekdays: 1 2 3

六、小结

  • • 变量是可变的数据容器,支持显式声明和类型推导;
  • • 常量用于存放不可变值,支持 iota 实现自增枚举;
  • := 是Go特有的语法糖,但仅限于函数内部使用;
  • • 常量和变量一样支持批量声明,代码更整洁;

 

相关文章
|
17天前
|
Go 开发者
Go语言包的组织与导入 -《Go语言实战指南》
本章详细介绍了Go语言中的包(Package)概念及其使用方法。包是实现代码模块化、复用性和可维护性的核心单位,内容涵盖包的基本定义、命名规则、组织结构以及导入方式。通过示例说明了如何创建和调用包,并深入讲解了`go.mod`文件对包路径的管理。此外,还提供了多种导入技巧,如别名导入、匿名导入等,帮助开发者优化代码结构与可读性。最后以表格形式总结了关键点,便于快速回顾和应用。
114 61
|
19天前
|
存储 Go
Go语言之接口与多态 -《Go语言实战指南》
Go 语言中的接口是实现多态的核心机制,通过一组方法签名定义行为。任何类型只要实现接口的所有方法即视为实现该接口,无需显式声明。本文从接口定义、使用、底层机制、组合、动态行为到工厂模式全面解析其特性与应用,帮助理解 Go 的面向接口编程思想及注意事项(如 `nil` 陷阱)。
|
12天前
|
测试技术 程序员 Go
Go语言测试简明指南:深度解读go test命令
总的来说,go test是 Go 语言中一个强而有力的工具,每个 Go 程序员都应该掌握并把它融入到日常的开发和调试过程中。就像是一个眼镜过滤出的太阳,让我们在宽阔的代码海洋中游泳,而不是淹没。用好它,让我们的代码更健壮,让我们的生产力更强效。
68 23
|
24天前
|
Go C++
Go语言方法与接收者 -《Go语言实战指南》
本文介绍了 Go 语言中方法的相关概念和用法。方法是绑定到特定类型上的函数,包含值接收者和指针接收者两种形式。值接收者不会改变原始数据,而指针接收者可修改原始数据,且在处理大型结构体时性能更优。文章详细对比了方法与普通函数的区别,并说明了选择指针接收者的原因,如修改原始值、提升性能及保持一致性。此外,Go 支持为任意自定义类型定义方法,不仅限于结构体。最后通过表格总结了方法的核心概念和使用场景。
|
18天前
|
测试技术 Go 开发者
Go语言常见接口设计技巧-《Go语言实战指南》
本文分享了 Go 语言中接口设计的最佳实践与技巧。首先介绍了接口设计原则,包括面向接口编程和接口隔离原则(定义最小化接口)。接着详细讲解了常用技巧:关注行为而非数据、优先返回接口隐藏实现细节、遵循“-er”命名惯例、使用接口组合提升灵活性、通过 Mock 接口简化单元测试,以及避免导出仅内部使用的接口。最后以表格形式总结了各技巧的核心要点,帮助开发者编写更清晰、可维护的代码。
|
23天前
|
Go
Go语言之匿名字段与组合 -《Go语言实战指南》
Go 语言通过匿名字段(embedding)实现类似继承的组合机制。匿名字段是在结构体中嵌套类型而不显式命名字段名,自动获取嵌入类型的字段和方法访问权限。支持方法提升、指针嵌入、字段冲突处理及多重组合,强调“组合优于继承”的设计理念,助力灵活高效的代码组织方式。
|
26天前
|
算法 Go
Go语言模拟集合类型-《Go语言实战指南》
在 Go 语言中,虽然没有内建的集合(Set)类型,但可以通过 `map` 实现其功能。常用方式包括 `map[T]bool` 和更节省内存的 `map[T]struct{}`。前者以布尔值表示元素存在性,后者利用零内存开销的空结构体。文章介绍了集合的基本操作(添加、删除、判断、遍历),并通过封装示例展示如何创建自定义 Set 类型。这种实现方式适用于去重、唯一标记及集合运算等场景,简洁高效且易于扩展。
|
25天前
|
JSON Go C语言
Go语言之定义结构体(Struct)-《Go语言实战指南》
Go 语言中的结构体(`struct`)是一种复合数据类型,可将多个不同类型的字段组合成一个类型。本文介绍了结构体的基本定义、实例创建方式、字段访问与修改、零值特性、比较规则、嵌套使用及标签功能。通过示例代码详细讲解了如何定义和操作结构体,以及其在 JSON 编码等场景的应用。
|
13天前
|
缓存 安全 Go
Go语言依赖管理与版本控制-《Go语言实战指南》
本章深入探讨Go语言中的依赖管理与版本控制,重点介绍Go Modules的使用方法。内容涵盖依赖管理的重要性、语义化版本控制(SemVer)、查看和管理依赖版本、主版本路径规则、常见操作场景、国内代理加速、依赖安全(go.sum文件)、版本冲突解决及版本锁定与回退等主题。通过学习,读者将掌握如何实现清晰、稳定且可重复构建的项目依赖管理。
|
13天前
|
供应链 安全 Go
Go Modules 详解 -《Go语言实战指南》
Go Modules 是 Go 语言官方推出的依赖管理工具,自 Go 1.11 起引入,Go 1.16 成为默认方式。它解决了第三方依赖版本控制、项目脱离 GOPATH 限制及多模块管理等问题。本文全面讲解了 Go Modules 的基本原理、初始化方法、常用命令(如 `go mod init`、`go get` 等)、依赖管理(添加/升级/删除)、子模块开发以及常见问题排查,帮助开发者高效使用 Go Modules 进行项目管理。

热门文章

最新文章