在Go中导入软件包

引言

对于任何广泛使用的编程语言,乃至整个开源社区来说,在不同项目之间借用和共享代码的能力都是基础。借用代码使程序员能够将大部分时间花在针对自己的需求编写代码上,而且通常他们的一些新代码最终会对其他人有用。然后他们可能决定将这些可重用的部分组织成一个单元,并在他们的团队或更广泛的编程社区中共享它。

在Go中,可重用代码的基本单元称为。即使最简单的Go程序也是它自己的包,并且可能使用至少一个其他包。在本教程中,你将编写两个小程序:一个使用标准库包来生成随机数,另一个使用流行的第三方包来生成UUID。然后,您可以选择编写一个较长的程序来比较两个相似的标准库包,导入并使用这两个包,即使它们具有相同的基本名称。最后,您将使用goimports工具来查看如何格式化导入。

注意: Go中还有一个更高级别的可重用代码单元:module。模块是包的版本化集合。您将在后面的文章“如何使用Go模块”中探索模块

前期准备

在开始本教程之前,您只需要安装Go。

步骤1 -使用标准库包

与大多数语言一样,Go有一个内置的可重用代码库,您可以将其用于常见任务。例如,你不需要编写自己的代码来格式化和打印字符串,或者发送HTTP请求。Go标准库为这些任务和许多其他任务提供了软件包。
[如何用Go编写第一个程序]中的程序使用了标准库中的fmtstrings包。让我们再写一个程序,使用math/rand包来生成一些随机数。
nano或者你喜欢的文本编辑器中打开一个名为random.go的新文件:

nano random.go

下面来创建一个程序,打印5个从0到9的随机整数。将以下内容粘贴到编辑器中:

package mainimport "math/rand"func main() {for i := 0; i < 5; i++ {println(rand.Intn(10))}
}

这个程序导入了’math/rand’包,并通过引用其基本名称rand来使用它。这是出现在包中每个Go源文件顶部的package <pkgname>声明中的名称。

for循环的每次迭代都会调用rand.Intn(10)来生成一个介于0到9之间的随机整数(不包括10),然后将该整数打印到控制台。
请注意,对println()的调用没有引用包的名称。这是一个不需要导入的内置函数。通常你会使用fmt包中的fmt.Println()函数,但这个程序使用println()来引入内置函数。

保存程序。如果你使用的是nano,按下CTRL+X,然后YENTER来确认你的更改。然后运行程序:

go run random.go

你将看到从0到9的5个整数:

Output1
7
7
9
1

看起来随机数生成器正常工作了,但请注意,如果你反复运行程序,它每次打印的都是相同的数,而不是你预期的新随机数。这是因为我们没有调用rand.Seed()函数来用一个唯一的值初始化数字生成器。如果你不这样做,该包的行为就像调用了rand.Seed(1)一样,因此它每次都会生成相同的“随机”数字。

因此,每次程序运行时,你都需要为数字生成器提供一个唯一的值。程序员通常使用以纳秒为单位的当前时间戳。为此,你需要time包。在编辑器中再次打开random.go并粘贴以下内容:

package mainimport ("math/rand""time"
)func main() {now := time.Now()rand.Seed(now.UnixNano())
println("Numbers seeded using current date/time:", now.UnixNano())for i := 0; i < 5; i++ {println(rand.Intn(10))}
}

当导入多个包时,可以使用括号来创建导入块。通过使用块,你可以避免在每一行上重复import关键字,这使你的代码更简洁。
首先,你通过time.Now()函数获取当前系统时间,该函数返回一个time 结构体。然后你将时间传递给rand.Seed()函数。该函数需要一个64位整数(int64),所以你需要在now结构体上使用Time.UnixNano()方法来传递以纳秒为单位的时间。最后,打印生成随机数所需的时间。

现在保存并再次运行程序:

go run random.go

你应该会看到类似下面的输出:

OutputNumbers seeded using current date/time: 1674489465616954000
2
6
3
1
0

如果你运行这个程序几次,每次都应该看到不同的整数,以及用于生成随机数的唯一整数。

让我们再编辑一次程序,以更友好的格式打印种子时间。编辑包含第一个println()调用的那行代码,如下所示:

	println("Numbers seeded using current date/time:", now.Format(time.StampNano))

现在你正在调用Time.Format()方法,并传入在time包中定义的多种格式中的一种。time.StampNano常量(const)是一个字符串,将它传递给Time.Format()可以让你打印月份、日期和时间,精确到纳秒。保存并再次运行程序:

go run random.go
OutputNumbers seeded using current date/time: Jan 23 10:01:50.721413000
7
6
3
7
3

这比看到一个表示自1970年1月1日以来经过的纳秒数的巨大整数要好。

如果您的程序不需要随机整数,而是需要UUID,许多程序员使用它作为其部署中数据片段的全局唯一标识符,该怎么办?Go标准库没有生成这些内容的软件包,但社区提供了。现在让我们看看如何下载和使用第三方包。

步骤2 -使用第三方软件包

生成uuid最流行的包之一是github.com/google/uuid。第三方包总是通过它们的全限定名称来知道,其中包括托管代码的网站(例如github.com),开发它的用户或组织(例如谷歌),以及基本名称(例如uuid)。在导入包时,在pkg.go.dev和其他地方阅读它的文档时,您将使用它的全限定名称。但是,在代码语句中引用它时,只能使用基本名。

在下载包之前,您需要初始化一个模块,这是Go管理程序的依赖项及其版本的方式。要初始化一个模块,请使用go mod init并传入你自己的包的全限定名称。如果你想在GitHub上以用户名“sammy”托管你的模块,可以像这样初始化模块:

go mod init github.com/sammy/random

这将创建一个名为go.mod的文件。让我们看看这个文件:

cat go.mod

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

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

相关文章

在c和c++中‘->‘是什么意思?

1.->是什么 箭头符号 -> 通常用于 C、C 和类似的编程语言中&#xff0c;表示指向结构体或类的指针成员的访问。这个符号是一个简写形式&#xff0c;可以看作是两个操作的组合&#xff1a; 解引用&#xff08;dereferencing&#xff09;&#xff1a;通过一个指针来访问它…

k8s-service 7

由控制器来完成集群的工作负载&#xff0c;service&#xff08;微服务&#xff09;是将工作负载的应用暴露出去&#xff0c;从而解决访问问题 作用&#xff1a;无论是在集群内还是集群外&#xff0c;都可以访问pod上的应用&#xff0c;其实现对集群内的应用pod自动发现和负载均…

jQuery ajax读取本地json文件 三级联动下拉框

步骤 1&#xff1a;创建本地JSON文件 {"departments": [{"name": "会计学院","code": "052"},{"name": "金融学院","code": "053"},{"name": "财税学院",&qu…

【c】小红的漂亮串

#include<stdio.h> #include<string.h> int main() {char arr[1000];int count0;gets(arr);//在数组中输入字符串int lenstrlen(arr);//求字符串长度printf("%d\n",len);for(int i0;i<len;i){if(arr[i]r){if(arr[i1]e){if(arr[i2]d){countcount1;}}}}…

关于如何实现图片懒加载

图片懒加载的原理&#xff1a; 通过延迟加载图片&#xff0c;只有当图片即将进入可视区域时再进行加载&#xff0c;以优化网页加载速度和性能。 具体的实现步骤如下&#xff1a; 将待加载的图片的 src 属性设置为空或者一个占位符&#xff0c;而不是真实的图片链接。监…

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 19 章:聚类提示

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南—第 19 章&#xff1a;聚类提示 聚类提示是一种允许模型根据某些特征或特性将相似数据点分组的技术。 具体做法是向模型提供一组数据点&#xff0c;并要求它根据某些特征或特性将这些数据点分组。 这种技术适…

ChatGPT可能即将发布新版本,带有debug功能:支持下载原始对话、可视化对话分支等

本文原文来自DataLearnerAI官方网站&#xff1a;ChatGPT内置隐藏debug功能&#xff1a;支持下载原始对话、可视化对话分支等 | 数据学习者官方网站(Datalearner) AIPRM的工作人员最近发现ChatGPT的客户端隐藏内置了一个新的debug特性&#xff0c;可以提高ChatGPT对话的问题调试…

AZURE==SQL managed instances

创建资源 创建DB 创建完成后&#xff0c;拿着刚才的账号密码依然连接不上 远程连接 需要开启公网访问和开放相关端口 参考Configure public endpoint - Azure SQL Managed Instance | Microsoft Learn 连接成功

Python源码分享10:使用海龟画图turtle画哆啦A梦

turtle模块是一个Python的标准库之一&#xff0c;它提供了一个基于Turtle graphics的绘图库。Turtle graphics是一种流行的绘图方式&#xff0c;它通过控制一个小海龟在屏幕上移动来绘制图形。 turtle模块可以让您轻松地创建和控制海龟图形&#xff0c;从而帮助您学习Python编…

使用xshell连接虚拟机(服务器)

作者&#xff1a;余小小 Xshell Xshell [1] 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以…

SpringDataJPA基础

简介 Spring Data为数据访问层提供了熟悉且一致的Spring编程模版&#xff0c;对于每种持久性存储&#xff0c;业务代码通常需要提供不同存储库提供对不同CURD持久化操作。Spring Data为这些持久性存储以及特定实现提供了通用的接口和模版。其目的是统一简化对不同类型持久性存储…

计算年year、月month和日day对应的是该年的第几天

自定义1个函数day_of_year(year, month, day)&#xff0c;计算并返回年year、月month和日day对应的是该年的第几天。 函数接口定义&#xff1a; int day_of_year(year, month, day);year, month, day分别为输入的年&#xff0c;月&#xff0c;日 裁判测试程序样例&#xff1a…

华清远见嵌入式学习——QT——作业1

作业要求&#xff1a; 代码&#xff1a; ①&#xff1a;头文件 #ifndef LOGIN_H #define LOGIN_H#include <QWidget> #include <QLineEdit> //行编辑器类 #include <QPushButton> //按钮类 #include <QLabel> //标签类 #include <QM…

图像处理之把模糊的图片变清晰

1.图片如果是有雾化效果的对图像产生影响的,要先进行图形增强,Retinex是基于深度神经网络了,我在之前图形处理的文章一路从神经网络(概率统计)—>积卷神经网络(对区域进行概率统计,对图片进行切割多个识别对象)–>深度积卷神经网络(RetinexNet也是模拟人脑的处理过程,增加…

Spark例子

Spark例子 以下是一个简单的AI Spark例子&#xff1a; 假设我们有一个数据集&#xff0c;包含房屋大小、卧室数量和售价。我们想使用Spark来预测房屋售价。 首先&#xff0c;我们需要导入所需的库和数据。在这个例子中&#xff0c;我们将使用Pyspark。 python from pyspark…

Hive增强的聚合、多维数据集、分组和汇总

Hive多维分析 1、多维分析概述2、GROUPING SETS多维分组3、GROUPING__ID函数4、ROLLUP与CUBE语法糖5、多维分析常见问题与解决春雨惊春清谷天,夏满芒夏暑相连;秋处露秋寒霜降,冬雪雪冬小大寒。今天是2023年的最后一个节气:大雪。大雪节气之后,全国气温显著下降,北方冷空气…

图表管理功能(前后端实现增删改查)

图表管理功能&#xff08;前后端实现增删改查&#xff09; 后端 库表设计 create table chart (id bigint auto_increment comment idprimary key,goal text null comment 分析目标,chartData text …

css弹窗动画效果,示例弹窗从底部弹出

从底部弹出来&#xff0c;有过渡动画效果 用max-height可以自适应内容的高度&#xff0c;当内容会超过最大高度时可以在弹窗里加个scroll-view 弹窗不能用v-if来隐藏&#xff0c;不然transition没效果&#xff0c;transition只能对已有dom元素起效果&#xff0c;所以用透明和v…

软件测试入门:静态测试

什么是静态测试 顾名思义&#xff0c;这里的静态是指程序的状态&#xff0c;即在不执行代码的情况下检查软件应用程序中的缺陷。进行静态测试是为了仅早在开发的早期阶段发现程序缺陷&#xff0c;因为这样可以更快速地识别缺陷并低成本解决缺陷&#xff0c;它还有助于查找动态测…

GO设计模式——11、装饰器模式(结构型)

目录 装饰器模式&#xff08;Decorator Pattern&#xff09; 装饰器模式的核心角色&#xff1a; 优缺点 使用场景 代码实现 装饰器模式&#xff08;Decorator Pattern&#xff09; 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功…