编程笔记 Golang基础 009 标识符和关键字

编程笔记 Golang基础 009 标识符和关键字

  • 一、标识符
  • 二、标识符分类
    • (一)空白标识符(又称下划线 `_`)
    • (二)预声明标识符
    • (三)唯一标识符
    • (四)导出标识符
  • 三、关键字
  • 小结

标识符在编程语言中,包括Go语言,是一个用于命名各种程序实体的名称。这些实体可能包括变量、常量、函数、类型、包、结构体、接口等。简单来说,标识符就是程序员为程序中的各个组成部分所起的名字。
关键字在编程语言中是具有特殊含义的预定义标识符,它们不能用作变量名、函数名或其他用户自定义的标识符。关键字是由编程语言设计者保留的,用于实现特定语义或结构的关键字词组。

一、标识符

标识符在编程语言中,包括Go语言,是一个用于命名各种程序实体的名称。这些实体可能包括变量、常量、函数、类型、包、结构体、接口等。简单来说,标识符就是程序员为程序中的各个组成部分所起的名字。

在Go语言中,标识符的命名规范如下:

  1. 组成:标识符由字母(Unicode字母,可以包含非ASCII字符)、数字和下划线(_)组成。
  2. 首字符要求:标识符必须以一个字母或下划线开头,不能以数字开头。
  3. 大小写敏感:Go是大小写敏感的语言,因此myVariableMyVariable是两个不同的标识符。
  4. 保留字限制:标识符不能使用Go语言的保留关键字作为名称。
  5. 空标识符:下划线 _ 也是一个有效的标识符,它通常用作占位符或者用于忽略函数返回值,但不应作为常规标识符使用。
  6. 驼峰命名法:Go语言推荐使用驼峰命名法(Camel Case),对于普通的局部变量和函数名,一般采用小驼峰式(lowerCamelCase),即首个单词首字母小写,后续每个单词首字母大写;而对于公开的(导出的)包成员(如变量、常量、类型、函数和方法),则建议使用大驼峰式(UpperCamelCase),即所有单词首字母均大写。

示例:

// 正确的标识符命名
var myVariable int
func myFunction() {}
type user struct{}
const maxItems uint = 100// 公开(导出)的标识符应以大写字母开头
package somePackage
var PublicVar int
func PublicFunc() {}
type PublicType struct{}

此外,Go语言还强调代码的可读性和一致性,鼓励开发者使用有意义且描述性强的标识符名称来提高代码的可维护性。

二、标识符分类

(一)空白标识符(又称下划线 _

Go语言中的空白标识符(又称下划线 _)是一个特殊的标识符,它具有多种用途和特性:

  1. 忽略值

    • 在函数返回多值时,如果不需要某个返回值,可以使用空白标识符来接收并丢弃这个值。
      func multipleReturns() (int, error) {// ...return 42, nil
      }_, err := multipleReturns()
      // 这里只关心错误信息,因此用_来忽略第一个返回值
      
  2. 导入包而不使用其导出成员

    • 当你仅需要导入一个包以触发它的初始化代码执行(比如注册http处理程序),但并不直接使用该包的任何导出项时,可以使用空白标识符导入该包。
      import _ "net/http/pprof"
      
  3. 循环中忽略元素

    • for range 循环中,如果你只需要迭代中的一个值而不需要另一个值,可以将不关注的值赋给空白标识符。
      for _, c := range "hello" {fmt.Println(c)
      }
      // 这里仅打印字符串中的每个字符,不关心字符的索引位置
      
  4. 类型断言

    • 空白标识符可用于类型断言以检查接口类型的实现,但并不存储实际的值。
      var reader io.Reader
      var _ io.Writer = reader // 如果reader不是io.Writer类型,这里会编译失败
      
  5. 匿名占位符

    • 空白标识符由于没有名称,常被看作是匿名占位符,用于在语法上满足某些需求,但实际上并不引用或存储任何数据。

总之,Go语言中的空白标识符是一种灵活的工具,主要用于在编程中表示对某个值或功能的有意忽视,或者用于特定的语义场景。

(二)预声明标识符

在Go语言中,预声明标识符是指那些在编译器内部已经定义和初始化的标识符,它们可以直接在任何包内使用,无需进行导入或其他显式声明。这些预声明标识符包括:

  1. 布尔型常量

    • truefalse
  2. 空值

    • nil,它代表了接口、指针、映射、切片和通道类型的零值。
  3. 内置类型名称

    • 基本数字类型:int, int8, int16, int32, int64, uint, uint8 (别名 byte), uint16, uint32, uint64, uintptr
    • 浮点数类型:float32, float64
    • 复数类型:complex64, complex128
    • 字符串类型:string
    • 编程原语:rune(用于表示单个Unicode码点,等同于int32
    • 时间相关类型:time.Duration
  4. 内置函数

    • 数组、切片和映射操作:append, copy, delete, len, cap
    • 类型断言与转换:new, make, typeAssert
    • 数据类型判断与转换:panic, recover, iota, interface{}(空接口)
    • 格式化与打印:print, println, fmt.Printf 等一系列来自 fmt 包的全局函数
    • 内存分配与处理:unsafe.Sizeof, unsafe.Alignof, unsafe.Offsetof, unsafe.Pointer
  5. 特殊常量

    • iota 是一个特殊的常量生成器,用在常量声明时自增计数。

需要注意的是,尽管有些预声明的标识符是函数或者具有类似函数的行为,但它们并非传统意义上的关键字,因为它们是可以被重新声明或赋值的。然而,这通常不推荐这样做,以免混淆代码逻辑并违反最佳实践。预声明标识符主要是为了提供方便的基础功能,使得开发者可以快速且高效地编写Go程序。

(三)唯一标识符

在Go语言中,标识符(identifiers)用于命名程序的各个组成部分,如变量、常量、函数、类型等。标识符的唯一性是基于其作用域和名称来实现的:

  1. 名称唯一性
    在同一作用域内,每个标识符必须具有唯一的名称。这意味着在同一文件、函数或块内部,你不能重复声明同名的变量、函数或其他标识符。例如,在同一个包里,你不能有两个同名的函数或类型。

    // 错误示例:在同一作用域内不能有相同名称的函数
    func myFunction() {// ...
    }func myFunction() { // 编译错误:重复定义// ...
    }
    
  2. 大小写敏感
    Go语言是大小写敏感的,因此MyVarmyvar被认为是两个不同的标识符。

  3. 导出规则与唯一性
    对于公开(exported)标识符,即首字母大写的标识符,它们在整个包外部也是唯一的。也就是说,不同包内的两个公开标识符可以有相同的名称,但当它们被导入到另一个包时,通过包名进行限定以确保唯一性。

    package pkgAtype MyType struct{}// 在另一个包pkgB中
    package pkgBimport ("pkgA"
    )// 这里使用了完全限定的名字来引用pkgA中的MyType
    var a pkgA.MyType
    
  4. 作用域内的唯一性
    即使两个不同的包内存在相同名称的非公开标识符,只要它们在各自的作用域内不冲突,也不会产生问题,因为它们无法相互访问。

  5. 嵌套作用域
    在嵌套的作用域中,内部作用域可以重用外层作用域已使用的标识符,但这仅限于内部作用域,并不会影响外层作用域中该标识符的原有含义。

综上所述,在Go语言中,标识符的唯一性是由其名称、作用域以及大小写敏感性共同保证的。在合适的范围内,标识符必须保持唯一,而跨越不同范围时,可以通过包名等机制区分。

(四)导出标识符

在Go语言中,导出标识符是指那些可以被其他包访问的变量、常量、类型、函数和方法。Go语言通过标识符的首字母大小写来控制其可见性:

  1. 导出规则

    • 如果一个标识符(包括但不限于变量名、函数名、类型名等)的第一个字符是大写字母(Unicode类别“Lu”),那么这个标识符就是导出(exported)的。
    • 如果一个标识符的第一个字符是小写字母或下划线,则它不是导出的,只能在定义它的同一个包内使用。
  2. 示例

    package mypackage// 导出的变量
    var ExportedVar = "This is exported"// 非导出的变量
    var unexportedVar = "This is not exported"// 导出的函数
    func ExportedFunc() {// ...
    }// 非导出的函数
    func unexportedFunc() {// ...
    }// 导出的类型
    type ExportedType struct {Field string
    }// 导出的方法
    func (e ExportedType) ExportedMethod() {}// 非导出的方法
    func (e ExportedType) unexportedMethod() {}
    
  3. 外部包访问
    其他包想要访问mypackage中的导出标识符时,需要通过导入声明,并使用包名加上标识符的方式来引用:

    package mainimport ("mypackage"
    )func main() {// 访问导出的变量fmt.Println(mypackage.ExportedVar)// 调用导出的函数mypackage.ExportedFunc()// 创建并使用导出的类型e := mypackage.ExportedType{Field: "Value"}e.ExportedMethod()
    }
    

总结来说,在Go语言中,如果你想让某个标识符能够被其他包所看见和使用,那么必须确保该标识符以大写字母开头。这是Go语言实现封装和模块化设计的重要手段之一。

三、关键字

关键字在编程语言中是具有特殊含义的预定义标识符,它们不能用作变量名、函数名或其他用户自定义的标识符。关键字是由编程语言设计者保留的,用于实现特定语义或结构的关键字词组。

Go语言中的关键字如下:

  1. break:用于退出循环(如for或switch)。
  2. default:在switch语句中表示默认分支。
  3. func:用于声明函数和方法。
  4. interface:用于定义接口类型。
  5. select:用于并发编程中的通信控制,与channel操作相关联,类似于一个基于channel的多路复用选择器。
  6. case:在switch或select语句中定义条件分支。
  7. chan:用于创建通道类型,支持Go的并发特性。
  8. defer:用于延迟执行函数调用,直到包含它的函数返回时才执行。
  9. struct:定义结构体类型。
  10. goto:跳转到标签(label)处。
  11. package:定义代码包。
  12. switch:用于条件多路选择。
  13. const:声明常量。
  14. fallthrough:在switch语句中使用,使得匹配的case之后不再检查其他条件,直接执行下一个case的语句块。
  15. map:声明映射类型。
  16. ifelse:用于条件判断。
  17. range:用于迭代数组、切片、字符串、映射以及channel中的元素。
  18. type:声明新类型或别名类型。
  19. continue:在循环中跳过当前迭代的剩余部分,进入下一轮迭代。
  20. for:通用循环语句,可以配合初始化、条件和后置表达式使用。
  21. import:导入其他包。
  22. return:从函数或方法返回值。
  23. var:声明变量。
  24. go:启动一个新的并发goroutine来执行函数。
  25. goto:虽然存在,但在Go语言中不推荐使用,用于无条件跳转到同文件内的标记位置。

这些关键字对于理解和编写Go程序至关重要,它们构建了Go语言的语法基础,并且赋予了语言独特的特性和功能。

小结

标识符和关键字是构成编程语言的基础。后面将逐渐展开。

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

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

相关文章

【咕咕送书 | 第七期】世界顶级名校计算机专业,都在用哪些书当教材?

🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式:关注博主、点赞、收藏、评论,任意评论(每人最多评论…

如何让qml使用opengl es

要让 QML 使用 OpenGL ES,您需要确保项目配置正确,并在应用程序中使用 QSurfaceFormat 来设置 OpenGL ES 渲染。 以下是一些步骤来配置 QML 使用 OpenGL ES: 1、项目配置:在您的项目配置文件(例如 .pro 文件&#xf…

航空航天5G智能工厂数字孪生可视化平台,推进航空航天数字化转型

航空航天5G智能工厂数字孪生可视化平台,推进航空航天数字化转型。随着科技的不断发展,数字化转型已经成为各行各业关注的焦点。航空航天业作为高端制造业的代表,也在积极探索数字化转型之路。为了更好地推进航空航天数字化转型,一…

SOLIDWORKS Electrical如何设置并编辑报表

在电气设计工作中因生产需要,很多企业都会要求电气工程师在图纸中插入设备清单报表。比如在设计机柜布局的时候,在相关设计图纸中插入报表清单可以清楚的帮助了解接线、装配、调试的电气物料内容及对应图纸中的明细。 SOLIDWORKS electrical中就可以自动…

PHP实现分离金额和其他内容便于统计计算

得到的结果可以粘贴到excel计算 <?php if($_GET["x"] "cha"){ $tips isset($_POST[tips]) ? $_POST[tips] : ; $pattern /(\d\.\d|\d)/; $result preg_replace($pattern, "\t\${1}\t", $tips); echo "<h2><strong>数…

第六篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:深度解读Kaldi库个性化定制语音搜索引擎

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、雏形示例代码二、扩展思路介绍三、数据准备示例代码四、特征提取示例代码五、声学模型训练示例代码六、语言模型训练示例代码七、解码示例代码八、评估和调优示例代码九、…

MLflow【部署 01】MLflow官网Quick Start实操(一篇学会部署使用MLflow)

一篇学会部署使用MLflow 1.版本及环境2.官方步骤Step-1 Get MLflowStep-2 Start a Tracking ServerStep 3 - Train a model and prepare metadata for loggingStep 4 - Log the model and its metadata to MLflowStep 5 - Load the model as a Python Function (pyfunc) and us…

Autosar-Mcal配置详解-MCU

3.6.1创建、配置RAM 1)创建RAM配置 2)配置RAM 以F1KM R7F7016533ABG为例,它的local RAM有512K, global RAM 192K,Retention RAM 64K. Local RAM: local RAM就是程序平常使用的RAM,在DeepStop模式下内容会丢失。 Global RAM:主要用于DMA的源地址和目的地址使用,在Dee…

Web应用程序防火墙(WAF)与传统防火墙的区别

由于WEB应用防火墙&#xff08;WAF&#xff09;的名字中有“防火墙”三个字&#xff0c;因此很多人都会将它与传统防火墙混淆。实际上&#xff0c;二者之间的有着很大的差别。传统防火墙专注在网络层面&#xff0c;提供IP、端口防护。而WAF是专门为保护基于Web的应用程序而设计…

C# cass10 宗地初始化-根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层

运行环境Visual Studio 2022 c# cad2016 cass10 根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层 一、主要步骤 zdimport 方法&#xff1a;这个方法用于导入宗地信息。首先通过调用 AutoCAD API 获取当前活动文档、数据库和编辑器对象。然后根据 CreatePalette.Se…

在电脑上使用网络摄像头录制视频的 4 大方法

在线采访、会议、演示和一对一互动都通过网络摄像头进行。无论是制作教学视频还是回顾在线会议的重要细节&#xff0c;人们经常需要使用网络摄像头录制视频。 可以使用不同的方法和工具来处理此任务。在以下部分中&#xff0c;您将找到使用网络摄像头或从网络摄像头录制视频的…

2-1SDN(软件定义网络)环境测试实验(无默认控制器)-静态流表

控制器是为了更好集中控制网络的行为&#xff0c;当然在实际中我们可以根据需要选择是否选择控制器&#xff0c;或是结合ovs交换机的特点进行针对性的转发行为设置&#xff08;功能需要书写代码进行软件定义&#xff09;&#xff0c;转发功能需要手工添加流表才能实现 如&#…

【教学类-19-03-02】20240222《ABBABB式-规律排序涂色-A4竖版2份》(中4班)

背景需求 从材料库中找到一套“ABB彩色打印”学具&#xff0c;数数有27张&#xff0c;正好给中4班孩子使用 【教学类-19-03-01】20221127《ABBABB式-规律排序涂色-A4竖版2份》&#xff08;中班)_abb模式图片幼儿图颜色-CSDN博客文章浏览阅读1.2k次。【教学类-19-03-01】20221…

sudo apt update报错

sudo apt update 错误:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu focal InRelease 暂时不能解析域名“mirrors.tuna.tsinghua.edu.cn” 错误:2 http://ppa.launchpad.net/alexlarsson/flatpak/ubuntu focal InRelease 暂时不能解析域名“ppa.launchpad.net” 错误:3 …

题目 1209: 密码截获

题目描述: Catcher是MCA国的情报员&#xff0c;他工作时发现敌国会用一些对称的密码 进行通信&#xff0c;比如像这些ABBA&#xff0c;ABA&#xff0c;A&#xff0c;123321&#xff0c;但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA-…

TestNG与ExtentReport单元测试导出报告文档

TestNG与ExtentReport集成 目录 1 通过实现ITestListener的方法添加Reporter log 1.1 MyTestListener设置 1.2 输出结果 2 TestNG与ExtentReporter集成 2.1 项目结构 2.2 MyExtentReportListener设置 2.3 单多Suite、Test组合测试 2.3.1 单Suite单Test 2.3…

记一次 migo 报错 M7097 没有可用于物料 XXX 的库存过账

背景:公司重构SAP后&#xff0c;引入返利物料&#xff0c;此部分物料的数量统计单位是USD/CNY,不启用会计类视图&#xff0c;但是启用批次管理&#xff0c;但是正常物料不启用批次管理。这是大背景&#xff0c;物料类型为ZZZZ 但是实际需要的是 检查物料还是没有被用作其他方…

数字之美:探索人工智能绘画的奇妙世界

目录 引言AI绘画的定义与发展历程定义与发展历程AI绘画产品有哪些? AI绘画的应用领域设计与创意产业影视与游戏制作数字艺术与展览 AI绘画的基本原理与技术深度学习与神经网络生成对抗网络&#xff08;GAN&#xff09;风格迁移算法 AI绘画效果展示一只带着墨镜的小猫在高楼林立…

SQL 和 NoSQL 有什么区别?

主要差异&#xff1a; 1.类型 SQL数据库主要称为关系数据库&#xff08;RDBMS&#xff09;; 而NoSQL数据库主要称为非关系数据库或分布式数据库。 2.语言 SQL数据库定义和操作基于数据的结构化查询语言&#xff08;SQL&#xff09;。从侧面看这种语言是非常强大的。SQL是最…

echarts 设置柱状图边框颜色

代码如下&#xff1a; this.options {tooltip: {trigger: "axis",textStyle: {align: "left",},className: "custom-tooltip-box",formatter: function (params) {return <div classcustom-tooltip-style><div classtitle><spa…