从零学 Go:基本语法介绍之变量的声明与初始化

简介: 基本语法介绍之变量的声明与初始化

前文回顾

前面的文章介绍了 Go 相关的特性与入门案例,对于一门编程语言,变量和语法是我们首先需要掌握的。Golang 在语法上与 C 语言有很多相似支持,但是比 C 语言更加简约。如果你有一定的 C 语言基础,阅读起来就事半功倍,即时没有也没关系,因为 Golang 的语法非常易于理解。

本系列文章将会介绍 Go 语言基础语法的相关知识,本文将首先从变量的声明与初始化讲起。

变量的声明与初始化

在 HelloGo 中,我们已经声明了不少的变量,样式如下所示:

var input string

上述代码中声明了一个 string 类型,变量名为 input 的变量。Golang 在声明变量时,会自动把变量对应的内存区域进行初始化操作,每个变量会被初始化为其类型的默认值。变量声明样式如下所示:

var name T

一些常见的变量的声明样式如下:

var a int //声明一个 int 类型的变量
var b string //声明一个 string 类型的变量
var c []float //声明一个 float 类型的切片
var d struct{ // 声明一个匿名结构体,该结构体有一个 int 类型的字段
 x int
}
var e func() bool //声明一个函数变量
var (
 f int
 g string
)
// 同时声明多组变量

在 Golang 中,每一个声明的变量都必须被使用,否则会编译不通过。

对变量进行声明之后,我们还需要对变量空白的内存区域进行初始化,也就是赋值。与其他的语言一致,通过 = 赋值符号初始化,如下例子:

var a int = 100

上述代码中,声明了一个 int 类型的 a 变量,并将其赋值为 100。变量初始化的样式为:

var name T = 表达式

当然可以利用 Golang 提供的类型推导语法糖特性,精简为以下的样式:

var a = 100
b := "Hello"

在省略了类型属性后,编译器会尝试根据等号右边的表达式推导出变量的类型。注意在使用 := 短变量声明初始化时,左值中的变量最少有一个变量必须是未定义过的变量,否则会出现编译错误。同时 := 不能出现在全局变量的声明和初始化中。

var a = 100
a := 100 //编译报错
a, b := 100, "OK" //无异常

在上述代码中,a := 100 会在编译过程中抛出 no new variables on left side of := 的报错;而 a, b := 100 不会。

我们可以尝试运行 Variable 中的代码,看一下编译器的类型推导结果。

// Variable.go
package main
import "fmt"
func main()  {
 var a int = 100
 var b = "100"
 c := 0.17
 fmt.Printf("a value is %v, type is %T\n", a, a)
 fmt.Printf("b value is %v, type is %T\n", b, b)
 fmt.Printf("c value is %v, type is %T\n", c, c)
}

输出结果如下:

a value is 100, type is int
b value is 100, type is string
c value is 0.17, type is float64

从上述表示结果可以看到,变量都被赋予了正确的变量类型。需要注意的是,为了提供精度,浮点数类型会被默认推导为 float64

与 C 语言相比,除了类型推导的语法糖特性,Golang 还提供了多重赋值和匿名变量的语法糖特性。

在过去的编程语言中,如果我们想要交换变量的值,就需要借助一个第三方临时变量来实现,如下例子所示:

var a int = 1
var b int = 2
var tmp int
tmp = a
a = b
b = tmp

在 Golang 中,我们可以通过多重赋值的特性轻松实现类似的变量交换任务,如下所示:

var a int = 1
var b int = 2
b, a = a, b

在多重赋值的过程中,变量的左值和右值按照从左往右的顺序赋值。

在 Golang 中,被声明的变量必须被使用,否则会被编译器抛出异常。Golang 支持函数多返回值和上面所说的多重赋值,但是有些时候我们不需要使用某些左值,可以使用匿名变量处理,具体例子如 Anonymous.go 所示:

package main
import "fmt"
// 返回一个人的姓和名
func getName() (string, string){
 return "王", "小二"
}
func main()  {
 surname, _ := getName()
 _, personalName := getName()
 fmt.Printf("My surname is %v and my personal name is %v", surname, personalName)
}

通过在不需要的变量声明的地方使用 _ 代替变量名,我们就可以忽略部分不需要的左值。匿名变量不占用命名空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。

小结

变量一般是指程序运行过程中存储数据的抽象概念,它的值是允许改变的;与之相对的是常量,它的值在程序运行过程中是不允许变化的。下面的文章,我们将会介绍 Go 语言的原生数据类型。


阅读最新文章,关注公众号:aoho求索

目录
相关文章
|
2月前
|
JSON 测试技术 Go
零值在go语言和初始化数据
【7月更文挑战第10天】本文介绍在Go语言中如何初始化数据,未初始化的变量会有对应的零值:bool为`false`,int为`0`,byte和string为空,pointer、function、interface及channel为`nil`,slice和map也为`nil`。。本文档作为指南,帮助理解Go的数据结构和正确使用它们。
85 22
零值在go语言和初始化数据
|
1月前
|
Go
Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围
Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围
|
20天前
|
设计模式 Java 数据库连接
|
20天前
|
安全 Go
|
20天前
|
自然语言处理 Go 开发者
深入理解Go语言中的变量作用域
【8月更文挑战第31天】
13 0
|
1月前
|
存储 缓存 Java
涨姿势啦!Go语言中正则表达式初始化的最佳实践
在Go语言中,正则表达式是处理字符串的强大工具,但其编译过程可能消耗较多性能。本文探讨了正则表达式编译的性能影响因素,包括解析、状态机构建及优化等步骤,并通过示例展示了编译的时间成本。为了优化性能,推荐使用预编译策略,如在包级别初始化正则表达式对象或通过`init`函数进行错误处理。此外,简化正则表达式和分段处理也是有效手段。根据初始化的复杂程度和错误处理需求,开发者可以选择最适合的方法,以提升程序效率与可维护性。
36 0
涨姿势啦!Go语言中正则表达式初始化的最佳实践
|
2月前
|
自然语言处理 算法 Go
理解在go程序的初始化顺序和MVS
【7月更文挑战第9天】本文介绍Go程序初始化顺序:按导入顺序执行`init()`,先变量定义、常量、再执行`init()`,最后`main()`. 运行时使用`GOCOVERDIR`保存覆盖率数据。
82 1
理解在go程序的初始化顺序和MVS
|
2月前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
60 8
|
3月前
|
算法 编译器 Go
Go语言中,常量和变量的定义和使用
Go语言中,常量和变量的定义和使用
|
3月前
|
存储 安全 Go
【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘
【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘
36 2