理解Go中的包可见性
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
引言
在创建[Go中的包]时,最终目标通常是使其他开发人员可以使用该包,无论是在高阶包中还是在整个程序中。通过[导入包],你的代码片段可以作为其他更复杂工具的构建块。然而,只有某些包可用于导入。这是由包的可见性决定的。
这里的可见性是指可以引用包或其他结构的文件空间。例如,如果我们在函数中定义了一个变量,那么该变量的可见性(作用域)只在定义它的函数内。类似地,如果在包中定义了一个变量,可以让它只对该包可见,也可以让它在包外部可见。
在编写符合人体工程学的代码时,仔细控制包的可见性很重要,特别是考虑到将来可能要对包进行的更改时。如果你需要修复bug、提高性能或更改功能,你需要以不会破坏使用你的包的任何人的代码的方式进行更改。最小化破坏性更改的一种方法是只允许访问包中正确使用所需的部分。通过限制访问权限,您可以在内部对软件包进行更改,而不会影响其他开发人员如何使用您的软件包。
在本文中,您将学习如何控制包的可见性,以及如何保护只应在包中使用的部分代码。为此,我们将创建一个基本的记录器来记录和调试消息,使用具有不同程度可见性的包。
前期准备
要学习本文中的示例,您需要:
-通过以下步骤设置Go工作空间[如何安装Go并设置本地编程环境]本教程将使用以下文件结构:
.
├── bin
│
└── src
└── github.com
└── gopherguides
出口和未出口项目
与Java和[Python]等使用访问修饰符(如public
、private
或protected
)来指定作用域的其他编程语言不同,Go通过声明的方式来确定项是导出的
还是未导出的
。在这种情况下,导出项使其在当前包之外“可见”。如果它没有导出,那么它只在定义它的包中可见和可用。
这种外部可见性通过将声明项的首字母大写来控制。所有以大写字母开头的声明,例如Types
、Variables
、Constants
、Functions
等,都在当前包外部可见。
看看下面的代码,注意大小写:
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
包,记住我们希望在包外部可见和不可见的内容。这个日志包将负责将我们的任何程序消息记录到控制台。它还会查看我们正在日志的级别。级别描述了日志的类型,有三种状态:info
、warning
或error
。
首先,在你的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
函数:Debug
和Log
。这些函数可以被任何导入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 |