05 go语言(golang) - 常量和条件语句

常量

在Go语言中,常量是使用 const 关键字定义的,并且一旦被赋值后,它们的值在程序运行期间不能改变。常量可以是字符、字符串、布尔或数值类型。

基本特性

  1. 不可修改:一旦一个常量被定义,它的值就不能被更新。
  2. 编译时求值:常量表达式的值在编译时就已经确定,而不是在运行时。
  3. 提高性能:使用常量可以避免程序运行时进行重复计算,从而提高效率。
  4. 类型安全:你可以为常量指定具体类型,以确保数据安全和清晰的意图表达。

定义常量

你可以单独声明每个常量,也可以在一个块中声明一组相关的常量:

package mainimport "fmt"const pi = 3.14159265358979const (a = 1b = "2"
)func main() {fmt.Println(pi)fmt.Println(a, b)//a = 2 // 报错,不能修改常量
}

类型和无类型

Go语言中的常量可以是有类型或无类型。无类型的常数拥有更高的灵活性,因为它们可以根据需要自动适应其环境(赋给不同类型变量时自动转换)。

	const c = 123   // 无类型整数var d int64 = c // 可以直接赋给int64变量fmt.Println(d)const e float32 = 3.14 // 明确指定float32类型//var f int32 = e        // 这会引发编译错误因为c已经明确其为float32型

iota枚举器

Go语言提供了一个特殊的关键字 iota ,这个关键字用来生成一系列相似规则初始化的整数。每当 const 出现时将被重置为0, 每定义一个新项 iota 就会自增,这种机制非常适合用于定义枚举类数据。

package mainimport "fmt"// 常量未被使用,编译不会报错
const (North = iota // 0East         // 1South        // 2West         // 3
)// 整数自增,就算是从负数开始
const (v1 = iota - 3 // 从0 开始,如果需要可以自定义偏移量_             // 占位符,空出一个数v2            // -1v3            // 0v4            // 1
)func main() {fmt.Println(v1, v2, v3, v4)
}

常量未使用不报错

1. 变量未使用报错

当你声明一个局部变量但没有在其作用域内使用它时,Go编译器会报错。这是一种编程实践上的鼓励,目的是帮助开发者避免程序中出现无用代码或潜在的错误。例如,声明了一个变量却没有使用可能意味着某些逻辑被遗漏或者写错了。

func myFunction() {var a int = 5 // 如果后续代码中没有使用到a, 编译将失败
}

2. 常量未使用不报错

对于常量,情况则不同。你可以声明一个或多个常量而不立即使用它们,编译器不会报错。这主要是因为常量通常定义为包级别(全局),供整个包甚至外部包(如果是公开的)中多处地方引用。

由于常量值在编译时就已确定,并且存储方式高效(通常直接嵌入到最终二进制代码中),所以即使定义了但未被直接引用也不会导致运行时性能损失或额外内存消耗。

const Pi = 3.14 // 即使Pi没有被立即使用, 这也是合法且无错误提示的。

3. 设计哲学

Go语言设计者通过这种方式强化了一些语言设计原则:

  • 对于局部变区域性管理:鼓励只保留必要的局部变量来减少复杂度和潜在错误。
  • 对于全局区域放宽限制:允许灵活定义可重复利用、跨文件甚至跨包访问的静态数据。

条件语句

if语句

在Go语言中,if 语句是用来测试某个条件的布尔表达式的真假,并根据结果执行相应代码块的控制结构。Go语言中的 if 语句具有清晰简洁的语法,和其他编程语言类似,但也有一些独特之处。

基本结构

基本的 if 语句包括一个条件表达式和一个当条件为真时执行的代码块:

if 条件 {// 条件为 true 时执行
}

条件 必须是一个返回布尔值(true 或 false)的表达式或者变量。

完整结构

package mainimport "fmt"func main() {var condition1 = falsevar condition2 = trueif condition1 {fmt.Println("条件1为真")// 对于多重条件判断,可以使用一个或多个 `else if` 分支:} else if condition2 {fmt.Println("条件2为真")} else {// 如果你还需要在条件不满足(即为 false)时执行某些操作,则可以使用 `else` 子句:fmt.Println("条件1和条件2都为假")}
}

初始化语句

Go 的 if 可以包含一个可选的初始化语句,在评估条件之前运行。这常用于局部变量定义和初始化。该变量作用域限定在 if, else if, 和 else 块内。

if 初始化声明的变量; 条件 {// 使用初始化声明的变量进行操作 
}

例如:

package mainimport ("fmt"
)func main() {// if语句内可以访问xif x := computeValue(); x > 0 {fmt.Printf("x 的值为%d,是正数", x)} else if x < 0 {fmt.Printf("x 的值为%d,是负数", x)} else {fmt.Printf("x 的值为%d,不是正数也不是负数", x)}
}func computeValue() int {var val intfmt.Println("输入一个数字:")fmt.Scanf("%d", &val)return val
}

嵌套及多条件的与或

	if 1 > 0 || 2 < 3 {fmt.Println("第一个判断为真")if true == false && true == true {fmt.Println("第二个判断为真")} else {fmt.Println("第二个判断为假")}}

注意事项

  • 在 Go 中,不能像python那样将非布尔类型(如整数)直接用作布尔表达式。
  • 每个左大括号 {} 必须放在控制结构关键字 (if, else) 同一行上。
  • 初始化子句中声明的任何变量都只能在所有相关联的逻辑块内访问。

练习

用户输入一个数字,看是否与程序随机生成的一样,后续学了循环再做成一直猜的

package mainimport ("fmt""math/rand"
)func main() {fmt.Println("猜猜看,请输入我想1-100数字:")var targetNumber int = rand.Intn(100) + 1 // 随机生成1-100的数字,左闭右开,不加一的话是0到99if number := inputNumber(); number > targetNumber {fmt.Printf("比 %d 小,答案是:%d", number, targetNumber)} else if number < targetNumber {fmt.Printf("比 %d 大,答案是:%d", number, targetNumber)} else {fmt.Println("恭喜!猜对了!")}}func inputNumber() int {var number int_, err := fmt.Scanf("%d", &number)if err != nil {fmt.Println("输入有误请重新输入!")return inputNumber()}return number
}

switch语句

switch 语句是一种控制结构,用于基于不同的条件执行不同的代码块。

在Go语言中,switch 语句提供了一种处理多路分支的方式,它比多个 if-else 块更清晰和更直观。Go的 switch 语句有几个特点使其与其他语言中的类似结构不同:

1. 自动终止

在Go中,每个 case 分支默认自带 break,意味着不需要显式地在每个 case 结尾添加 break。这避免了其他语言常见的通过忘记写 break 而导致的错误。

2. 不限制常量

Go 的 switch 不仅可以对常量进行判断,还可以对表达式或者函数返回值进行判断。

3. 可以省略条件表达式

如果省略了条件表达式,则默认为真(true),这使得它可以替代多层嵌套的if-else结构。

基本用法

	x := 2switch x {case 1:fmt.Println("为1")case 2:fmt.Println("为2")default:fmt.Println("不为1也不为2")}

使用表达式

	score := 88switch {case score >= 90:fmt.Println("优")case score >= 80:fmt.Println("良")default:fmt.Println("及格或差")}

在上面的例子中,由于没有给出具体要比较的变量或值,所以每一个 case 的条件是一个返回布尔值的表达式。

多值匹配

一个 case 可以同时测试多个可能匹配项:

	number := rand.Intn(10)switch number {case 1, 2, 3:fmt.Println("1-3")case 4, 5, 6:fmt.Println("4-6")case 7, 8, 9:fmt.Println("7-9")default:fmt.Println("0")}

类型匹配(Type Switch)

类型匹配让你能够根据类型而非值来决定执行哪段代码:

package mainimport "fmt"func main() {catchType(123)catchType("adb")catchType(3.4)catchType(true)}/*
空接口可以接收任何类型的值。关于接口后面我们再展开学习
*/
func catchType(i interface{}) {// 关键字 type 告诉 Go 这是一个特殊的 switch 声明,即“Type Switch”。switch v := i.(type) {case int:fmt.Printf("%v 是 int 类型\n", v)case float64:fmt.Printf("%v 是 float64 类型\n", v)case string:fmt.Printf("%v 是 string 类型\n", v)default:fmt.Printf("%v 是未知类型!\n", v)}
}

这里使用特殊形式 .() 来断言类型,并且使用关键字 type, 这样就能够根据接口变量实际存储内容类型来执行不同代码块。

goto语句

在 Go 语言中,goto 语句是一种无条件跳转语句,它允许程序的执行流程跳转到同一函数体内部的任意位置。goto 语句与标签(label)一起使用,标签是紧跟在冒号后面的一种标识符,用于标记代码中的特定位置。标签名必须是唯一的。

尽管 goto 在其他语言中常用于控制流,但在 Go 中通常不推荐使用,因为它可能导致代码难以理解和维护。

基本语法

labelName:
// 一些代码// 跳转到标签位置
goto labelName
// 跳转后的代码不会被执行

示例代码

package mainimport "fmt"func main() {login("123")login("abc")
}func login(password string) {// 不能写在这里,不然会把if语句的代码也归属到fail这个标签,循环执行//fail://	fmt.Println("登录失败")if password == "123" {goto success} else {goto fail}fail:fmt.Println("登录失败")
//	即使登录失败,也会执行success标签下的代码
success:fmt.Println("登录成功")
}// 标签不能写在函数外面
//fail:
//	fmt.Println("登录失败")

输出:

登录成功
登录失败
登录成功

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

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

相关文章

数据结构——笛卡尔树详解

数据结构——笛卡尔树 1&#xff0c;笛卡尔树的介绍2&#xff0c;笛卡尔树的构建3&#xff0c;笛卡尔树的代码实现 1&#xff0c;笛卡尔树的介绍 前面我们讲过《堆》和《二叉搜索树》&#xff0c;能不能把这两种数据结构的特性结合起来构造一棵新的树呢&#xff1f;当然是可以…

Qt-界面优化控件样式设置(72)

目录 描述 QPushButton 自定义复选框 输入框 列表框 菜单 实现登入界面 设置背景图 改变样式表 描述 这里介绍一些控件的样式设置 QPushButton 相关属性 font-size设置⽂字⼤⼩.border-radius设置圆⻆矩形. 数值设置的越⼤, ⻆就 "越圆".background-colo…

离散数学 第二讲 特殊集合和集合间关系 笔记 [电子科大]王丽杰

1.2 特殊集合与集合间关系 空集 不含任何元素的集合叫做空集(empty set)&#xff0c;记作∅. 空集可以符号化为 ∅ { x ∣ x ≠ x } ∅ \{ x|x ≠ x\} ∅{x∣xx} . 空集是绝对唯一的。 全集 针对一个具体范围&#xff0c;我们考虑的所有对象的集合叫做全集(universal se…

vulnhub-Kioptrix4靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 udf提权 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.202.134) 靶 机&#xff1a;Linux 2.6.24 2、使用工具/软件 …

Oracle分布式数据库的安装遇到的问题【已解决】:找不到scott用户、出现【INS-30014】错误、oracle登录适配器错误

Oracle分布式数据库的安装遇到的问题【已解决】&#xff1a;找不到scott用户、出现【INS-30014】错误、oracle登录适配器错误 安装oracle19c软件利用Database Configuration Assistant&#xff0c;创建orcl数据库第一步&#xff1a;在开始菜单找到Oracle&#xff0c;点击“Data…

SpringColoud GateWay 核心组件

优质博文&#xff1a;IT-BLOG-CN 【1】Route路由&#xff1a; Gateway的基本构建模块&#xff0c;它由ID、目标URL、断言集合和过滤器集合组成。如果聚合断言结果为真&#xff0c;则匹配到该路由。 Route路由-动态路由实现原理&#xff1a; 配置变化Apollo 服务地址实例变化…

Axure使用echarts详细教程

本次使用的axure版本为rp9,下面是效果图。 接下来是详细步骤 【步骤1】在axure上拖一个矩形进来&#xff0c;命名为myChart(这个根据实际情况来,和后面的代码对应就好) 【步骤2】 点击交互->选择加载时->选择打开链接->链接外部地址 点击fx这个符号 【步骤3】在弹…

前端学习笔记(1.0)

在开发项目时&#xff0c;需要使用符号来代替书写./和../等麻烦的路径书写&#xff0c;所以就遇到了下面的问题。 输入没有路径提示 我们都知道&#xff0c;设置是通过配置vite等脚手架工具的配置文件&#xff0c;设置别名即可。 但是如果需要在使用的时候需要出现路径提示&…

虚拟滚动列表如何实现?

highlight: a11y-dark 虚拟滚动列表&#xff0c;虚拟滚动的关键在于只渲染当前视口内可见的数据项&#xff0c;而不是一次性渲染所有数据项。这可以显著提高性能&#xff0c;尤其是在处理大量数据时。 以下是一个完整的虚拟滚动列表的示例代码&#xff1a; <!DOCTYPE htm…

React高级Hook

useReducer useReducer 是 React 提供的一个 Hook&#xff0c;用于在函数组件中使用 reducer 函数来管理组件的 state。它类似于 Redux 中的 reducer&#xff0c;但仅用于组件内部的状态管理。useReducer 可以使复杂的状态逻辑更加清晰和可维护。 基本用法 useReducer 接收…

1.前提配置 关防火墙 关selinux

1.前提配置 关防火墙 关selinux 2.安装web服务程序nginx 未安装则需重新设置挂载点 若已安装&#xff0c;则查看系统中是否存在 3.当前主机添加多地址&#xff08;ip a&#xff09; 配置了三个IP地址 查看IP地址是否配置成功 4.自定义nginx配置文件通过多地址区分多网站 /…

使用JMeter进行Spring Boot接口的压力测试

使用 Apache JMeter 对接口进行压力测试是一个相对简单的过程。以下是详细的步骤&#xff0c;包括安装、配置和执行测试计划。 1. 下载和安装 JMeter 下载 JMeter 从 JMeter 官方网站https://jmeter.apache.org/download_jmeter.cgi 下载最新版本的 JMeter。 解压缩 将下载的 …

02.数据结构介绍顺序表、链表简述+对比

目录 一、什么是数据结构 二、线性表 三、顺序表 四、链表 五、顺序表和链表的区别 一、什么是数据结构 数据结构是由“数据”和“结构”两个词组合而来。 数据&#xff1a;常见的数值1、2、3......&#xff0c;网页里的文字图片信息等都是数据。 结构&#xff1a;组织数据…

【从零开始的LeetCode-算法】3184. 构成整天的下标对数目 I

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…

leetcode动态规划(九)-0-1背包理论基础

题目 背包问题主要有以下几种分类&#xff0c;对于面试来说掌握0-1背包和完全背包足够&#xff0c;多重背包和分组背包是竞赛级别的题目&#xff0c;面试就无需准备 题目&#xff1a; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价…

C# SM2 加签、验签工具

目录 效果 项目 代码 下载 效果 项目 代码 using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Signers; using Org.BouncyCastle.Asn1.GM; using System; using System.Text; using System.Windows.Forms; using Org.BouncyCastle.Asn1.X9; using…

element plus e-table表格中使用多选,当翻页时已选中的数据丢失

摘要&#xff1a; 点击第一页选中两个&#xff0c;再选择第二页&#xff0c;选中&#xff0c;回到第一页&#xff0c;之前选中的要保留&#xff01; element ui table 解决办法&#xff1a; :row-key“getRowKeys” &#xff08;写在el-table中&#xff09; methods中声明 ge…

Spring Boot项目中怎么设置内容安全策略Content Security Policy

内容安全策略&#xff08;CSP&#xff0c;Content Security Policy&#xff09; 是一种用于防止跨站点脚本攻击&#xff08;XSS&#xff09;和数据注入攻击的安全策略。它通过指定允许加载的资源类型&#xff08;如脚本、样式表、图像等&#xff09;和其来源&#xff0c;来减少…

Python爬虫之小白入门保姆级教程,带7个爬虫小案例(附源码)!

以下是一份 Python 爬虫入门保姆级教程&#xff1a; 一、准备工作 安装 Python 前往 Python 官方网站&#xff08;https://www.python.org/&#xff09;下载适合你操作系统的 Python 版本并安装。安装过程中可以勾选“Add Python to PATH”以便在命令行中方便地调用 Python。 …

初识git · 有关模型

目录 前言&#xff1a; 有关开发模型 前言&#xff1a; 其实文章更新到这里的时候&#xff0c;我们已经学习了可以满足我们日常生活中的基本需求的指令了&#xff0c;但是为什么要更新本篇文章呢&#xff1f;是因为实际生活中我们对于开发工作&#xff0c;运维工作&#xff…