Go语言初识--标识符 可见性

Go语言初识–标识符 可见性

和C语言相似,go语言的基本组成有:

  1. 包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main。
  2. 引入包,其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包。
  3. 函数,和c语言相同,即是一个可以实现某一个功能的函数体,每一个可执行程序中必须拥有一个main函数。
  4. 变量,Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
  5. 语句/表达式,在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
  6. 注释,和c语言中的注释方式相同,可以在任何地方使用以 // 开头的单行注释。以 /* 开头,并以 */ 结尾来进行多行注释,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

标识符

标识符(Identifier)是程序中用来命名实体(如变量、函数、类型、常量、结构体字段等)的名字。在 Go 语言中,标识符的命名遵循以下规则:

  1. 组成部分

    • 标识符由字母、数字和下划线 _ 组成。
    • 标识符的第一个字符必须是字母(a-zA-Z)或下划线 _,不能是数字。

    例如:

    var valid1 int    // 合法
    var 1invalid int  // 不合法,不能以数字开头
    var _validName int // 合法
    
  2. 大小写

    • 大写字母开头的标识符被认为是 导出 的(即在其他包中可见)。
    • 小写字母开头的标识符是 未导出 的,只能在当前包内访问。

Go 语言中的可见性规则(导出与未导出):

1. 导出标识符(Exported Identifier)

  • 大写字母开头的标识符可以被外部包访问,也就是说,这种标识符对外部包是 可见的
  • 这与其他语言中的 public 类似,例如 Java 或 C++ 中的公共成员。

示例

// 定义一个结构体和函数,结构体字段和函数名首字母大写,表示它们是导出的
package mypackage// 导出字段
type MyStruct struct {Name string
}// 导出函数
func MyFunction() {fmt.Println("This is a public function!")
}

在这个示例中,MyStruct 结构体和其字段 Name,以及 MyFunction 函数都可以被外部包使用:

package mainimport "mypackage"func main() {var s mypackage.MyStructs.Name = "Hello"  // 可以访问 Name 字段,因为它是导出的mypackage.MyFunction()  // 可以调用 MyFunction,因为它是导出的
}
  • MyStructMyFunction导出 的,因为它们的名字以大写字母开头,其他包可以直接访问它们。

2. 未导出标识符(Unexported Identifier)

  • 小写字母开头的标识符未导出 的,只能在定义它的包内访问,外部包无法直接访问。
  • 这类似于其他语言中的 privateprotected 成员。

示例

package mypackage// 未导出字段
type MyStruct struct {name string // 小写字母开头,表示未导出
}// 未导出函数
func myFunction() {fmt.Println("This is a private function!")
}

在这个示例中,MyStructname 字段和 myFunction 函数都是 未导出 的,它们只能在 mypackage 包内部使用,其他包无法访问:

package mainimport "mypackage"func main() {var s mypackage.MyStructs.name = "Hello"  // 错误:无法访问未导出的字段 'name'mypackage.myFunction()  // 错误:无法调用未导出的函数 'myFunction'
}
  • 由于 name 字段和 myFunction 函数都是小写字母开头,表示它们是 未导出 的,外部包无法访问。

总结:

  1. 标识符组成:Go 中的标识符由字母、数字和下划线组成,但首字符必须是字母或下划线。

  2. 导出和未导出

    • 大写字母开头的标识符(如 MyStructMyFunction)是 导出的,可以被外部包访问。

    • 小写字母开头的标识符(如 namemyFunction)是 未导出的,只能在当前包内访问。

    • 导出:类似于其他语言中的 public,表示对外部可见。

    • 未导出:类似于其他语言中的 private,表示对外部不可见。

为什么这个规则很重要?

  1. 封装性:Go 使用这种规则来实现封装,只暴露给外部包必要的功能,而隐藏包内部的实现细节。
  2. API 设计:通过将某些函数和类型字段标记为 导出未导出,你可以更清晰地设计包的公共接口,并防止外部包访问不该访问的内部实现。

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

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

相关文章

Python实例之画小猪佩奇

效果图:python代码以及解释,没有运用模块。 """ 绘制小猪佩奇 """ from turtle import *def nose(x,y):"""画鼻子"""penup()# 将海龟移动到指定的坐标goto(x,y)pendown()# 设置海龟的方向&…

Unity笔记——事件中心

事件中心是什么事件中心是 Unity 游戏开发中常用的架构设计,它基于观察者模式 或 发布-订阅模式,通过委托和事件构建的一种消息管理系统。主要用于降低代码耦合度,实现模块间的松耦合通信的消息处理系统能大幅提升代码的可维护性和扩展性&…

Java: 反射机制的 ParameterizedType(参数化类型)

在 Java 中,ParameterizedType 是 java.lang.reflect 包下的一个接口,属于反射 API 的一部分,主要用于表示参数化类型(即带有类型参数的泛型类型)。它是 Java 反射机制中处理泛型类型信息的关键接口之一。 一、什么是参…

OkHttp 与 Retrofit 完美结合:打造高效的 Android 网络请求

前言在现代 Android 开发中,网络请求是几乎每个应用都必不可少的功能。OkHttp 和 Retrofit 作为当前最流行的网络请求库组合,为开发者提供了简洁高效的解决方案。本文将详细介绍如何将这两者结合使用,充分发挥它们的优势。一、OkHttp 和 Retr…

系统辨识建模

系统辨识建模 一、系统辨识建模的作用 1. 建立真实物理系统的数学模型 2. 为后续控制器/强化学习算法提供仿真环境 3. 提高控制精度和安全性 二、本文的系统辨识是怎么做的 1. 实验采集 2. 数学建模 3. 在控制系统中的作用 三、实际用法流程(简化版) 1. 系统辨识阶段 2. 强化…

Android开发:Java与Kotlin深度对比

1. 语言特性与现代性 Java (特别是 Android 主要使用的 Java 8 及之前版本): 相对冗长: 需要编写更多的样板代码(如 getter/setter、findViewById 的显式类型转换、匿名内部类等)。空指针异常 (NPE): 类型系统默认允许 null&#…

米家打印机驱动:Wi-Fi 无线打印丝滑顺畅不卡顿,从此告别对打印机干瞪眼

各位小米家居控们,你们有没有过这种经历,新买的打印机回家,结果电脑跟它像俩傲娇的小情侣,死活不搭话?急得你想当场表演一个“打印机抱头痛哭”?别急,今天就给你们安利个神队友——米家打印机驱…

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(7):自動詞 & 他動詞

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(7):自動詞 & 他動詞1、前言(1)情况说明(2)工程师的信仰2、知识点(1)自動詞 & 他動…

深入理解设计模式:访问者模式详解

在软件开发中,我们经常会遇到需要对一个复杂对象结构进行操作的情况。随着需求的不断变化,我们可能需要在这个对象结构上添加各种新的操作。如果直接在对象结构中添加这些操作,会导致类的职责过重,且每次添加新操作都需要修改原有…

Linux timerfd 定时器封装

使用 timerfd epoll() 实现&#xff0c;简洁精确。没定义 MU_ERROR 宏的话替换为 printf 即可。mu_timer.h:#ifndef _MU_TIMER_H_ #define _MU_TIMER_H_#ifdef __cplusplus extern "C" { #endif#include <stdint.h> #include <time.h> #include <pth…

【样式效果】Vue3实现仿制iOS按钮动态效果

iOS开关效果定义变量&#xff1a; <style scoped lang"scss">.layout {// 按钮宽度$button-width: 500px;// 按钮高度$button-height: 250px;// 按钮里面圆形直径$circle-diameter: 200px;// 按钮背景与里面圆形间距$button-circle-offset:calc(($button-he…

京东疯狂投资具身智能:众擎机器人+千寻智能+逐际动力 | AI早报

每日分享全球最新AI资讯【应用商业八卦技术】&#xff0c;&#x1f30f;&#xff1a;未来世界2099应用 1、马斯克推出儿童AI"Baby Grok"引热议&#xff1a;安全性能否经受考验&#xff1f; 2、蚂蚁AQ健康应用霸榜苹果商店&#xff0c;或将联手Apple Watch打造智能健康…

Jiasou TideFlow AIGC SEO Agent:全自动外链构建技术重构智能营销新标准

AI时代SEO技术革命&#xff1a;企业如何突破流量增长瓶颈&#xff1f;随着Google算法升级至MUM模型&#xff0c;传统SEO工具已难以应对多模态内容优化需求。在搜索引擎日均处理120亿次查询的生态中&#xff0c;企业官网平均自然流量转化周期长达6-8个月&#xff0c;因此诸如Jia…

Docker-compose:服务编排

Docker-compose 介绍 服务编排:按照一定的业务规则批量管理容器 在微服务架构的应用系统中,一般包含 N 个微服务,且每个微服务一般都会部署多个实例。此时,如果每个微服务都要手动启停,维护的工作量会很大。 要从 Dockerfile build image 或者去 docker hub 拉取 image …

异地服务器备份Mysql数据

前言异地服务器备份Mysql数据即Mysql的server端与备份服务器不是同一个。Mysql服务端安装在192.168.3.36中&#xff0c;现在需要在IP为192.168.209.129的服务器中使用mysqldump命令备份指定数据库数据;192.168.209.129没有装过Mysql客户端;1.安装Mysql客户端不安装Mysql客户端就…

NGINX 高级配置解析:`proxy_request_buffering` 使用详解

在使用 NGINX 作为反向代理服务器时&#xff0c;处理客户端请求体&#xff08;如上传文件或大体积 POST 请求&#xff09;的方式会直接影响应用性能与资源使用。其中&#xff0c;proxy_request_buffering 是一个非常关键但容易被忽略的配置项。 本文将详细介绍该指令的作用、典…

增加交叉验证和超参数调优

前文中&#xff0c;只是给了基础模型&#xff1a; PyTorch 实现 CIFAR-10 图像分类&#xff1a;从数据预处理到模型训练与评估-CSDN博客 今天我们增加交叉验证和超参数调优&#xff0c; 先看运行结果&#xff1a; 在测试集上评估最终模型 最终模型在测试集上的准确率&…

解决pip指令超时问题

用pip指令&#xff0c;在安装Django3.2时报错&#xff0c;询问ChatGpt后得到的解决方案pip 下载超时 —— 是 当前网络连接到 PyPI 官方源太慢或不稳定&#xff0c;甚至可能连不上了&#xff0c;而 pip 默认的超时时间又太短&#xff0c;就导致了中途失败&#xff1a;ReadTimeo…

Oracle定时清理归档日志

线上归档日志满了&#xff0c;系统直接崩了&#xff0c;为解决这个问题&#xff0c;创建每月定时清理归档日志。 创建文件名 delete_archivelog.rman CONFIGURE ARCHIVELOG DELETION POLICY CLEAR; RUN {ALLOCATE CHANNEL c1 TYPE DISK;DELETE ARCHIVELOG ALL COMPLETED BEFORE…

ELF 文件操作手册

目录 一、ELF 文件结构概述 二、查看 ELF 文件头信息 1、命令选项 2、示例输出 3、内核数据结构 三、ELF 程序头表 1、命令选项 2、示例输出 3、关键说明 4、内核数据结构 四、ELF 节头表详解 查看节头表信息 1、命令选项 2、示例输出 3、标志说明 4、重要节说…