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特有的语法糖,但仅限于函数内部使用;
  • • 常量和变量一样支持批量声明,代码更整洁;

 

相关文章
|
6月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
1054 162
|
5月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
488 4
|
9月前
|
Go 开发者
Go语言包的组织与导入 -《Go语言实战指南》
本章详细介绍了Go语言中的包(Package)概念及其使用方法。包是实现代码模块化、复用性和可维护性的核心单位,内容涵盖包的基本定义、命名规则、组织结构以及导入方式。通过示例说明了如何创建和调用包,并深入讲解了`go.mod`文件对包路径的管理。此外,还提供了多种导入技巧,如别名导入、匿名导入等,帮助开发者优化代码结构与可读性。最后以表格形式总结了关键点,便于快速回顾和应用。
373 61
|
10月前
|
存储 Go
Go语言之接口与多态 -《Go语言实战指南》
Go 语言中的接口是实现多态的核心机制,通过一组方法签名定义行为。任何类型只要实现接口的所有方法即视为实现该接口,无需显式声明。本文从接口定义、使用、底层机制、组合、动态行为到工厂模式全面解析其特性与应用,帮助理解 Go 的面向接口编程思想及注意事项(如 `nil` 陷阱)。
276 22
|
8月前
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
424 63
|
10月前
|
Go C++
Go语言方法与接收者 -《Go语言实战指南》
本文介绍了 Go 语言中方法的相关概念和用法。方法是绑定到特定类型上的函数,包含值接收者和指针接收者两种形式。值接收者不会改变原始数据,而指针接收者可修改原始数据,且在处理大型结构体时性能更优。文章详细对比了方法与普通函数的区别,并说明了选择指针接收者的原因,如修改原始值、提升性能及保持一致性。此外,Go 支持为任意自定义类型定义方法,不仅限于结构体。最后通过表格总结了方法的核心概念和使用场景。
272 34
|
9月前
|
测试技术 程序员 Go
Go语言测试简明指南:深度解读go test命令
总的来说,go test是 Go 语言中一个强而有力的工具,每个 Go 程序员都应该掌握并把它融入到日常的开发和调试过程中。就像是一个眼镜过滤出的太阳,让我们在宽阔的代码海洋中游泳,而不是淹没。用好它,让我们的代码更健壮,让我们的生产力更强效。
652 23
|
9月前
|
数据可视化 测试技术 Go
Go 语言测试与调试:`go test` 工具用法
`go test` 是 Go 语言内置的测试工具,支持单元测试、基准测试、示例测试等功能。本文详解其常用参数、调试技巧及性能测试命令,并提供实际项目中的应用示例与最佳实践。
|
9月前
|
测试技术 Go 开发者
Go语言常见接口设计技巧-《Go语言实战指南》
本文分享了 Go 语言中接口设计的最佳实践与技巧。首先介绍了接口设计原则,包括面向接口编程和接口隔离原则(定义最小化接口)。接着详细讲解了常用技巧:关注行为而非数据、优先返回接口隐藏实现细节、遵循“-er”命名惯例、使用接口组合提升灵活性、通过 Mock 接口简化单元测试,以及避免导出仅内部使用的接口。最后以表格形式总结了各技巧的核心要点,帮助开发者编写更清晰、可维护的代码。
302 11
|
10月前
|
Go
Go语言之匿名字段与组合 -《Go语言实战指南》
Go 语言通过匿名字段(embedding)实现类似继承的组合机制。匿名字段是在结构体中嵌套类型而不显式命名字段名,自动获取嵌入类型的字段和方法访问权限。支持方法提升、指针嵌入、字段冲突处理及多重组合,强调“组合优于继承”的设计理念,助力灵活高效的代码组织方式。