理解Go中的包可见性

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

引言

在创建[Go中的包]时,最终目标通常是使其他开发人员可以使用该包,无论是在高阶包中还是在整个程序中。通过[导入包],你的代码片段可以作为其他更复杂工具的构建块。然而,只有某些包可用于导入。这是由包的可见性决定的。

这里的可见性是指可以引用包或其他结构的文件空间。例如,如果我们在函数中定义了一个变量,那么该变量的可见性(作用域)只在定义它的函数内。类似地,如果在包中定义了一个变量,可以让它只对该包可见,也可以让它在包外部可见。

在编写符合人体工程学的代码时,仔细控制包的可见性很重要,特别是考虑到将来可能要对包进行的更改时。如果你需要修复bug、提高性能或更改功能,你需要以不会破坏使用你的包的任何人的代码的方式进行更改。最小化破坏性更改的一种方法是只允许访问包中正确使用所需的部分。通过限制访问权限,您可以在内部对软件包进行更改,而不会影响其他开发人员如何使用您的软件包。

在本文中,您将学习如何控制包的可见性,以及如何保护只应在包中使用的部分代码。为此,我们将创建一个基本的记录器来记录和调试消息,使用具有不同程度可见性的包。

前期准备

要学习本文中的示例,您需要:

-通过以下步骤设置Go工作空间[如何安装Go并设置本地编程环境]本教程将使用以下文件结构:

.
├── bin 
│ 
└── src
    └── github.com
        └── gopherguides

出口和未出口项目

与Java和[Python]等使用访问修饰符(如publicprivateprotected)来指定作用域的其他编程语言不同,Go通过声明的方式来确定项是导出的还是未导出的。在这种情况下,导出项使其在当前包之外“可见”。如果它没有导出,那么它只在定义它的包中可见和可用。

这种外部可见性通过将声明项的首字母大写来控制。所有以大写字母开头的声明,例如TypesVariablesConstantsFunctions等,都在当前包外部可见。

看看下面的代码,注意大小写:

greet.go

package greet

import "fmt"

var Greeting string

func Hello(name string) string {
   
	return fmt.Sprintf(Greeting, name)
}

这段代码声明它在greet包中。然后它声明了两个symbol,一个名为Greeting的变量,和一个名为Hello的函数。因为它们都以大写字母开头,所以它们都是export,并且可以被任何外部程序使用。如前所述,制作一个限制访问的包将允许更好的API设计,并使其更容易在内部更新您的包,而不会破坏依赖于您的包的任何人的代码。

定义包的可见性

为了更仔细地了解程序中包的可见性是如何工作的,让我们创建一个logging包,记住我们希望在包外部可见和不可见的内容。这个日志包将负责将我们的任何程序消息记录到控制台。它还会查看我们正在日志的级别。级别描述了日志的类型,有三种状态:infowarningerror

首先,在你的src目录下,创建一个名为logging的目录来存放我们的日志文件:

mkdir logging

接下来进入该目录:

cd logging

然后,使用像nano这样的编辑器,创建一个名为logging.go的文件:

nano logging.go

将以下代码放在logging.go文件中。:

logging/logging.go

package logging

import (
	"fmt"
	"time"
)

var debug bool

func Debug(b bool) {
   
	debug = b
}

func Log(statement string) {
   
	if !debug {
   
		return
	}

	fmt.Printf("%s %s\n", time.Now().Format(time.RFC3339), statement)
}

这段代码的第一行声明了一个名为logging的包。在这个包中,有两个export 函数:DebugLog。这些函数可以被任何导入logging包的其他包调用。还有一个名为debug的私有变量。这个变量只能在logging包中访问。需要注意的是,虽然函数Debug和变量Debug的拼写相同,但函数是大写的,变量不是。这使得它们具有不同的作用域声明。
保存并退出文件。
要在我们代码的其他地方使用这个包,我们可以[import it into a new package]。我们将创建这个新包,但首先我们需要一个新目录来存储这些源文件。

让我们移出logging目录,创建一个名为cmd的新目录,并进入这个新目录:

cd ..
mkdir cmd
cd cmd

在我们刚刚创建的cmd目录下创建一个名为main.go的文件:

nano main.go

现在我们可以添加以下代码:

cmd/main.go

package main

import "github.com/gopherguides/logging"

func main() {
   
	logging.
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“理解Go中的包可见性” 的相关文章

VisionMobile:2013年Q3移动开发者经济报告(十一):第十章、HTML5应用开发的万花筒

第十章、HTML5应用开发的万花筒HTML5是与应用经济双寡头相竞争的技术。根据我们Q3对6000+名移动应用开发者的研究,就移动开发者青睐度而言,52%的开发者以某种形式使用HTML5,排在iOS(72%)和Android(57%)的后面。当我们再次审查52%的HTML5移动开发者青睐度时,在HT...

消除编译器未使用的警告

#define XXX_UNUSED(x) (void)x;...

Spark中的一些概念

一次action操作会触发RDD的延迟计算,我们把这样的一次计算称作一个Job。 窄依赖指的是:每个parent RDD 的 partition 最多被 child RDD的一个partition使用 宽依赖指的是:每个parent RDD 的 partition 被多个 child RDD的pa...

scala iterator循环遍历

感觉scala的循环遍历,有些时候像狗屎一样难用 你要想使用scala遍历 com.google.gson.JsonArray,刚开始估计感觉scala真他妈的不是东西,狗咬刺猬,无从下口。下面是我的解决办法:val array = JsonUtil.jsonArray(stepStr)...

云客服系统有哪些优势?

企业线上的日常服务和运营活动,可能会导致大量的售前、售中和售后问题。客户服务人员面临着大量的重复咨询和高工作量。因此,企业需要使用云客服系统来协助客户服务工作。那么云客服系统有哪些优势呢? 1.全渠道支持,方便消息管理。 云客服系统支持网页、APP、第三方工具等多种接入渠道。可以实现不同平台间的信息...

Python中的生成器原理是什么 - 开发技术

这篇文章主要介绍“Python中的生成器原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的生成器原理是什么”文章能帮助大家解决问题。什么是python生成器生成器是一种特殊的迭代器,它内部也有__iter...