05 go语言(golang) - 常量和条件语句
常量
在Go语言中,常量是使用 const
关键字定义的,并且一旦被赋值后,它们的值在程序运行期间不能改变。常量可以是字符、字符串、布尔或数值类型。
基本特性
- 不可修改:一旦一个常量被定义,它的值就不能被更新。
- 编译时求值:常量表达式的值在编译时就已经确定,而不是在运行时。
- 提高性能:使用常量可以避免程序运行时进行重复计算,从而提高效率。
- 类型安全:你可以为常量指定具体类型,以确保数据安全和清晰的意图表达。
定义常量
你可以单独声明每个常量,也可以在一个块中声明一组相关的常量:
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("登录失败")
输出:
登录成功
登录失败
登录成功
相关文章:
05 go语言(golang) - 常量和条件语句
常量 在Go语言中,常量是使用 const 关键字定义的,并且一旦被赋值后,它们的值在程序运行期间不能改变。常量可以是字符、字符串、布尔或数值类型。 基本特性 不可修改:一旦一个常量被定义,它的值就不能被更新。编译时…...
【设计模式】深入理解Python中的适配器模式(Adapter Pattern)
深入理解Python中的适配器模式(Adapter Pattern) 在软件开发中,常常会遇到需要让不兼容的类或接口协同工作的问题。适配器模式(Adapter Pattern)是一种结构型设计模式,通过提供一个包装器对象,…...

RuoYi-Vue若依框架-后端设置不登陆访问(白名单)
找到SecurityConfig类 确认自己的需求 /*** anyRequest | 匹配所有请求路径* access | SpringEl表达式结果为true时可以访问* anonymous | 匿名可以访问* denyAll | 用户不能访问* fullyAuthenticated | 用户完全认证可…...
C语言初阶小练习2(三子棋小游戏的实现代码)
这是C语言小游戏三子棋的代码实现 test.c文件是用来测试的部分 game.h文件是用来声明我们说写出的函数 game.c文件是用来编写我们的功能实现函数部分 1.test.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu() {printf("***************…...
金融行业合同管理如何利用AI技术进行风险预警?
2024年以来,金融行业的发展主线被锚定,强调了防风险的基调,尤其是系统性风险的防范。金融工作的重点在于实现六个强大:强大的货币、强大的中央银行、强大的金融机构、强大的国际金融中心、强大的金融监管、强大的金融人才队伍。这…...

世界数字农业盛宴与技术探索,25年3月聚焦世界灌溉科技大会
由中国农业节水和农村供水技术协会、中国农垦节水农业产业技术联盟、北京物联网智能技术应用协会、振威国际会展集团主办的“世界灌溉科技大会”、“第11届北京国际数字农业与灌溉技术博览会”,定于2025年3月31日至4月2日在北京国家会议中心举办。 作为世界三大灌溉…...

二百六十九、Kettle——ClickHouse清洗ODS层原始数据增量导入到DWD层表中
一、目的 清洗ClickHouse的ODS层原始数据,增量导入到DWD层表中 二、实施步骤 2.1 newtime select( select create_time from hurys_jw.dwd_statistics order by create_time desc limit 1) as create_time 2.2 替换NULL值 2.3 clickhouse输入 2.4 字段选择 2.5 …...

Maya---骨骼绑定
调节骨骼大小 回车键确认骨骼 FK子集跟父集走 IK子集不跟父集走 前视图中按shift键添加骨骼 清零、删除历史记录,创建新的物体...

携手并进,智驭教育!和鲸科技与智谱 AI 签署“101 数智领航计划”战略合作协议
近日,上海和今信息科技有限公司(以下简称“和鲸科技”)与北京智谱华章科技有限公司(以下简称“智谱 AI”)签署“101 数智领航计划”战略合作协议。双方将携手营造智能化学科教育与科研环境,提供多种大模型工…...
牛客周赛63
https://ac.nowcoder.com/acm/contest/91592 好数 简单的判断两位数,且十位等于个位 #include <bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define int long long using namespace std; using ll long long; using pii …...
git restore恢复删除文件
新版本 在 Git 2.23 版本之后,Git 引入了一个新的命令 git restore,用于简化文件恢复操作。可以用 git restore 来恢复误删除的文件。下面是详细的使用方法: 1. 恢复工作区中删除的文件(未提交) 如果文件已被删除&a…...

MacOS13虚拟机VMware Workstation Pro 16安装
资源 安装unlocker 安装虚拟机 低版本的还没有MacOS13选项,这也是我安装低版本虚拟机踩过的坑 找个教程安装就可以了 省略…自己去找找教程… 过程中我使用桥接是不行的,没有网络,后面重新下一步一步的选择默认的网络重装后就好了&am…...
docker 数据管理,数据持久化详解 一
docker镜像是分层设计的,镜像出只读,通过镜像启动的容器添加一层可读写的文件系统,用户写入的数据表都保存在这层中。 容器的数据分层目录 LowerDir:image 镜像层,即镜像本身,制度 UpperDir:容…...

【ios】使用TestFlight将app分发给测试人员(超详细)
我的环境: macos系统是Ventura 13.0 xcode是14.2(后面发现至少需要15版本的xcode才能上传app) 证书生成 可以通过xcode生成Distribution类型的证书,如果你已经有的话那就忽略,这个证书也是备案时所需的。 我是已…...

证件照小程序源码,前后端稳定运行
演示:证寸照制作 运行环境: Linux Nginx PHP >5.6 MySQL>5.6 安装步骤: 1.下载源码上传至你的服务器宝塔面板 2.直接添加站点选择源码目录,新建数据库 3.设置代码执行目录为/web 4.在浏览器中输入你的域名,会提示安装,填写…...
java白嫖同事的从身份证里面提取省市区地址详细信息的工具类代码
/*** author sunpeiyang* date 2024/10/21 16:35*/ Slf4j public class MiTaAddressExtractor {/*** 获取详细地址** param fullAddress 身份证完整地址*/public static String getDetailedAddress(String fullAddress) {String[] addressArrays spliceDetailedAddress(fullAd…...
计算机网络基本架构示例2
一、企业内部网络架构 在一个中型企业中,通常会有以下的网络架构: - 核心层:由高性能的核心交换机组成,负责快速转发大量数据。例如采用具有高带宽和冗余功能的三层交换机,确保整个网络的稳定运行。它连接着各个部门的…...

无人机之室内定位技术篇
无人机的室内定位技术是实现无人机在室内环境中精准导航和定位的关键技术。由于室内环境复杂,卫星导航系统(如GPS)无法提供有效的信号,因此需要依赖其他室内定位技术。 一、主要技术类型 基于视觉的定位技术 原理:利…...
在ubuntu20.04中输入不存在shell命令时,报错ModuleNotFoundError的解决方案
这个问题出现过好几次,每次都比较困扰,以下的解决方案比较适合: 当我输入ubuntu无法识别的命令的时候,正常来说应该提示类似于 command not found 之类的字眼,但是系统确报了如下错误: Traceback (most r…...

互联网语言 互联网开发 互联网架构
JAVA和PHP是两种广泛应用于互联网开发的编程语言,它们在多个维度上展现出显著的不同。 JAVA是一种面向对象的编程语言,以其严谨、高效的特性而著称。JAVA的语法结构复杂且规范,强调封装、继承和多态等面向对象原则,适合构建大型企…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...