当前位置: 首页 > news >正文

编程笔记 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语言的语法基础,并且赋予了语言独特的特性和功能。

小结

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

相关文章:

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

编程笔记 Golang基础 009 标识符和关键字 一、标识符二、标识符分类(一)空白标识符(又称下划线 _)(二)预声明标识符(三)唯一标识符(四)导出标识符 三、关键字…...

vue3中mockjs模拟获取数据

开发项目的时候,如果后端接口没有出来,前端工程师也不必非得等接口出来才进行下步开发。可以使用mock.js来模拟接口数据,以下就是使用vue3设置hook函数来封装axios请求,配合mock.js来实现的代码,mock的官网 Mock.js 一…...

element ui 添加自定义方法

今天在修改 el-table 源码过程中遇到一个头大的问题,原本修改编译后,将 element的子目录lib下的文件复制到项目的响应目录里就可以了,但是,这次不知为何,编译老是出问题,实在没有办法,我就直接修…...

Hive UDF

当Hive提供的内置函数不能满足查询需求时,用户可以根据自己业务编写自定义函数(User Defined Functions, UDF), 然后在HiveQL中调用。 例如有这样一个需求:为了保护用户隐私,当查询数据的时候,需要将用户手机号的中间…...

python Opencv 中绘制图

目录 一:绘制直线 二:绘制矩形 三:绘制圆形 四:绘制椭圆...

imazing软件安全吗?2024中文永久免费许可证

以下是iMazing更多的使用场景描述: iMazing3Mac-最新绿色安装包下载如下: https://wm.makeding.com/iclk/?zoneid49816 iMazing3Win-最新绿色安装包下载如下: https://wm.makeding.com/iclk/?zoneid49817 1. 数据迁移 当你换新的iOS设…...

JavaScript:防抖与节流

文章目录 防抖(Debounce)节流 (Throttle) 在JavaScript中,防抖(debounce)和节流(throttle)是两种优化函数调用频率的策略,它们主要用于限制频繁触发的事件回调函数执行次数,以防止过多不必要的计…...

在Win系统部署WampServer并实现公网访问本地服务【内网穿透】

目录 推荐 前言 1.WampServer下载安装 2.WampServer启动 3.安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4.固定公网地址访问 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&#xff0…...

面试经典150题——单词规律

"Dont wait. The time will never be just right." - Napoleon Hill 1. 题目描述 2. 题目分析与解析 首先还是得把题目先读懂,我们直接来看看示例: 根据上面的示例,我们可以看出pattern其实就是表示单词出现的规律,每…...

RK3568平台开发系列讲解(Linux系统篇)container_of

🚀返回专栏总目录 文章目录 一、理解宏container_of二、使用案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、理解宏container_of 在代码中管理多个数据结构时,几乎总是需要将一个结构嵌入另一个结构中,并随时检索它们,而不关心有关内存偏移或边界的问题。假设…...

回显服务器

. 写一个应用程序,让这个程序可以使用网络通信,这里就需要调用传输层提供的api,传输层提供协议,主要是两个: UDP,TCP,它们分别提供了一套不同的api,socket api. UDP和TCP UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字节流,全双工 一个客户端可以连接…...

c#,dotnet, DataMatrix 类型二维码深度识别,OCR,(基于 Halcon)

代码中部分调用的 c 函数参数,具体说明自行研究~(我也是参考的其他资源,还没研究透彻) 例如:HOperatorSet.GenRectangle2() , 2000, 2000, 0, 2000, 2000 这些数字应该是选取的图片解析范围、尺寸&#xff…...

亿道丨三防平板电脑厂商哪家好丨麒麟系统三防平板PAD

随着科技的飞速发展,人们对于移动设备的需求越来越高。然而,在不同的行业应用场景下,常规的智能平板往往无法满足特殊的工作要求。,亿道三防平板,将高可靠性与卓越性能高度结合,为各行各业提供卓越的移动解…...

什么是hash冲突?以及解决方案

哈希冲突是指在哈希表中,两个或更多个不同的键被映射到了同一个哈希桶的情况。这种情况可能会导致数据丢失或者检索效率下降,因为不同的键被映射到了同一个位置,需要额外的操作来处理这种冲突。 解决哈希冲突的常见方法包括: 开放…...

C# CAD交互界面-模态窗体与非模态窗体调用方式

运行环境Visual Studio 2022 c# cad2016 一、模态窗体调用方式: 当一个模态窗体打开时,它会阻塞主窗体的所有输入,直到关闭该模态窗体为止。例如,弹出一个对话框让用户必须完成某些操作后才能继续使用主程序。 [CommandMethod(&q…...

19个Web前端交互式3D JavaScript框架和库

JavaScript (JS) 是一种轻量级的解释(或即时编译)编程语言,是世界上最流行的编程语言。JavaScript 是一种基于原型的多范式、单线程的动态语言,支持面向对象、命令式和声明式(例如函数式编程&am…...

PaddleSeg分割框架解读[01] 核心设计解析

文章目录 PaddleSeg分割框架解读[01] 核心设计解析tools/train.pypaddleseg/cvlibs/config.pypaddleseg/cvlibs/builder.pypaddleseg/cvlibs/manager.pyPaddleSeg分割框架解读[01] 核心设计解析 tools/train.py import argparse import random import numpy as np import cv2…...

新鲜出炉:小巧优雅的 css-in-js库StyledFc

StyledFc 一个简单的运行时css-in-js库&#xff0c;用于封装react组件 零依赖非常小&#xff0c;< 3kb.运行时生成css支持css变量支持类似less的嵌套css样式支持props动态css支持typescript 演示 安装 pnpm add styledfc # or npm install styledfc # or yarn add styl…...

Python编程实验四:函数的使用

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 第3题 第4题 第5题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握函数的定义与调用的基本语法&#xff0c;能根据需要…...

SVN服务备份

hotcopy备份 window批处理 保存以下内容到svn_buckup.bat&#xff0c;确保内容的路径正确&#xff0c;最后双击bat文件进行备份即可 echo offrem SVN安装路径 set svn"C:\Program Files\VisualSVN Server\bin"rem 仓库根目录 set homeE:\Repositories\WorkSpacere…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...