【Go语言从入门到精通系列-基础篇】Go语言变量、常量和运算符:完全指南

系列文章目录

【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 stringage intprice 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 = 8local2 = 10local3 = local1 * local2fmt.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 intfunc main() {// 声明局部变量var local1, local2 int// 初始化参数local1 = 8local2 = 10global = local1 * local2fmt.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 = 999fmt.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常常用于枚举类型或者生成一些特定的常量序列。iotaconst关键字出现时被重置为0,每当const关键字被使用一次,iota的值就会自动加1。
例如我们常用的东西南北4个方向,可以首先定义一个Direction 命名类型,然后为东西南北各定义一个常量,从北0开始。 示例如下:

type Direction int
const (North Direction = iotaEastSouthWest
)

在以上的声明中,North 值为 0, East 值为 1, 其余以此类推。

2.3 延迟明确常量的具体类型

Go语言的常量有一个不同寻常之处, 虽然一个常量可以有任意一个确定的基础类型(例如 int 或 float64,类似 time.Duration 这样的基础类型),但是许多的常量并没有一个明确的基础类型。编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精密的算术运算。未明确类型的常量类型有6种

二、运算符的使用和优先级

运算符

  1. 算术运算符:+、-、*、/、%(取模运算符)

  2. 比较运算符:==、!=、<、<=、>、>=

  3. 逻辑运算符:&&、||、!

  4. 位运算符:&、|、^、<<(左移运算符)、>>(右移运算符)

  5. 赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

  6. 其他运算符:&(取地址符)、*(指针运算符)、<-(channel 操作符)

运算符优先级:

从高到低依次为:

括号:()
单目运算符:+(正号)、-(负号)、!、^、(指针运算符)、&(取地址符)
乘法和除法:
、/、%
加法和减法:+、-
移位运算符:<<、>>
按位与:&
按位异或:^
按位或:|
关系运算符:==、!=、<、<=、>、>=
逻辑运算符:&&
逻辑运算符:||
赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

其中,优先级相同的运算符遵循从左到右的结合顺序。因此,在表达式中,先计算优先级高的运算符,再计算优先级低的运算符。如果需要改变计算顺序,可以使用括号改变运算符的优先级。

总结

本文介绍了 Go 语言中变量和常量的基本概念,包括变量的声明和赋值、变量的作用域以及常量的声明方式和生成器iota的使用。此外,还介绍了 Go 语言中常用的运算符及其优先级。通过本文的学习,读者可以掌握 Go 语言中变量和常量的使用方法,以及如何使用运算符进行基本的算术和逻辑运算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1742.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何做一份干净的git提交记录

背景 毕业工作有一些年头了&#xff0c;之前在写工作代码或者给开源项目贡献的时候&#xff0c;提交代码都不是很规范&#xff0c;甚至可以说十分的随意&#xff0c;想到什么就提交什么&#xff0c;根本没有管理提交记录的概念或者想法&#xff08;当你身边的人都不怎么在意的…

【Flutter】built_value 解决 Flutter 中的不可变性问题

文章目录 一、 前言二、 什么是 built_value&#xff1f;三、 为什么我们需要 built_value&#xff1f;四、 如何在 Flutter 中安装和设置 built_value&#xff1f;五、 如何使用 built_value 创建不可变的值类型&#xff1f;六、 如何使用 built_value 创建枚举类&#xff1f;…

瓶盖扫码回收APP系统 废旧物品创造价值收益

资源回收再利用是近些年国家大力倡导的&#xff0c;人们也在积极践行&#xff0c;从垃圾回收、废旧衣物回收、烟盒回收等等.....今天小白要带大家了解的是瓶盖回收APP软件开发的相关事项。瓶盖回收APP是本着资源回收的初衷&#xff0c;可以时间废旧瓶盖的多次利用&#xff0c;减…

Springboot的自动装配解读

目录 1.Springboot的自动装配 1.1 组件装配 1.1.1 组件 1.2 Spring Framework 的模块装配 1.2.1 Import注解 1.2.2 BeanDefinition 1.3 Spring Framework 的条件装配 1.3.1 Profile 1.3.2 Conditional 1.3.3 MetaData元数据接口&#xff08;补充&#xff09; Annot…

LLM - Hugging Face 工程 BERT base model (uncased) 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131400428 BERT是一个在大量英文数据上以自监督的方式预训练的变换器模型。这意味着它只是在原始文本上进行预训练&#xff0c;没有人以…

报错:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

1.背景 编译项目或启动项目报错 2.解决方法 设置为对应的版本 3.完美

mybatis 模拟03

pom.xml: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

【python】—— 基础语法(二)

序言&#xff1a; 在上期&#xff0c;我们已经对python进行了初步的学习和了解。本期&#xff0c;我将继续带领大家学习关于python的基本知识&#xff01;&#xff01; 目录 &#xff08;一&#xff09;顺序语句 &#xff08;二&#xff09;条件语句 1、什么是条件语句 2、…

Vue2封装一个全局通知组件并发布到NPM

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;计算机学生 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;点击查看更多 &#x1f310;关键&#xff1a;vue2 组件封装 npm发包 文章目录 1. 前言 &#x1f343;2. 我为什么要封装通知插件 ❓3. 初始化vue空项目 &…

EasyDSS视频直播点播平台视频回看列表显示为ID的排查与优化

视频直播点播EasyDSS平台具备灵活的视频能力&#xff0c;包括直播、点播、转码、管理、录像、检索、时移回看等&#xff0c;平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等能力服务&#xff0c;可应用在无人机推流、在线直播、虚拟直播、远程培训等场景中。…

postgresql 从应用角度看快照snapshot使用,事务隔离控制不再神密

​专栏内容&#xff1a;postgresql内核源码分析 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 快照使用 快照是事务中使用&#xff0c;配合事务的隔离级别&#xff0c;体现出不同的可见性。…

商品减库在Redis中的运用

一.商品减库中存在问题 1.传统的代码 1.1引入jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.…