这篇文章已经放到腾讯智能工作台的知识库啦,链接在这里:ima.copilot-Go 入门到入土。要是你有啥不懂的地方,就去知识库找 AI 聊一聊吧。
我们来探讨编程语言中最核心的概念之一:变量。
Go 是一种静态类型语言,其变量处理方式与 Python 等动态语言有显著差异。对于没有静态语言背景的开发者来说,需要特别注意以下几点:
int)变量不能被赋值为字符串(string)。这种强类型约束使得编译器能在编译阶段就发现许多潜在的错误,有助于编写更健壮、更规范的大型项目。
Go 语言提供了多种声明变量的方式。
var)这是最基础的声明方式。使用 var 关键字,后跟变量名和类型。

注意:Go 的类型声明位于变量名之后,这与其他静态语言(如 C++ 或 Java)不同。建议直接适应这种语法,无需纠结其设计原因。
可以在声明变量的同时为其赋予初始值。

当提供初始值时,Go 可以自动推断类型,因此可以省略类型声明:

:=)这是 Go 中最常用、最简洁的声明方式,它会合并声明和初始化两个步骤。

这种方式只能用于局部变量(在函数内部声明的变量),不能用于全局变量。在日常开发中,你会频繁地使用这种方法。
在函数体外声明的变量,其作用域覆盖整个包。

在函数体内声明的变量,其作用域仅限于该函数内部。

注意:短变量声明
:=不能用于声明全局变量。
Go 支持在一行内声明多个变量。

int: 0string: "" (空字符串)bool: falsenil


在 Go 语言中,常量(Constant)是指在程序编译时就已确定,并且在运行时不能被修改的固定值。当程序中有些值从始至终都不应改变时,将其定义为常量是最佳实践。这可以有效防止在代码的某个地方无意中修改了重要的值。
常量的定义与变量类似,但使用 const 关键字。

核心特性:

常量也具有类型。Go 语言支持在定义常量时显式指定类型,也支持通过值进行隐式类型推断。
明确指定常量的类型。

不指定类型,由编译器根据所赋的值自动推断。

在这种情况下,编译器会自动推断 E 的类型。
为了在代码中清晰地区分常量和变量,Go 语言的开发社区遵循以下命名规范:
_ 分隔。

虽然这并非强制性语法,但遵循此规范可以极大地提高代码的可读性。
为了代码的整洁和可读性,当需要定义多个相关的常量时,可以使用括号 () 将它们分组。

分组定义时,存在一个重要的特性:在一组常量中,如果某个常量没有被显式赋值,它会自动沿用上一个常量的值和类型。
看下面的例子:

当我们打印这些常量时,会得到 16, 16, "abc", "abc", "abc"。
对这个特性的理解,是掌握 Go 中另一个重要关键字 iota 的基础,我们将在后续文章中详细讲解。
struct 或 array)不支持定义为常量。iota 是 Go 语言中一个非常有用的关键字,专用于常量的定义。它可以被看作一个可由编译器在编译期间修改的特殊常量。iota 的主要作用是简化具有递增规律的常量的定义,尤其在定义枚举值、错误码等场景中,能显著提高代码的可读性和可维护性。
iota 的基本用法iota 的值由编译器控制,它从 0 开始,在同一个 const 定义组中,每增加一个常量声明,其值就会自动加 1。

iota 的隐式特性与简化写法Go 语言的 const 声明有一个特性:如果某一行没有指定值,它会自动沿用上一行的表达式。这个特性与 iota 结合使用,可以写出非常简洁的代码。
你只需要在第一个常量上使用 iota,后续的常量会自动应用递增的

这种写法是 iota 最常用、最推荐的实践。如果后续需要在中间插入新的常量,无需手动修改后续所有常量的值,iota 会自动处理。
iota 序列iota 的强大之处在于它可以参与运算。你可以用它来构建更复杂的常量序列。
例如,让序列从 1 开始:

iota如果在 const 组中,你手动为某个常量赋值,那么 iota 的递增在这一行会被中断。但是,iota 的内部计数器仍然会根据行数继续增加。
当你再次使用 iota 时,它会返回当前行对应的计数值,而不是被中断行的值。

关键点:iota 的值取决于它所在的行号(从 0 开始),而不是上一行的常量值。
iota 的核心规则总结const 块重置:iota 的计数器在每一个新的 const 关键字出现时都会被重置为 0。
const 块中,每新增一行常量声明(即使该行是空标识符),iota 的计数器就会自动加 1。iota,其内部计数器依然会增加。当后续行恢复使用 iota 时,将获取该行对应的计数值。iota 是 Go 语言中一个精妙的设计,掌握它能让你的代码更加简洁和优雅。
在 Go 语言中,有一个非常严格的规则:所有声明的变量都必须被使用,否则编译器会报错。然而,在某些场景下,我们可能需要接收一个值,但又确实不需要使用它。为了解决这个问题,Go 提供了匿名变量(Anonymous Variable)。
匿名变量使用一个下划线 _ 来表示,它是一个特殊的变量名,可以看作一个“占位符”。任何赋予匿名变量的值都会被直接丢弃,因此它不需要被使用,也不会引发编译错误。
匿名变量最常见的用途是处理函数的多个返回值。
在 Go 中,一个函数可以返回多个值。当调用这样的函数时,你必须用相应数量的变量来接收所有返回值。但有时,你可能只关心其中的一部分返回值。
场景示例:
假设我们有一个函数 getData(),它返回一个整数和一个布尔值。

现在,我们只想判断操作是否成功(即只关心返回的布尔值),而对那个整数不感兴趣。
错误的做法:

正确的做法:使用匿名变量
我们可以使用匿名变量 _ 来接收那个我们不关心的整数值。

通过这种方式,我们既满足了函数多返回值的接收要求,又避免了因变量未使用而导致的编译错误。
_。在后续学习 Go 的接口(Interface)等更高级的概念时,你还会遇到匿名变量的其他应用场景。掌握它是编写地道 Go 代码的重要一步。
在像 Go 这样的静态类型语言中,作用域(Scope) 是一个至关重要的概念。它定义了程序中一个变量可以被访问的区域。与许多动态语言相比,Go 对作用域的规定非常严格,这有助于在编译阶段就发现潜在的错误,从而提高代码的健壮性。
在所有函数体外部声明的变量,拥有全局作用域。这意味着它们可以在当前包(package)的任何地方被访问和修改。


Go 语言的作用域规则是基于 代码块的,代码块由花括号 {} 界定。在 if、for、switch 或普通 {} 内部声明的变量,其作用域仅限于该代码块。
这是静态语言中一个非常重要的特性:一旦程序执行离开一个代码块,该块内声明的所有变量都将被销毁,无法在外部访问。
示例 1:普通代码块

示例 2:if 条件块

一个常见的误区是,认为如果在 if 和 else 的所有分支中都定义了同名变量,那么在外部就可以访问它。这是错误的,因为每个变量的作用域都被限制在各自的代码块内。

{} 内部可见。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。