编程笔记 Golang基础 018 常量与变量

编程笔记 Golang基础 018 常量与变量

  • 一、常量
    • 常量的定义
    • iota
    • 特性
  • 二、变量
    • 变量定义
    • 变量作用域
    • 零值与初始化
    • 类型转换
    • 注意事项
  • 三、重要性

常量,就是在程序编译阶段就确定下来的值,而程序在运行时则无法改变该值。变量是程序的基本组成单位,用于存储和表示可变的数据。

一、常量

常量,就是在程序编译阶段就确定下来的值,而程序在运行时则无法改变该值。在Go程序中,常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等。

常量的定义

常量的定义格式如下:

Go
const identifier [type] = value

identifier 是你为常量指定的名字。
[type] 是可选的,用于显式指定常量的数据类型。如果不提供类型,则编译器会根据 value 的初始值自动推断出类型。
value 是常量的值,它可以是布尔型、数字型(包括整数、浮点数和复数)、字符串或其他常量表达式的结果。

实例

package mainfunc main() {const PI float64 = 3.14const PI2 = 3.1415 // 可以省略类型const (width  = 100height = 200)const i, j = 1, 2 // 多重赋值const a, b, c = 1, 2, "foo"
}

const同时声明多个常量时,如果省略了值则表示和上面一行的值相同

package mainimport "fmt"func main() {const (a1 = 100a2a3)fmt.Printf("a1: %v\n", a1)fmt.Printf("a2: %v\n", a2)fmt.Printf("a3: %v\n", a3)
}

运行结果
a1: 100
a2: 100
a3: 100

iota

iota 比较特殊,可以被认为是一个可被编译器修改的常量,它默认开始值是0,每调用一次加1。遇到 const 关键字时被重置为 0。

实例

package mainimport "fmt"func main() {const (a1 = iotaa2 = iotaa3 = iota)fmt.Printf("a1: %v\n", a1)fmt.Printf("a2: %v\n", a2)fmt.Printf("a3: %v\n", a3)
}

运行结果
a1: 0
a2: 1
a3: 2

使用_跳过某些值

package mainimport "fmt"func main() {const (a1 = iota_a2 = iota)fmt.Printf("a1: %v\n", a1)fmt.Printf("a2: %v\n", a2)
}

运行结果
a1: 0
a2: 2

iota声明中间插队

package mainimport "fmt"func main() {const (a1 = iotaa2 = 100a3 = iota)fmt.Printf("a1: %v\n", a1)fmt.Printf("a2: %v\n", a2)fmt.Printf("a3: %v\n", a3)
}

运行结果
a1: 0
a2: 100
a3: 2

特性

不可变性:一旦定义,常量的值就不能被更改。
类型安全:每个常量都有明确的类型,不能进行不兼容类型的隐式转换。
编译期确定:常量表达式的值在编译阶段就已经计算出来,而非运行时。
通过以上介绍,可以看出Go语言中的常量提供了简洁的方式来定义程序中不变的值,并且通过类型检查确保了程序的健壮性和可预测性。

二、变量

在Go语言中,变量是程序的基本组成单位,用于存储和表示可变的数据。以下是Go语言中关于变量的详解:

变量定义

  1. 基本格式

    var identifier type = value
    

    其中 identifier 是变量名,type 是变量的类型(如 int、string、float64 等),value 是初始值。例如:

    var name string = "Alice"
    var age int = 25
    
  2. 简写形式
    如果初始化时明确给出了变量的值,可以省略变量类型的声明,Go编译器会根据赋值表达式的类型自动推断变量类型。

    var name = "Bob" // 编译器推断name为string类型
    var age = 30    // 编译器推断age为int类型
    
  3. 同时声明多个变量
    同一行内可以声明多个同类型变量,用逗号分隔。

    var a, b, c int = 1, 2, 3
    
  4. 短变量声明
    在函数内部,还可以使用简化的变量声明方式,即:=操作符来同时声明并初始化变量,无需使用var关键字。此方式只适用于局部变量。

    func main() {x, y := 10, 20 // 声明并初始化x和y
    }
    
  5. 匿名变量(Blank Identifier)
    使用下划线 _ 作为变量名时,表示该变量被声明但不使用,主要用于忽略函数返回的多余值。

    _, err := someFunctionReturningMultipleValues()
    

变量作用域

  • 在函数外部声明的变量具有包级作用域,在整个包文件内可见,如果不加访问修饰符(如 var variableName),默认为包私有(不可从其他包直接访问)。
  • 在函数内部声明的变量具有局部作用域,仅在该函数内部可见。

零值与初始化

  • 如果没有显式初始化,变量将被赋予其类型的零值。比如整型为0,字符串为""(空字符串),布尔型为false等。
  • Go语言强烈鼓励显式初始化变量以提高代码可读性和减少未初始化变量的使用错误。

类型转换

虽然Go是静态类型语言,但在必要时可以通过显式转换操作将一种类型转换为另一种类型。

注意事项

  • 变量名必须遵循标识符命名规则,首字符不能是数字,可以包含字母(大小写敏感)、数字和下划线。
  • Go语言是静态类型语言,因此每个变量都具有固定的类型,并且编译器会在编译阶段检查类型一致性。

三、重要性

在程序设计中,常量(Constants)和变量(Variables)扮演着至关重要的角色,它们都是存储数据的基本元素,但各自的特性和使用场景各有不同:

  1. 常量的重要性:

    • 不变性与可靠性:常量的值一旦定义就不能改变,这为程序提供了确定性和稳定性。例如,在计算圆周率、物理常数或配置固定的错误代码时,使用常量可以确保这些数值在整个程序运行期间始终保持不变。
    • 提高可读性:通过命名良好的常量,可以增强代码的自解释性。比如,用 PI 替代具体的浮点数,使其他开发者更容易理解代码意图,减少阅读难度。
    • 防止意外修改:由于常量不可变,因此避免了因意外操作导致重要数据被修改的风险。
    • 编译时优化:编译器可以在编译阶段就对常量进行求值,并可能将常量直接内嵌到指令中,从而提高程序执行效率。
  2. 变量的重要性:

    • 动态数据处理:变量是程序中必不可少的数据容器,其值可以根据程序逻辑随时更改,用于存储用户输入、计算结果、状态标志等临时或变化的数据。
    • 灵活性:变量的存在使得程序能够响应不同的输入和条件,执行不同的操作,从而使程序具有适应性。
    • 内存管理:变量占用内存空间并允许程序分配和释放资源,这对于实现复杂算法和数据结构至关重要。
    • 控制流:循环变量、条件语句中的测试变量等都在程序流程控制中起到关键作用。

综上所述,常量和变量在程序设计中共同构建了一个灵活且可靠的数据模型,保证了程序既能够在必要时持有静态不变的数据,又能够根据需要处理动态变化的信息。同时,恰当的使用两者还能促进代码的清晰度、健壮性和性能优化。

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

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

相关文章

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

2024年华为OD机试真题-字符串拼接-Python-OD统一考试(C卷)

题目描述: 给定M(0<M<=30)个字符(a-z),从中取出任意字符(每个字符只能用一次)拼接成长度为N(0<N<=5)的字符串,要求相同的字符不能相邻,计算出给定的字符列表能拼接出多少种满足条件的字符串,输入非法或者无法拼接出满足条件的字符串则返回0。 输入描述: …

视频监控平台如何结合AI技术

视频监控平台与AI技术的结合为安防领域带来了革命性的进步。通过引入AI技术&#xff0c;视频监控平台可以实现对监控视频内容的智能分析、识别和理解&#xff0c;从而提高监控效率和准确性&#xff0c;为城市安全和管理提供有力支持。 首先&#xff0c;视频监控平台可以利用AI…

抖音数据挖掘软件|视频内容提取

针对用户获取抖音视频的需求&#xff0c;我们开发了一款功能强大的工具&#xff0c;旨在解决用户在获取抖音视频时需要逐个复制链接、下载的繁琐问题。我们希望用户能够通过简单的关键词搜索&#xff0c;实现自动批量抓取视频&#xff0c;并根据需要进行选择性批量下载。因此&a…

【Flink精讲】Flink任务调度机制

Graph 的概念 Flink 中的执行图可以分成四层&#xff1a; StreamGraph -> JobGraph -> ExecutionGraph -> 物理执 行图。 StreamGraph&#xff1a;是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。JobGraph&#xff1a; StreamGraph …

pytest+yaml【接口测试框架】需要解决的问题:

接口关联&#xff1a;如果有接口关联&#xff0c;那么在下一个接口里无法直接调用python里面的方法&#xff0c;而是需要在下一个接口里通过调用方法去覆盖原值【动态参数】如何在yaml中调用随机数的方法呢&#xff1f;random函数&#xff08;让YAML能够调用外部函数---热加载&…

[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的耕地占补平衡报备格式&#xff0c;现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见&#xff1a;软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&#xff08;插件&#xff09;&#xff0c;需要授权后才能使用&#xff1b; 本软件…

设计模式——抽象工厂模式

定义: 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;提供一个创建一系列或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 概述:一个工厂可以提供创建多种相关产品的接口&#xff0c;而无需像工厂方法一样&#xff0c;为每一个产品都提供一个具体…

open3d 连接两个点云

连接两个点云 一、连接两个点云二、代码三、结果1.coloud1点云2.cloud2点云3.cloud1 和 colud2 合并4.生成连接字段&#xff08;拼接颜色&#xff09; 四、相关链接五、问题与解决方案1.问题2.解决方案 一、连接两个点云 看代码吧。。。 二、代码 import numpy as np import…

数据结构-二叉树深度详解(附带源码)

目录 一、基本概念&#xff1a; 二、实现二叉树的数据结构&#xff1a; 三、二叉树性质&#xff1a; 四、相关计算 五、搜索二叉树&#xff1a;任何一颗树的左子树都比它小&#xff0c;右子树都比它大 六、二叉树的存储结构 七、二叉树基本操作 八、源码&#xff08;有需…

30天拿下Rust之前世今生

概述 随着软件开发的不断发展和进步&#xff0c;编程语言也在不断地涌现和更迭。其中&#xff0c;Rust作为一种相对较新的编程语言&#xff0c;已经在短短几年内引起了广泛的关注和讨论。Rust语言犹如一颗璀璨的新星&#xff0c;以其独特的设计理念和强大的性能优势&#xff0c…

Linux命令-chfn命令(用来改变finger命令显示的信息)

说明 chfn命令 用来改变finger命令显示的信息。这些信息都存放在/etc目录里的passwd文件里。若不 指定任何选项&#xff0c;则chfn命令会进入问答式界面。 语法 chfn(选项)(参数)选项 -f<真实姓名>或--full-name<真实姓名>&#xff1a;设置真实姓名&#xff1b…

使用pytest和allure框架实现自动化测试报告优化

pytest&#xff1a; 需要安装pytest和pytest-html(生成html测试报告&#xff09; pip install pytest 和 pip install pytest-html 命名规则 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头的类和方法&#xff0c;比unittest更加严谨 unittest&#x…

【centos】【vsftpd】FTP本地用户登录配置

目录 ftp与sftp安装vsftpd和ftp本地用户登录-不限制访问目录本地用户登录-限制访问目录有可能影响连接的问题pam认证selinux策略被动模式防火墙ipv4和ipv6 报错1、 530 Login incorrect2、500 OOPS: vsftpd: refusing to run with writable root inside chroot()3、227 Enterin…

day41WEB 攻防-通用漏洞XMLXXE无回显DTD 实体伪协议代码审计

本章知识点&#xff1a; 1 、 XML&XXE- 原理 & 发现 & 利用 & 修复等 2 、 XML&XXE- 黑盒模式下的发现与利用 3 、 XML&XXE- 白盒模式下的审计与利用 4 、 XML&XXE- 无回显 & 伪协议 & 产生层面 配套资源&#xff08;百度网盘&#x…

飞天使-linux操作的一些技巧与知识点7-devops

文章目录 简述devopsCICD 简述devops 让技术团队&#xff0c;运维&#xff0c;测试等团队实现一体式流程自动化 进阶版图 CICD 持续集成&#xff0c; 从编译&#xff0c;测试&#xff0c;发布的完成自动化流程 持续交付&#xff0c;包含持续集成&#xff0c;并且将项目部署…

C#之WPF学习之路(3)

目录 布局控件 布局控件概述 Panel基类 Grid控件&#xff08;网格布局&#xff09; 一、左右排列 二、上下排列 三、上下左右排列 四、跨列排列 五、固定列宽 六、调整行高和列宽 七、Grid显示网格线 总结 UniformGrid控件&#xff08;均分布局&#xff09; Stac…

代码随想录Day60 | 647. 回文子串 647. 回文子串

代码随想录Day60 | 647. 回文子串 647. 回文子串 647.回文子串516.最长回文子序列 647.回文子串 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串 状态 dp数组 dp[i][j] 表示字符串…

c++逻辑值bool使用介绍

在 C 中&#xff0c;bool 是一种基本数据类型&#xff0c;用于表示逻辑值&#xff0c;取值为 true 或 false。bool 类型通常用于条件判断和逻辑运算&#xff0c;是 C 中非常重要的数据类型之一。 以下是关于 bool 类型的详细介绍&#xff1a; 定义和赋值&#xff1a; bool i…

Vue v-for、v-if、v-show常见问题

vue使用v-for遍历对象时&#xff0c;是按照什么顺序遍历的&#xff1f;如何保证顺序&#xff1f; 会先判断对象是否存在iterator接口&#xff0c;如果有循环执行next()方法。 没有iterator的情况下&#xff0c;会调用Object.Keys()方法&#xff0c;在不同的浏览器中&#xff…