go 1.18新特性(泛性 模糊测试 WorkSpace)

news2024/11/25 4:36:00

文章目录

  • 泛型
    • interface的功能扩展
    • 泛型使用
  • 模糊测试
    • 模糊测试的使用
    • 模糊测试的缺点
  • Go WorkSpace

泛型

interface的功能扩展

在1.18之前,官方对interface的定义是方法的集合,可以存储实现该方法的任意类型。1.18对interface的定义改为类型集合。接口类型的变量可以存储这个接口类型集合的任意一种类型的实例值。

下面是通过接口定义的一个类型集:

type MyNum interface {
	int32 | int64 | float32 | float64 
}

我们在定义类型集的时候,可以在具体类型前加上符号**~** ,表示该类型以及它的别名类型都是该类型集的。

泛型使用

如下是泛型的使用:

func Sum[T MyNum](nums []T) (rnt T) {

	for _, num := range nums {
		rnt += num
	}
	return
}
  • 方法名后面**[]** 中的内容称为泛型参数列表。
  • T 是泛型参数名,自定义的。
  • MyNum 是约束类型,可以是接口定义的一个类型集合。

还有一些变式的用法,如下:

func Sum[T int64 | float32](nums []T) (rnt T) 

func Sum[T interface{}](nums []T) (rnt T) // interface 表示任意类型

除了方法可以使用泛性,struct也可以使用泛型:

type Queue[T MyNum] struct {
	elements []T
}

模糊测试

模糊测试可以先程序或函数输入大量的无效数据,以检测个别输入带来的意外行为,以此来定位错误。 这种测试框架可以帮助发现可能导致崩溃或其他安全问题的未定义行为。 虽然不可能用模糊测试找到所有的错误,但它可以成为发现和修复许多常见类型问题的有效方法。 它经常被用来测试那些处理来自不受信任来源的输入或可能有意外输入的程序。

模糊测试的使用

要测试的方法:

func Equal(a []byte, b []byte) bool {
	if len(a) != len(b) {
		return false
	}
    // 模拟意外情况
	if len(a) > 99 {
		panic("error")
	}
	for i := range a {
		if a[i] != b[i] {
			return false
		}
	}
	return true
}

在以_test结尾的测试文件中:

func FuzzEqual(f *testing.F) {
	f.Fuzz(func(t *testing.T, a []byte, b []byte) {
		Equal(a, b)
	})
}

使用命令go test . -fuzz 运行测试

在未发现错误时,控制台输出:

在这里插入图片描述

就注释而言,elapsed 是测试运行的时间,new interesting 是添加到语料库中提供独特结果的输入数量,execs 是运行的单个测试的数量。

遇到错误时:

在这里插入图片描述

Failing input written to 后面跟的、链接是发生错误的样例文件。

模糊测试的缺点

  • 模糊测试是通过随机输入的方式错误,并不能覆盖全部错误。
  • 模糊测试只能告知在某个输入的情况下会出错,具体错误还需要测试人员调试寻找。

Go WorkSpace

在开发个过程中,如果多个module同时开发,并且module之间存在相互依赖的关系,可能会出现频繁升级依赖包的问题。

有如下场景:

在这里插入图片描述

一个项目同时在本地开发两个模块,A和B,并且A依赖B,当B升级后,A如何升级自己依赖的包?

  1. 将module B 添加tag push到代码仓库,moudle 使用个go get 命令重新拉取。显然这种方法十分麻烦,A每次升级依赖包都需要进行一遍这样的流程。

  2. 可以使用go mod 的replace 命令,直接使用本地的最新代码,将A的go.mod进行如下更改:

    module example.com/A
    
    go 1.18
    
    require example.com/B v1.0.0
    
    replace example.com/B => ../B
    

    使用replace 命令后,尽管module B更新了 ,module A也可以使用最新的代码。但是同样存在一个问题,其他开发者下载该代码后,在编译时会报错,因为他的本地可能没有module B的代码。所以在使用这种方法时,在提交代码时要将replace 命令删除。

为了解决go mod 无法很好处理本地依赖包频繁升级的问题,go 1.18引入了go workspace机制。

在A和B模块的父目录执行命令go word init ./A ./B ,就会生成一个go .work 文件,文件目录结构如下:

├── A
│   ├── A.go
│   └── go.mod
├── B
│   ├── B.go
│   └── go.mod
└── go.work

go.work 文件的内容如下:

go 1.18

use (
	./A
	./B
)

这样我们就可以在不修改go mod 情况下,访问本地其他模块的最新内容。

建立项目 workspace 工作区之后,对项目的依赖包的修改不再需要进行实时升级,只需要在本地进行修改,等到项目代码提交时,一并升级即可,使用时有点类似于go mod 的replace,但是提交时并不需要修改go mod文件。

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

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

相关文章

前端实现打字效果

前端实现打字效果 不带光标 只一次播放 HTML <!-- 需要在初始化的时候不显示文字 --> <div id"typing"></div>CSS #typing {position: relative;font-size: 24px;font-family: Arial, sans-serif;padding: 10px; }JS const text "要显…

CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

前面的文章已经介绍了Canvas 组件、UITransform 组件、Widget 组件 。 想了解的朋友&#xff0c;请查看 CocosCreator3.8研究笔记&#xff08;十七&#xff09;CocosCreator UI组件&#xff08;一&#xff09;。 今天我们主要介绍CocosCreator 常用容器组件&#xff1a;Layout …

JavaScript-Ajax-axios-Xhr

JS的异步请求 主要有xhr xmlHttpRequest 以及axios 下面给出代码以及详细用法&#xff0c;都写在了注释里 直接拿去用即可 测试中默认的密码为123456 账号admin 其他一律返回登录失败 代码实例 <!DOCTYPE html> <html lang"en"> <head><…

预编译为什么能防止SQL注入?一看你就明白了。预编译原理详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 预编译防止SQL注入 1、SQL执行过程2、预编译原理3、…

爬虫框架Scrapy学习笔记-1

前言 在现代互联网时代&#xff0c;网页数据获取和处理已经成为了重要的技能之一。无论是为了获取信息、做市场研究&#xff0c;还是进行数据分析&#xff0c;掌握网页爬取和数据处理技术都是非常有用的。本文将介绍从网页加载到数据存储的完整过程&#xff0c;包括网络请求、…

银河麒麟操作系统安装人大金仓数据库--九五小庞

一、环境要求 硬件&#xff1a;内存512M以上&#xff0c;磁盘空间10G以上软件&#xff1a;主流Linux操作系统&#xff0c;本机使用kylin-v10安装包准备&#xff1a;官网下载数据库文件镜像以及授权文件 https://www.kingbase.com.cn/rjcxxz/index.htm 二、配置内核参数 vim /e…

Windows11 环境安装Gradle

Gradle和maven对比 maven 经典好用&#xff0c;约定大于配置的方式&#xff0c;使其上手简单&#xff0c;但灵活性稍差。 使用xml配置方式管理依赖&#xff0c;看起来稍丑。 在大型项目上&#xff0c;每次编译都要重新执行所有步骤会导致耗时很长。 Gradle 更加现代的构建工具…

高阶数据结构(2)-----红黑树(未完成)

一)红黑树的基本概念和基本性质: 1)红黑树就是一种高度平衡的二叉搜索树&#xff0c;但是在每一个节点上面都增加了一个存储位来表示结点的颜色&#xff0c;可以是红色或者是黑色&#xff0c;通过对任何一条从根节点到叶子节点上面的路径各个节点着色方式的限制&#xff0c;红黑…

【LeetCode热题100】--283.移动零

283.移动零 使用双指针&#xff1a; class Solution {public void moveZeroes(int[] nums) {if(nums null){return ;}int j 0;for(int i 0;i<nums.length;i){//当前元素不为0时&#xff0c;就把其交换到左边&#xff0c;等于0的交换到右边if(nums[i] ! 0){int tmp nums…

在华为云服务器上安装单机版Redis

https://redis.io/是官网地址。 点击右上角的Download。 可以进入https://redis.io/download/——Redis官网下载最新版的网址。 然后在https://redis.io/download/页面往下拉&#xff0c;点击下图超链接这里。 进入https://download.redis.io/releases/下载自己需要的安装包…

4795-2023 船用舱底水处理装置 学习记录

声明 本文是学习GB-T 4795-2023 船用舱底水处理装置. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了船用舱底水处理装置(以下简称处理装置)中舱底水分离器(以下简称分离器)和舱底 水报警装置(以下简称报警装置)的要求、试验方法…

mysql 注入之权限

SQL注入之高权限注入 在数据库中区分有数据库系统用户与数据库普通用户,二者的划分主要体现在对一些高级函数与资源表的访问权限上。直白一些就是高权限系统用户拥有整个数据库的操作权限,而普通用户只拥有部分已配置的权限。 网站在创建的时候会调用数据库链接,会区分系统用…

面相面试知识--Lottery项目

面相面试知识–Lottery项目 1.设计模式 为什么需要设计模式&#xff1f; &#xff08;设计模式是什么&#xff1f;优点有哪些&#xff1f;&#xff09; 设计模式是一套经过验证的有效的软件开发指导思想/解决方案&#xff1b;提高代码的可重用性和可维护性&#xff1b;提高团…

一文详解二叉搜索树

数据结构-二叉查找树 前言 **摘自百度百科&#xff1a;**二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;&#xff08;又&#xff1a;二叉搜索树&#xff0c;二叉排序树&#xff09;它或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 若…

SpringBoot运维实用篇

SpringBoot运维实用篇 ​ 基础篇发布以后&#xff0c;看到了很多小伙伴在网上的留言&#xff0c;也帮助超过100位小伙伴解决了一些遇到的问题&#xff0c;并且已经发现了部分问题具有典型性&#xff0c;预计将有些问题在后面篇章的合适位置添加到本套课程中&#xff0c;作为解…

怎么将自己的Maven项目上传到Maven中央仓库/Maven阿里云云效仓库

前言 对于工作了多年的老程序员来说&#xff0c;往往会总结出一些比较好用的开发工具包。那么如果把这些好的工具插件共享出来供大家快速的使用呢&#xff0c;最好的方式就是将这些工具插件上传到Maven中央仓库/Maven阿里云云效仓库&#xff0c;这样&#xff0c;有需要用到这些…

泰语同声翻译一天多少钱呢

我们知道&#xff0c;泰语同声翻译是指在涉外会议、展览会、商务洽谈等场合中广泛使用的翻译服务。活动中&#xff0c;专业的翻译人员在场内提供及时的泰语口译服务&#xff0c;使听众能够及时地理解讲话者的内容。那么&#xff0c;泰语同声翻译一天多少钱呢&#xff1f;如何做…

BeanFactory与ApplicationContext

BeanFactory与ApplicationContext的区别 使用Alt Ctrl U查看java类图 什么是BeanFactory接口 他是ApplicationContext的父接口他才是Spring 的核心容器&#xff0c;主要的ApplicationContext功能的实现都间接通过BeanFactory接口来实现 在ApplicationContext类中方法的实现是…

数据结构与算法(C语言版)P4---顺序表、链表总结

顺序表和链表&#xff08;双向带头链表&#xff09;的区别 顺序表&#xff1a; 优点&#xff1a; 支持随机访问。需要随机访问结构支持算法可以很好的使用。cpu高速缓存利用率&#xff08;命中率&#xff09;更高。存储密度高 缺点&#xff1a; 头部中部插入删除时间效率低。…

数据结构与算法面试

1、链表反转 需要三个指针&#xff0c;一个pre指针指向反转的前一个节点&#xff0c;cur指向要反转的节点&#xff0c;然后设置有一个temp指针指向需要反转的下一个节点&#xff0c;用来使得cur指针移动&#xff0c;因为我们反转之后&#xff0c;无法使用next指针访问到后一个节…