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

news2024/11/20 13:39:43

系列文章目录

【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常常用于枚举类型或者生成一些特定的常量序列。iotaconst关键字出现时被重置为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种

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

运算符

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

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

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

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

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

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

运算符优先级:

从高到低依次为:

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

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

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赶赴一场夏日盛宴丨千岛湖夏季团建旅行攻略

千岛湖的秀丽景色让人惊艳&#xff0c;也是江浙沪地区热门的团建目的地之一&#xff1b; 千岛湖 千岛湖团建元素&#xff1a;【千岛湖风景区】【山顶观景台】【皮划艇】【环湖骑行】【卡丁车】【高空闯关】【篝火晚会】【湖畔烧烤】【高空跳伞】 【千岛湖山顶观景台】 站在湖畔…

如何用快改图工具指定压缩图片大小

我们在遇到好看的图片或自己拍的照片&#xff0c;都会对其进行一些处理&#xff0c;处理完成后将其保存&#xff0c;保存时发现自己要存的图片太多了&#xff0c;比较占内容。这种情况就需要压缩。那么&#xff0c;在压缩图片时&#xff0c;怎么压缩图片到指定大小呢&#xff1…

【ES三周年】| 基于国产化操作系统搭建ELK日志分析平台

引入 鲲鹏认证-Kylin麒麟操作系统-ELK日志分析平台 开篇 何为ELK Stack&#xff1f;它又能够给我们带来什么&#xff1f; 综述 ELK为三个开源项目的首字母缩写&#xff0c;分别对应是&#xff1a;Elasticsearch、Logstash、Kibana&#xff0c;由这三个软件及其相关的组件可…

threejs 入门 (vite + vue3)

threejs threejs用于实现3D效果 vite创建vuejs项目 npm create vite选择vue 和js创建vue3项目 安装threejs npm install three运行项目 cd project npm i npm run dev修改App.vue 创建一个场景和立方体&#xff08;Creating a scene&#xff09; <script setup> …

labview 波形图表(waveform Chart)

波形图表&#xff08;waveform Chart&#xff09;是显示一条或多条曲线的特殊数值控件&#xff0c; 一般用于显示以恒定速率采集的数据。 波形图表会在缓冲区保留历史数据并在历史数据后添加新数据。 波形图表的默认数据缓冲区大小为1024个数据点。 &#xff08;右击波形图…

BurpSuite使用教程·代理抓包篇

BurpSuite使用教程代理抓包篇 1.Burp Suite代理和浏览器设置2.数据拦截与控制3.可选项配置4.Proxy监听设置1.Burp Suite代理和浏览器设置 Burp Suite代理工具是以拦截代理的方式,拦截所有通过代理的网络流量,如客户端的请求数据、服务器端的返回信息等。Burp Suite主要拦截h…

Mybatis源码分析_事务管理器 (5)

今天我们首先学习2个设计模式。工厂设计模式 和 模板设计模式 工厂方法模式&#xff1a; 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类实例化延迟到子类。 上图的图很清晰&#xff1a;业务接口有很多实现类&#xff0c;而工厂接口也有还…

保姆级自动化测试教程(Selenium+java)

文章目录 自动化测试1. 自动化测试介绍2. Selenium介绍与环境搭建2.1 介绍2.2 Selenium原理2.3 SeleniumJava环境搭建 3. webdriver API3.1 元素的定位3.2 操作测试对象3.3 添加等待3.4 打印信息3.5 浏览器操作3.6 键盘事件3.7 鼠标事件3.9 特殊使用3.10 浏览器关闭3.11 切换窗…

让你不再好奇ai绘画生成器有哪些

绘画爱好者李明最近遇到了一个难题&#xff1a;他需要在短时间内完成一幅复杂的数字油画作品&#xff0c;但是他的手绘技能仍然不够熟练。于是&#xff0c;他想到了借助一些ai绘画软件来帮助他进行绘画创作。那么&#xff0c;你知道ai智能绘画软件有哪些吗&#xff1f;接下来我…

Vue中使用ElementUItable表格显示图片问题

1.问题 说明&#xff1a;table表格显示不了图片问题 品牌logo中显示的是url地址&#xff0c;因此我们要使用作用域插槽。 <template slot scope"{row,$index}"> </template> 说明&#xff1a;使用Vue的插槽功能&#xff0c;允许在当前列的内容上添加…

git暂存功能(只需要两步)

使用场景 我在写一个功能的时候发现一个bug&#xff0c;但是这个bug在我上一次提交的时候好像是没有的&#xff0c;所有我需要把当前的代码暂存,然后查看上一次提交是否正常。 一、暂存 暂存当前所有的修改 git stash二、恢复 恢复最近一次暂存&#xff0c;并把暂存删掉 …

获阿布扎比政府11亿美元投资将使蔚来改变电动汽车行业游戏规则?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结 &#xff08;1&#xff09;6月20日&#xff0c;蔚来宣布与阿布扎比政府控股的投资公司CYVN Holdings签订了股份认购协议&#xff0c;蔚来将获得CYVN Holdings11亿美元的战略投资&#xff0c;这可能会导致蔚来在阿布扎…

从零开始 Spring Boot 50:Entity Lifecyle Event

从零开始 Spring Boot 50&#xff1a;Entity Lifecyle Event 图源&#xff1a;简书 (jianshu.com) 在上篇文章&#xff0c;我介绍了 Hibernate 中的实体生命周期以及可以转换实体状态的 Session API。就像 Spring Bean 的生命周期拥有一些事件&#xff0c;通过监听这些事件我们…

C# 中【委托】的简单理解

先不说 C# 中的委托编程&#xff0c;先从生活中的例子入手。 场景一&#xff1a; 防疫期间&#xff0c;外卖人员不能进入花园小区。外卖小哥到了花园小区门口&#xff0c;只好【委托】花园的保安人员&#xff0c;把东西送上楼去。 场景二&#xff1a; 有资格的人&#xff0c;都…

慢谈漫威--来龙去脉

慢谈漫威 背景介绍一、抛开电影看漫威相关公司背景、关系二、漫威宇宙和索尼漫威宇宙三、 漫威宇宙四、话外--美国6大影视公司 背景介绍 最近在看一部漫威电影&#xff0c;可能是年纪大了&#xff0c;看美国英雄大片以及系列电影提不起兴趣&#xff0c;各种人物背景关系也不清…

途乐证券|光伏概念发力上扬,好利科技涨停,隆基绿能等拉升

光伏概念28日盘中发力上扬&#xff0c;截至发稿&#xff0c;露笑科技、好利科技、宁波能源等涨停&#xff0c;中国动力、欧晶科技、聚合材料、鹿山新材等涨超5%&#xff0c;帝科股份、隆基绿能、福斯特等涨超3%。 露笑科技昨日晚间披露的半年度业绩预告&#xff0c;预计上半年归…

ST - 如何下载带有.ioc的官方工程

文章目录 ST - 如何下载带有.ioc的官方工程概述下载带有.ioc文件的官方工程的方法备注END ST - 如何下载带有.ioc的官方工程 概述 有些CubeMX的官方工程, 自己复现不出来. 但是官方工程是好使的. 这是, 可能差别就在工程配置上. 如果仅仅靠BC4比对官方工程和自己重建的工程, …

简单指令实现Docker构建镜像启动运行保存导出后再导入新环境完整全流程

项目场景及问题描述 本文做一个简单Docker使用指令指南&#xff0c;可快速实现Docker构建镜像、启动、运行、保存、导出后再导入新环境完整全流程。具体每一个指令又有很多参数和学问&#xff0c;大家可自行查询更详细的解释&#xff0c;本文可用于小白快速构建镜像并使用。 使…

【doxygen】doxygen 支持 markdown 公式

文章目录 配置 doxygenmarkdown 文件中插入公式在段落中插入公式公式居中显示公式分行显示效果展示 参考链接 配置 doxygen 在 Doxygen 配置文件&#xff08;通常是 Doxyfile &#xff09;中&#xff0c;确保以下选项已启用或设置&#xff1a; MARKDOWN_SUPPORT &#xff1a;设…

100种思维模型之心流理论思维模型-86

亚里士多德说&#xff0c; 人类的终极目标是获得幸福 &#xff01; 那么到底什么是幸福&#xff1f;如何才能获得幸福&#xff1f; 米哈里契克森米哈赖&#xff0c; 积极心理学奠基人之一&#xff0c; “心流” 理论的提出者&#xff0c;他在其著作《心流》一书中这样写道…