系列文章目录
【Go语言从入门到精通系列-基础篇】Go安装 + 语言特性,以及开启你人生中的第一个go程序
【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。
Go语言从入门到精通系列-基础篇
- 系列文章目录
- 前言
- 一、变量和常量的基本概念
- 1. 变量
- 1.1 变量标准格式声明
- 1.2 变量的批量格式声明
- 1.3 变量的简短格式声明
- 1.4 变量的赋值
- 1.5 变量的作用域
- 1.5.1 局部变量
- 1.5.2 全局变量
- 2. 常量
- 2.1 常量的声明方式
- 2.2 常量生成器iota
- 2.3 延迟明确常量的具体类型
- 二、运算符的使用和优先级
- 运算符
- 运算符优先级:
- 总结
前言
变量、常量和运算符是任何编程语言中的基本概念,Go语言也不例外。在Go语言中,变量和常量都是必须掌握的基础知识,它们用于存储和处理数据。而运算符则是用于执行各种算术、比较和逻辑操作的符号。
在本文中,我们将深入探讨Go语言中变量、常量和运算符的基本语法、声明方式、作用域以及使用技巧。我们还将介绍不同的数据类型,如整数、浮点数、字符串和布尔值,以及它们之间的运算符。此外,我们还将探讨位运算符、赋值运算符和指针等高级运算符的用法。
无论您是新手还是有经验的开发工作者,在掌握这些基础知识后,您将能够更加自信地编写高效且健壮的Go语言程序。本文能帮助您快速学习和掌握Go语言中变量、常量和运算符的核心概念。
一、变量和常量的基本概念
1. 变量
变量来源于数学,是计算机语言中存储计算结果或表示值的抽象概念。在数学中变量表示没有固定值且可以改变的数。但是从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。
Go语言是静态类型语言
,因此变量(variable)是有明确的类型的,编译器也会检查变量类型的正确性。变量的声明方式可以分别为:标准格式,批量格式,简短格式 3种形式:
1.1 变量标准格式声明
这里需要注意,当一个变量被声明后,系统自动赋予它该类型的零值或空值,例如:int 类型为0,float类型为0.0,bool类型为flase,string类型为空字符串,指针类型为nil等。
var 变量名 变量类型
// 简单示例 声明一个name 为 string 类型
var name string
// 或者声明两个变量为 int 类型
var id, age *int
变量声明以关键字var
开头,中间是变量名,后面是变量类型,结尾无需跟分号。
1.2 变量的批量格式声明
Go 提供了更加高效的批量声明方式, 使用关键字var
和括号将一组变量定义放在一起, 示例如下:
var (
name string
age int
price float32
)
1.3 变量的简短格式声明
除var
关键字外,我们还可以使用更加简短的变量定义和初始化语法,示例如下:
变量名 := 表达式
// 简单示例
name := "ZhangSan"
// 与 var 声明形式一样, 也可以用来声明与初始化一组变量
name1, name2 := "ZhangSan", "LiSi"
之前应该讲过,使用这种声明方式会自己辨别类型,需要注意的是, 简短格式
有以下限制:
- 只能用来定义变量,同时会显示初始化。
- 不能提供数据类型。
- 只能用在函数内部,即不能用来声明全局变量。
因为它具备简洁与灵活的特点,所以被广泛的应用于局部变量的声明于初始化。而var
的声明形式往往用于需要显示指定变量类型
的地方, 或用于声明在初始值不太重要的变量。
1.4 变量的赋值
我们先看赋值的标准
var 变量名 [类型] = 变量值
那么我们就根据之前变量的声明方式试试给其赋值, 示例如下:
// 显示标准格式赋值
var title string = "Go 语言基础篇-显示标准格式"
// 隐式标准格式赋值
var title = "Go 语言基础篇-隐式标准格式"
// 简短格式赋值
title := "Go 语言基础篇-简短格式"
以上三种方式都能进行变量声明,是不是还缺少一种呢, 对了就是批量格式声明
,我们先看它的标准方式:
var (
变量名1 (变量类型1) = 变量值1
变量名2 (变量类型2) = 变量值2
// ... 省略N
)
接下来我们用实际的例子,例如:声明一篇文章的标题(title),文章的内容(content),文章的作者(author),作者年龄(age)通过批量格式赋值:
var (
title string = "Go 语言基础篇"
content string = "这里是内容"
author string = "这里是作者二哥"
age int = 30
)
或者多个变量同一行的方式赋值
var title, content, author, age = "Go 语言基础篇", "变量与常量", "ErGe", 30
最简单的形式
title, content, author, age := "Go 语言基础篇", "变量与常量", "ErGe", 30
以上三种等价,当交换两个变量时, 可以直接采用如下方式:
d, c := "D", "c"
c, d = d, c
1.5 变量的作用域
Go语言总的变量可以分为局部变量
与全局变量
。这两种变量的主要区别在于它们的作用域和生命周期。
1.5.1 局部变量
局部变量是在函数内部声明的变量,它们只能在函数内部使用。当函数执行完毕后,局部变量的内存空间会被释放,无法在函数外部访问。局部变量通常用于存储函数执行过程中的临时数据。以下示例种的main()函数使用了局部变量local1,local2,local3。
package main
import "fmt"
func main() {
// 声明局部变量
var local1, local2, local3 int
// 初始化参数
local1 = 8
local2 = 10
local3 = local1 * local2
fmt.Println("local1 = %d, local2 = %d, local3 = %d\n", local1, local2, local3)
}
// 代码运行结果
local = 8, local2 = 10, local3 = 80
1.5.2 全局变量
全局变量是在函数外部声明的变量,它们可以在整个程序中使用。全局变量的作用域从声明点开始,延伸到整个程序的末尾。全局变量的内存空间在程序运行期间一直存在,可以在函数内部和外部访问。全局变量通常用于存储程序运行过程中需要共享的数据。以下示例演示了全局变量的使用:
package main
import "fmt"
// 声明全局变量
var global int
func main() {
// 声明局部变量
var local1, local2 int
// 初始化参数
local1 = 8
local2 = 10
global = local1 * local2
fmt.Println("local1 = %d, local2 = %d, g= %d\n", local1, local2, local3)
}
// 代码运行结果
local = 8, local2 = 10, g= 80
在Go语言的应用程序中,全局变量
与局部变量
名称可以相同, 但是函数内局部变量会被优先考虑,演示示例:
package main
import "fmt"
// 声明全局变量
var global int = 8
func main() {
// 声明局部变量
var global int = 999
fmt.Println("global = %d\n", global)
}
// 代码运行结果
global = 999
所以我们开发过程中需要注意的是,过多地使用全局变量可能会导致程序的可读性和可维护性降低,因为全局变量可能会被程序的任何部分修改。为了避免这种情况,应该尽可能使用局部变量,只在必要时才使用全局变量。
2. 常量
2.1 常量的声明方式
Go语言的常量使用关键字const
声明。常用于存储不会改变的数据。常量是在编译时被创建的,即使声明在函数内部也是如此,并且只能使布尔型
,数字型
,字符串型
。由于在编译时有限制, 声明常量的表达式必须为 ”能被编译器求值的常量表达式“ 。
而常量的声明格式于变量的声明类似,示例如下:
const 常量名 [类型] = 常量值
例如声明一个常量pi的方法如下:
// 我们可以忽略说明符 [类型], 因为编译器可以根据变量值来推断其类型
// 隐式声明
const pi = 3.14159
// 显示声明
const pi float32 = 3.14159
刚才说了声明常量的表达式必须为 ”能被编译器求值的常量表达式“。以下举个例子:
- 正确的常量声明: const number = 5 / 2
- 错误的常量声明:const url = os.GetEnv(“url”)
上面这两个声明就能很好的理解,number 常量可以在编译时,获取到想要的结果,因为可以在赋值表达式中做计算。而url 需要在程序运行时才可以获取,所以编译时会报错,因为无法作为常量声明的值。
当然常量也可进行批量声明, 示例如下:
const (
name = "ZhangSan"
pi = 3.14159
)
所有常量的运算是在编译期间完成的, 这样不仅可以减少运行时的工作量,也可以方便其他代码的编译优化。当被操作的数是常量时,一些运行时的错误也可以在编译期间被发现,例如:整数除零
,字符串索引越界
, 任何导致无效浮点数的操作
等。
常量间的所有算术运算
,逻辑运算
,比较运算
的结果都是常量。对常量进行类型转换
,len()
,cap()
,real()
,imag()
,complex()
,unsafe.Sizeof()
等函数进行调用,都返回常量结果。就是因为他们的值在编译期间时确定的,因此常量可以是构成类型的一部分,例如用于指定数组类型的长度。示例如下(用常量IPv4Len来指定数组p的长度):
const IPv4Len = 4
// parseIPv4 解析一个IPv4地址(192.168.131.62)
func parseIPv4(s strig) IP {
var p [IPv4Len]byte
// ...
}
2.2 常量生成器iota
常量声明可以使用常量生成器iota
初始化。 iota
用于生成一组相似规则初始化的常量,但是不用每一行都写一遍初始化表达式。
iota
常常用于枚举类型或者生成一些特定的常量序列。iota
在const
关键字出现时被重置为0,每当const
关键字被使用一次,iota
的值就会自动加1。
例如我们常用的东西南北4个方向,可以首先定义一个Direction 命名类型,然后为东西南北各定义一个常量,从北0开始。 示例如下:
type Direction int
const (
North Direction = iota
East
South
West
)
在以上的声明中,North 值为 0, East 值为 1, 其余以此类推。
2.3 延迟明确常量的具体类型
Go语言的常量有一个不同寻常之处, 虽然一个常量可以有任意一个确定的基础类型(例如 int 或 float64,类似 time.Duration 这样的基础类型),但是许多的常量并没有一个明确的基础类型。编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精密的算术运算。未明确类型的常量类型有6种
二、运算符的使用和优先级
运算符
-
算术运算符:+、-、*、/、%(取模运算符)
-
比较运算符:==、!=、<、<=、>、>=
-
逻辑运算符:&&、||、!
-
位运算符:&、|、^、<<(左移运算符)、>>(右移运算符)
-
赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
-
其他运算符:&(取地址符)、*(指针运算符)、<-(channel 操作符)
运算符优先级:
从高到低依次为:
括号:()
单目运算符:+(正号)、-(负号)、!、^、(指针运算符)、&(取地址符)
乘法和除法:、/、%
加法和减法:+、-
移位运算符:<<、>>
按位与:&
按位异或:^
按位或:|
关系运算符:==、!=、<、<=、>、>=
逻辑运算符:&&
逻辑运算符:||
赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
其中,优先级相同的运算符遵循从左到右的结合顺序。因此,在表达式中,先计算优先级高的运算符,再计算优先级低的运算符。如果需要改变计算顺序,可以使用括号改变运算符的优先级。
总结
本文介绍了 Go 语言中变量和常量的基本概念,包括变量的声明和赋值、变量的作用域以及常量的声明方式和生成器iota的使用。此外,还介绍了 Go 语言中常用的运算符及其优先级。通过本文的学习,读者可以掌握 Go 语言中变量和常量的使用方法,以及如何使用运算符进行基本的算术和逻辑运算。