go语言package Go语言圣经

4.2 Go语言中包(Packages)的命名

包名本质上是所在目录的名称,我们在基础知识演示用例中进行扩展,进一步理解包名,执行前需要执行的命令请参考上一节,首先来看一下目录结构:

成都创新互联是一家专注于网站建设、成都做网站与策划设计,新干网站建设哪家好?成都创新互联做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:新干等地区。新干做网站价格咨询:18982081108

此时,如果我们想使用subpackage/sub/subfunc.go时,需要import的是subpackage/sub,而不是subpackage/sub/subfunc,来看具体的实现:

我们回到使用的主函数中,我们在主函数中引入"subpackage/sub",而调用中直接使用了文件名称myfunc

执行的结果如下

GO语言(十六):模糊测试入门(上)

本教程介绍了 Go 中模糊测试的基础知识。通过模糊测试,随机数据会针对您的测试运行,以尝试找出漏洞或导致崩溃的输入。可以通过模糊测试发现的一些漏洞示例包括 SQL 注入、缓冲区溢出、拒绝服务和跨站点脚本攻击。

在本教程中,您将为一个简单的函数编写一个模糊测试,运行 go 命令,并调试和修复代码中的问题。

首先,为您要编写的代码创建一个文件夹。

1、打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,为您的代码创建一个名为 fuzz 的目录。

3、创建一个模块来保存您的代码。

运行go mod init命令,为其提供新代码的模块路径。

接下来,您将添加一些简单的代码来反转字符串,稍后我们将对其进行模糊测试。

在此步骤中,您将添加一个函数来反转字符串。

a.使用您的文本编辑器,在 fuzz 目录中创建一个名为 main.go 的文件。

独立程序(与库相反)始终位于 package 中main。

此函数将接受string,使用byte进行循环 ,并在最后返回反转的字符串。

此函数将运行一些Reverse操作,然后将输出打印到命令行。这有助于查看运行中的代码,并可能有助于调试。

e.该main函数使用 fmt 包,因此您需要导入它。

第一行代码应如下所示:

从包含 main.go 的目录中的命令行,运行代码。

可以看到原来的字符串,反转它的结果,然后再反转它的结果,就相当于原来的了。

现在代码正在运行,是时候测试它了。

在这一步中,您将为Reverse函数编写一个基本的单元测试。

a.使用您的文本编辑器,在 fuzz 目录中创建一个名为 reverse_test.go 的文件。

b.将以下代码粘贴到 reverse_test.go 中。

这个简单的测试将断言列出的输入字符串将被正确反转。

使用运行单元测试go test

接下来,您将单元测试更改为模糊测试。

单元测试有局限性,即每个输入都必须由开发人员添加到测试中。模糊测试的一个好处是它可以为您的代码提供输入,并且可以识别您提出的测试用例没有达到的边缘用例。

在本节中,您将单元测试转换为模糊测试,这样您就可以用更少的工作生成更多的输入!

请注意,您可以将单元测试、基准测试和模糊测试保存在同一个 *_test.go 文件中,但对于本示例,您将单元测试转换为模糊测试。

在您的文本编辑器中,将 reverse_test.go 中的单元测试替换为以下模糊测试。

Fuzzing 也有一些限制。在您的单元测试中,您可以预测Reverse函数的预期输出,并验证实际输出是否满足这些预期。

例如,在测试用例Reverse("Hello, world")中,单元测试将返回指定为"dlrow ,olleH".

模糊测试时,您无法预测预期输出,因为您无法控制输入。

但是,Reverse您可以在模糊测试中验证函数的一些属性。在这个模糊测试中检查的两个属性是:

(1)将字符串反转两次保留原始值

(2)反转的字符串将其状态保留为有效的 UTF-8。

注意单元测试和模糊测试之间的语法差异:

(3)确保新包unicode/utf8已导入。

随着单元测试转换为模糊测试,是时候再次运行测试了。

a.在不进行模糊测试的情况下运行模糊测试,以确保种子输入通过。

如果您在该文件中有其他测试,您也可以运行go test -run=FuzzReverse,并且您只想运行模糊测试。

b.运行FuzzReverse模糊测试,查看是否有任何随机生成的字符串输入会导致失败。这是使用go test新标志-fuzz执行的。

模糊测试时发生故障,导致问题的输入被写入将在下次运行的种子语料库文件中go test,即使没有-fuzz标志也是如此。要查看导致失败的输入,请在文本编辑器中打开写入 testdata/fuzz/FuzzReverse 目录的语料库文件。您的种子语料库文件可能包含不同的字符串,但格式相同。

语料库文件的第一行表示编码版本。以下每一行代表构成语料库条目的每种类型的值。由于 fuzz target 只需要 1 个输入,因此版本之后只有 1 个值。

c.运行没有-fuzz标志的go test; 新的失败种子语料库条目将被使用:

由于我们的测试失败,是时候调试了。

go语言 一个主package包引入同级目录下go文件包编译出错!!

go语言 一个主package包引入同级目录下go文件包编译出错是设置错误造成的,解决方法为:

1、先使用import "strings"导入strings库。

2、HasPrefix 判断字符串 s 是否以 prefix 开头。

3、HasSuffix 判断字符串 s 是否以 suffix 结尾。

4、可以看看判断的代码。

5、在cmd下运行一下go run test.go,看看如下结果。

6、Contains 判断字符串 s 是否包含 substr,也就是判断一下S是否在strings中。

7、在cmd下运行go run test.go看看结果。

4.1 Go语言中包(Packages)基础知识

先看一下目录结构,注意这里的src名称是必须的,go在设置了GOPATH后,默认会添加src去寻找package,暂未查询是否有方法不按照src查询

根据上面的描述,Go语言中通过包中函数的名称来区分公共函数和私有函数,我们在main函数中是无法调用myPrivateFunc的

此时如果执行通过go run方式执行,会看到如下的提示信息,这与大部分语言对于包管理方式相关,所以我们通过两种不同的方法来让代码执行起来

返回如下,这里面对我们后续执行有影响的两个参数GO111MODULE和GOPATH

如果要使用gopath模式引用包,则需要关闭mod模式

设置GOPATH为当前路径,即main.go所在的路径

此时再查看go env时,GOPATH已经发生改变

我们再次尝试执行代码

可以看到public函数被调用

Go语言”奇怪用法“有哪些

1,go的变量声明顺序是:”先写变量名,再写类型名“,此与C/C++的语法孰优孰劣,可见下文解释:

2,go是通过package来组织的(与python类似),只有package名为main的包可以包含main函数,一个可执行程序有且仅有一个main包,通过import关键字来导入其他非main包。

3,可见性规则。go语言中,使用大小写来决定该常量、变量、类型、接口、结构或函数是否可以被外部包含调用。根据约定,函数名首字母小写即为private,函数名首字母大写即为public。

4,go内置关键字(25个均为小写)。

5,函数不用先声明,即可使用。

6,在函数内部可以通过 := 隐士定义变量。(函数外必须显示使用var定义变量)

7,go程序使用UTF-8编码的纯Unicode文本编写。

8,使用big.Int的陷阱:

9,从技术层面讲,go语言的语句是以分号分隔的,但这些是由编译器自动添加的,不用手动输入,除非需要在同一行中写入多个语句。没有分号及只需少量的逗号和圆括号,使得go语言的程序更容易阅读。

10,go语言只有一个循环结构——for循环。

11,go里的自增运算符只有——“后++”

12,go语言中的slice用法类似python中数组,关于slice的详细用法可见:

13,函数也是一个值,使用匿名函数返回一个值。

14,函数闭包的使用,闭包是一个匿名函数值,会引用到其外部的变量。


当前文章:go语言package Go语言圣经
文章链接:http://ybzwz.com/article/hpjhip.html