当前位置: 首页 > news >正文

第 22 章 - Go语言 测试与基准测试

在Go语言中,测试是一个非常重要的部分,它帮助开发者确保代码的正确性、性能以及可维护性。Go语言提供了一套标准的测试工具,这些工具可以帮助开发者编写单元测试、表达式测试(通常也是指单元测试中的断言)、基准测试等。

单元测试 (Unit Testing)

单元测试主要用于验证程序中最小可测试单元的正确性,如一个函数或方法。Go语言使用testing包来支持单元测试。

示例

假设我们有一个简单的加法函数Add,我们想要为这个函数编写单元测试。

源代码: add.go

package mainimport "fmt"// Add two integers and return the result.
func Add(a int, b int) int {return a + b
}func main() {fmt.Println(Add(1, 2))
}

测试代码: add_test.go

package mainimport ("testing"
)// TestAdd checks if the Add function works as expected.
func TestAdd(t *testing.T) {tests := []struct {a, b, want int}{{1, 2, 3},{0, 0, 0},{-1, 1, 0},{5, -3, 2},}for _, tt := range tests {testname := fmt.Sprintf("%d+%d", tt.a, tt.b)t.Run(testname, func(t *testing.T) {ans := Add(tt.a, tt.b)if ans != tt.want {t.Errorf("got %d, want %d", ans, tt.want)}})}
}

在这个例子中,我们定义了一个测试表tests,其中包含了一些输入值和预期结果。对于每个测试用例,我们调用Add函数并检查返回的结果是否符合预期。如果不符合,我们使用t.Errorf报告错误。

表达式测试 (Expression Testing)

表达式测试通常是指在单元测试中使用断言来简化测试逻辑。虽然Go语言的标准库没有直接提供断言功能,但是可以通过第三方库如testify/assert来实现更简洁的测试代码。

使用 testify 的测试代码: add_test.go

package mainimport ("testing""github.com/stretchr/testify/assert"
)func TestAddWithAssert(t *testing.T) {assert.Equal(t, 3, Add(1, 2), "1+2 should equal 3")assert.Equal(t, 0, Add(0, 0), "0+0 should equal 0")assert.Equal(t, 0, Add(-1, 1), "-1+1 should equal 0")assert.Equal(t, 2, Add(5, -3), "5-3 should equal 2")
}

这里使用了testify/assert库的assert.Equal函数来比较期望值和实际值,并且提供了失败时的错误信息。

基准测试 (Benchmark Testing)

基准测试用于测量代码的性能。Go语言的testing包也支持基准测试。

基准测试代码: add_benchmark_test.go

package mainimport "testing"// BenchmarkAdd measures the performance of the Add function.
func BenchmarkAdd(b *testing.B) {for i := 0; i < b.N; i++ {Add(1, 2)}
}

在这个基准测试中,我们通过循环调用Add函数来测量其执行速度。b.N是测试框架自动设置的一个变量,表示应该执行的次数。运行基准测试可以使用命令go test -bench=.

以上就是Go语言中单元测试、表达式测试和基准测试的基本介绍和示例。希望这些内容能帮助您更好地理解和使用Go语言的测试功能。

接下来,我们将进一步深入探讨一些高级特性和最佳实践,包括子测试、表格驱动测试、并发测试、测试覆盖率以及如何组织测试代码。

子测试 (Subtests)

子测试允许在一个测试函数内部组织多个相关的测试用例。这有助于提高测试的可读性和组织性,特别是在处理复杂的测试场景时。

改进后的测试代码: add_test.go

package mainimport ("testing"
)func TestAddSubtests(t *testing.T) {cases := []struct {name     stringa, b, want int}{{"positive", 1, 2, 3},{"zero", 0, 0, 0},{"negative", -1, 1, 0},{"mixed", 5, -3, 2},}for _, c := range cases {t.Run(c.name, func(t *testing.T) {got := Add(c.a, c.b)if got != c.want {t.Errorf("Add(%d, %d) = %d; want %d", c.a, c.b, got, c.want)}})}
}

在这个例子中,我们使用t.Run来创建子测试,每个子测试都有一个名称,这样在测试失败时可以更容易地定位到具体的问题。

并发测试 (Concurrent Testing)

Go语言的并发模型非常适合编写高效的测试代码。使用testing.TParallel方法可以在多个CPU核心上并行运行测试,从而加快测试速度。

并发测试代码: add_parallel_test.go

package mainimport ("testing"
)func TestAddParallel(t *testing.T) {cases := []struct {a, b, want int}{{1, 2, 3},{0, 0, 0},{-1, 1, 0},{5, -3, 2},}for _, c := range cases {c := c // 必须创建一个新的副本t.Run(fmt.Sprintf("%d+%d", c.a, c.b), func(t *testing.T) {t.Parallel()got := Add(c.a, c.b)if got != c.want {t.Errorf("Add(%d, %d) = %d; want %d", c.a, c.b, got, c.want)}})}
}

在这个例子中,我们使用t.Parallel()来标记每个子测试可以并行运行。需要注意的是,每个子测试必须是线程安全的,因此我们在循环中创建了新的副本c

测试覆盖率 (Test Coverage)

测试覆盖率是一种度量测试代码质量的方法,它显示了哪些代码路径已经被测试覆盖。Go语言提供了内置的工具来生成测试覆盖率报告。

生成测试覆盖率报告:

go test -coverprofile=coverage.out
go tool cover -html=coverage.out -o coverage.html

第一行命令会生成一个覆盖率文件coverage.out,第二行命令会将这个文件转换为HTML格式,以便于查看。

组织测试代码 (Organizing Test Code)

良好的测试代码组织结构可以使项目更加清晰和易于维护。通常,测试文件应与被测试的源文件放在同一个目录下,并以_test.go结尾。

目录结构示例:

myproject/
├── add.go
├── add_test.go
└── main.go

每个源文件都应该有一个对应的测试文件,这样可以确保每个功能模块都有相应的测试。

总结

通过上述内容,我们可以看到Go语言的测试工具非常强大和灵活,能够满足各种测试需求。无论是简单的单元测试、复杂的并发测试还是详细的基准测试,Go语言都能提供有效的支持。希望这些内容对您有所帮助,如果您有任何问题或需要进一步的指导,请随时告诉我!

接下来我们将进一步探讨一些更高级的测试技巧和最佳实践,包括模拟(Mocking)、依赖注入、测试辅助函数、以及如何处理外部依赖。

模拟 (Mocking)

在测试中,模拟(Mocking)是一种常用的技术,用于隔离被测试代码与其他组件的依赖关系。通过模拟,我们可以控制外部依赖的行为,从而更好地测试我们的代码。

使用 gomock 进行模拟

gomock 是一个流行的 Go 语言模拟库,可以帮助我们生成和管理模拟对象。

安装 gomockmockgen:

go get github.com/golang/mock/mockgen

定义接口:

假设我们有一个 Calculator 接口,我们需要测试一个使用该接口的函数。

calculator.go:

package maintype Calculator interface {Add(a, b int) intSubtract(a, b int) int
}

生成模拟对象:

使用 mockgen 生成模拟对象。

mockgen -source=calculator.go -package=main > calculator_mock.go

生成的模拟对象:

calculator_mock.go:

package mainimport ("reflect""testing"
)// MockCalculator is a mock of Calculator interface
type MockCalculator struct {mock.Mock
}// Add provides a mock function with given fields: a, b
func (_m *MockCalculator) Add(a int, b int) int {ret := _m.Called(a, b)var r0 intif rf, ok := ret.Get(0).(func(int, int) int); ok {r0 = rf(a, b)} else {r0 = ret.Get(0).(int)}return r0
}// Subtract provides a mock function with given fields: a, b
func (_m *MockCalculator) Subtract(a int, b int) int {ret := _m.Called(a, b)var r0 intif rf, ok := ret.Get(0).(func(int, int) int); ok {r0 = rf(a, b)} else {r0 = ret.Get(0).(int)}return r0
}

测试代码:

calculator_test.go:

package mainimport ("testing""github.com/golang/mock/gomock"
)func TestUseCalculator(t *testing.T) {ctrl := gomock.NewController(t)defer ctrl.Finish()mockCalc := NewMockCalculator(ctrl)mockCalc.EXPECT().Add(1, 2).Return(3)mockCalc.EXPECT().Subtract(5, 3).Return(2)result := UseCalculator(mockCalc)if result != 5 {t.Errorf("UseCalculator() = %d; want 5", result)}
}func UseCalculator(calc Calculator) int {sum := calc.Add(1, 2)diff := calc.Subtract(5, 3)return sum + diff
}

在这个例子中,我们使用 gomock 生成了 Calculator 接口的模拟对象,并在测试中设置了期望的行为。然后,我们调用 UseCalculator 函数并验证其返回值。

依赖注入 (Dependency Injection)

依赖注入是一种设计模式,通过它可以在运行时将依赖项传递给对象,而不是在对象内部硬编码这些依赖项。这使得代码更灵活、更易于测试。

示例:

假设我们有一个 Service 类,它依赖于 Calculator 接口。

service.go:

package maintype Service struct {calc Calculator
}func NewService(calc Calculator) *Service {return &Service{calc: calc}
}func (s *Service) Compute(a, b int) int {sum := s.calc.Add(a, b)diff := s.calc.Subtract(a, b)return sum + diff
}

测试代码:

service_test.go:

package mainimport ("testing""github.com/golang/mock/gomock"
)func TestServiceCompute(t *testing.T) {ctrl := gomock.NewController(t)defer ctrl.Finish()mockCalc := NewMockCalculator(ctrl)mockCalc.EXPECT().Add(1, 2).Return(3)mockCalc.EXPECT().Subtract(1, 2).Return(-1)service := NewService(mockCalc)result := service.Compute(1, 2)if result != 2 {t.Errorf("Service.Compute() = %d; want 2", result)}
}

在这个例子中,我们通过构造函数将 Calculator 接口的实现传递给 Service 对象,从而实现了依赖注入。

测试辅助函数 (Helper Functions)

测试辅助函数可以帮助减少重复代码,使测试代码更加简洁和可维护。

示例:

假设我们有一个通用的辅助函数来验证两个整数是否相等。

test_helpers.go:

package mainimport ("testing"
)func AssertEqual(t *testing.T, got, want int, msg string) {if got != want {t.Errorf("%s: got %d, want %d", msg, got, want)}
}

使用辅助函数的测试代码:

add_test.go:

package mainimport ("testing"
)func TestAddWithHelper(t *testing.T) {cases := []struct {a, b, want int}{{1, 2, 3},{0, 0, 0},{-1, 1, 0},{5, -3, 2},}for _, c := range cases {got := Add(c.a, c.b)AssertEqual(t, got, c.want, fmt.Sprintf("Add(%d, %d)", c.a, c.b))}
}

在这个例子中,我们定义了一个 AssertEqual 辅助函数,并在测试代码中使用它来简化断言逻辑。

处理外部依赖 (Handling External Dependencies)

在测试中处理外部依赖(如数据库、网络服务等)是一个常见的挑战。通常的做法是使用内存数据库、模拟服务器或配置文件来模拟外部依赖。

示例:

假设我们有一个函数需要访问数据库。

database.go:

package mainimport ("database/sql""fmt"
)type DB interface {QueryRow(query string, args ...interface{}) *sql.Row
}func FetchUser(db DB, id int) (string, error) {var name stringerr := db.QueryRow("SELECT name FROM users WHERE id = ?", id).Scan(&name)if err != nil {return "", err}return name, nil
}

测试代码:

database_test.go:

package mainimport ("testing""github.com/DATA-DOG/go-sqlmock"
)func TestFetchUser(t *testing.T) {db, mock, err := sqlmock.New()if err != nil {t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)}defer db.Close()rows := sqlmock.NewRows([]string{"name"}).AddRow("Alice")mock.ExpectQuery("SELECT name FROM users WHERE id = ?").WithArgs(1).WillReturnRows(rows)name, err := FetchUser(db, 1)if err != nil {t.Errorf("unexpected error: %v", err)}if name != "Alice" {t.Errorf("expected Alice, got %s", name)}if err := mock.ExpectationsWereMet(); err != nil {t.Errorf("there were unfulfilled expectations: %s", err)}
}

在这个例子中,我们使用 go-sqlmock 库来模拟数据库连接和查询,从而避免了对实际数据库的依赖。

总结

通过上述内容,我们可以看到 Go 语言提供了丰富的工具和库来支持各种测试需求。从简单的单元测试到复杂的并发测试和外部依赖处理,Go 语言都提供了强大的支持。希望这些内容对您有所帮助,如果您有任何问题或需要进一步的指导,请随时告诉我!

相关文章:

第 22 章 - Go语言 测试与基准测试

在Go语言中&#xff0c;测试是一个非常重要的部分&#xff0c;它帮助开发者确保代码的正确性、性能以及可维护性。Go语言提供了一套标准的测试工具&#xff0c;这些工具可以帮助开发者编写单元测试、表达式测试&#xff08;通常也是指单元测试中的断言&#xff09;、基准测试等…...

K8S + Jenkins 做CICD

前言 这里会做整体CICD的思路和流程的介绍&#xff0c;会给出核心的Jenkins pipeline脚本&#xff0c;最后会演示一下 实验/实操 结果 由于整体内容较多&#xff0c;所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用 要看保姆式教学的可以划走了&…...

http/https

1、http与https HTTPHTTPS信息明文传输加入ssl加密传输协议&#xff0c;可以使得报文加密传输默认端口80默认端口443连接简单TCP三次握手通信TCP三次握手后还要SSL/TLS握手过程&#xff0c;才可以加密报文传输无状态不安全需要到CA申请证书&#xff0c;身份认证&#xff0c;自…...

腾讯云 AI 代码助手:产品研发过程的思考和方法论

一、文章摘要 本文将详细阐述 腾讯云 AI 代码助手的历史发展形态与产品整体架构&#xff0c;并从技术、研发方法论的角度分别阐述了产品的研发过程。 全文阅读约 5&#xff5e;8 分钟。 二、产品布局 AI 代码助手产品经历了三个时代的发展 第一代诸如 Eclipse、Jetbrains、V…...

淘宝商品评论爬虫:Java实现指南

在当今的互联网时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是用户生成的内容&#xff0c;如商品评论&#xff0c;对于理解消费者行为和市场趋势具有重要意义。淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品评论数据。本文将介绍如何使用Java编写一个简单…...

银河麒麟v10 x86架构二进制方式kubeadm+docker+cri-docker搭建k8s集群(证书有效期100年) —— 筑梦之路

环境说明 master&#xff1a;192.168.100.100 node: 192.168.100.101 kubeadm 1.31.2 &#xff08;自编译二进制文件&#xff0c;证书有效期100年&#xff09; 银河麒麟v10 sp2 x86架构 内核版本&#xff1a;5.4.x 编译安装 cgroup v2启用 docker版本&#xff1a;27.x …...

【Linux】详解shell代码实现(上)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 学校开始搞蓝桥的校选…...

Ruby 模块(Module)

Ruby 模块&#xff08;Module&#xff09; 概述 Ruby 是一种动态、开放源代码的编程语言&#xff0c;以其简洁明了的语法和强大的功能而闻名。在 Ruby 中&#xff0c;模块&#xff08;Module&#xff09;是一个重要的概念&#xff0c;它用于封装一组相关的方法和常量。模块提…...

成都睿明智科技有限公司怎么样可靠不?

在这个日新月异的数字时代&#xff0c;电商行业如同一股不可阻挡的洪流&#xff0c;席卷着每一个消费者的生活。而抖音&#xff0c;作为短视频与电商完美融合的典范&#xff0c;更是为无数商家开辟了一片全新的蓝海。在这片充满机遇与挑战的海洋中&#xff0c;成都睿明智科技有…...

内网安全隧道搭建-ngrok-frp-nps-sapp

1.ngrok 建立内网主机与公网跳板机的连接&#xff1a; 内网主机为客户机&#xff1a; 下载客户端执行 2.frp &#xff08;1&#xff09;以下为内网穿透端口转发 frp服务端配置&#xff1a; bindPort 为frp运行端口 服务端运行 ./frps -c frps.ini frp客户端配置&#xf…...

k8s 对外服务之 Ingress

LB ingress //Ingress 简介 service的作用体现在两个方面&#xff0c;对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b;对集群外部&#xff0c;他类似负载均衡器&#xff0c;…...

前端速通(JavaScript)

1 初识JavaScript 1 JavaScript是什么 JavaScript 是一种高层的、轻量级的、解释型的编程语言&#xff0c;最初由 Netscape 公司于 1995 年开发。它的特点包括&#xff1a; 动态性&#xff1a;JavaScript是动态类型语言&#xff0c;允许开发者灵活地操作数据。跨平台&#xf…...

Unity图形学之着色器之间传递参数

1.初始化 struct&#xff1a; UNITY_INITIALIZE_OUTPUT&#xff08;type,name&#xff09; Type: struct 名字 Name :变量的名字 struct Input{float2 uv_MainTex;float3 myColor;};half _Glossiness;half _Metallic;fixed4 _Color;void MyVertx(inout appdata_base v,out I…...

JavaScript中的this指向问题

JavaScript中的this指向问题 1.1 为什么需要this? 为什么需要this? 在常见的编程语言中&#xff0c;几乎都有this这个关键字&#xff08;Objective-C中使用的是self),但是在JavaScript中的this和常见的面向对象语言中的this不太一样 常见面向对象的编程语言中&#xff0c;比…...

Qt之QWidget相关

Qt概述 Qt 是一个跨平台的 C 开发框架。 跨平台支持&#xff1a;可以用于开发 Windows、macOS、Linux、Android、iOS 等多种操作系统下的应用程序。这意味着开发者使用 Qt 编写的代码&#xff0c;在经过适当的编译和配置后&#xff0c;能够在不同平台上运行&#xff0c;减少了…...

Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析

1. 产品定位 Ease Monitor 有如下的产品定位&#xff1a; 关注于整体应用的SLA。 主要从为用户服务的 API 来监控整个系统。 关联指标聚合。 把有关联的系统及其指示聚合展示。主要是三层系统数据&#xff1a;基础层、平台中间件层和应用层。 快速故障定位。 对于现有的系统…...

苹果MacOS 调用自编译opencv的Dylib显示一个图片程序的步骤

前言 为了测试自编译的opencv库是否能在苹果MacOS系统下使用&#xff0c;需要写一个简单的测试程序。这个测试程序写起来不难&#xff0c;麻烦的是一些配置。网上的办法很多&#xff0c;里面因为版本的问题有一些坑。特此写了一个建立步骤&#xff0c;供大家参考。 1、新建一个…...

网页中调用系统的EXE文件,如打开QQ

遇到一个实际的问题&#xff0c;需要在网页中打开本地的某个工业软件。 通过点击exe文件就可以调用到程序。 比如双击qq的exe就可以启动qq的程序。 那么问题就变成了如何加载exe程序呢&#xff1f; 可以通过Java的 Process process Runtime.getRuntime().exec(command);通过…...

在 Ubuntu 系统上安装 npm 环境以及 nvm(Node Version Manager)

在 Ubuntu 系统上安装 npm 环境以及 nvm&#xff08;Node Version Manager&#xff09; 步骤 1: 更新系统包步骤 2: 安装 nvm步骤 3: 安装 Node.js 和 npm步骤 4: 设置默认 Node.js 版本&#xff08;可选&#xff09;总结 在 Ubuntu 系统上安装 npm 环境以及 nvm&#xff08;No…...

Linux环境开启MongoDB的安全认证

文章目录 1. MongoDB安全认证简介1.1 访问控制1.2 角色1.3 权限 2. MongoDB中的常见角色3. MongoDB Shell3.1 下载MongoDB Shell3.2 通过MongoDB Shell连接MongoDB 4. 创建管理员用户5. 为具体的数据库创建用户6. 开启权限认证7. 重启MongoDB服务8. 连接MongoDB9. MongoDB数据库…...

实现了两种不同的图像处理和物体检测方法

这段代码实现了两种不同的图像处理和物体检测方法&#xff1a;一种是基于Canny边缘检测与轮廓分析的方法&#xff0c;另一种是使用TensorFlow加载预训练SSD&#xff08;Single Shot Multibox Detector&#xff09;模型进行物体检测。 1. Canny边缘检测与轮廓分析&#xff1a; …...

经典工具 | 使用SIFT预测错义突变的有害性

SIFT 用计算机替代人预测复杂事件的影响&#xff0c;是我们这个时代最令人兴奋的科学进展之一。SIFT就是这样一个应用于基因组学研究的经典工具。 SIFT可预测多种生物体的基因组变异&#xff0c;主要是错义突变的影响与效应&#xff0c;最大的特点是物种丰富&#xff0c;是一个…...

如何给 Apache 新站点目录配置 SELinux ?

在 web 服务器管理领域&#xff0c;确保服务器环境的安全性至关重要。SELinux (Security-Enhanced Linux) 是保护 Linux 服务器最有效的工具之一&#xff0c;它是一种强制访问控制 (MAC mandatory access control) 安全机制。当使用最流行的 web 服务器 Apache 提供 web 内容时…...

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展&#xff0c;流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言&#xff0c;把握这些趋势并积极应对挑战将是实现成功的关键…...

云讷科技Kerloud无人飞车专利发布

云讷科技Kerloud无人飞车获得了“一种室内外两用的四旋翼无人飞车”的实用新型专利证书&#xff0c;作为科教社区第一款四旋翼飞车&#xff0c;这项技术结合了无人机和无人车的优势&#xff0c;提供了一种能够在多种环境下使用的多功能飞行器。 这项设计的优势如下&#xff…...

快速识别模型:simple_ocr,部署教程

快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型&#xff1a;检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…...

Qt交叉编译x86和arm心得

最近一直在Linux上开发qt程序&#xff0c;主要工作是在x86的Ubuntu上开发编译调试程序&#xff0c;确定没有问题后交叉编译到arm的linux系统上运行 1.环境 Qt的交叉编译环境厂家已经提供了&#xff0c;嵌入式的同事帮我安装调试的&#xff0c;具体就是装了厂家给的gcc编译套件…...

用CAXA CAD电子图板导入图框、标题栏并导出pdf的方法

1.导入图框&#xff1a; 点击调入图框->出现读入图框文件 一个一个点击&#xff0c;选择合适的图框 然后点击导入 2.导入标题栏&#xff1a; 调入标题栏->出现读入标题栏文件 一个一个点击&#xff0c;选择合适的标题栏&#xff0c;然后点击导入 3.导出pdf&#x…...

在 Ubuntu/Debian 上安装 Go

使用官方二进制文件安装&#xff08;推荐&#xff09; Go 提供了官方的二进制安装包&#xff0c;适用于大多数 Linux 发行版&#xff0c;包括 Ubuntu 和 Debian。步骤如下&#xff1a; 更新包索引&#xff1a; bash sudo apt update 安装依赖&#xff08;如果尚未安装&#…...

设计模式之策略模式-工作实战总结与实现

文章目录 应用场景存在问题解决方案继续延伸 应用场景 假设有这样的业务场景&#xff0c;大数据系统把文件推送过来&#xff0c;根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码&#xff1a; public class Question {public static void main(String[] args…...

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

实验十三 生态安全评价

1 背景及目的 生态安全是生态系统完整性和健康性的整体反映&#xff0c;完整健康的生态系统具有调节气候净化污染、涵养水源、保持水土、防风固沙、减轻灾害、保护生物多样性等功能。维护生态安全对于人类生产、生活、健康及可持续发展至关重要。随着城市化进程的不断推进&…...

【MySQL实战45讲笔记】基础篇——redo log 和 binlog

系列文章 基础篇——MySQL 的基础架构 目录 系列文章1. 重要的日志模块&#xff1a;redo log 和 binlog1.1 redo log1.2 binlog1.3 执行器和 InnoDB 引擎内部如何执行更新语句 1. 重要的日志模块&#xff1a;redo log 和 binlog 前面系统的了解了一个查询语句的执行流程&…...

Java 基于SpringBoot+vue框架的老年医疗保健网站

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Java Java 基于SpringBootvue框架的老年医疗保健网站。该系统采用 Java 语言开发&#xff0c;SpringBoot 框架&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大…...

Java集合分页

一、前言 在Java开发中&#xff0c;若单次展示的数据量太大&#xff0c;会造成程序响应缓慢&#xff0c;就需要用到分页功能&#xff0c;每一页展示一定量的数据&#xff0c;分多次展示 ... 那么在List集合中&#xff0c;如何实现分页功能呢&#xff1f; 本文将以3种方式&…...

python语言基础-5 进阶语法-5.5 上下文管理协议(with语句)

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.5 上下文管理协议&#xff08;with语句&#xff09;&#xff08;参考链接&#xff1…...

周志华深度森林deep forest(deep-forest)最新可安装教程,仅需在pycharm中完成,超简单安装教程

1、打开pycharm 没有pycharm的&#xff0c;在站内搜索安装教程即可。 2、点击“文件”“新建项目” 3、创建项目&#xff0c;Python版本中选择Python39。如果没有该版本&#xff0c;选择下面的Python 3.9下载并安装。 4、打开软件包&#xff0c;搜索“deep-forest”软件包&am…...

技术美术百人计划 | 《2.1 色彩空间介绍》笔记

总览 一、色彩发送器 色彩认知&#xff1a; 光源是出生点&#xff0c;光源发射出光线&#xff0c;光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后&#xff0c;人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑&#xff0c;最终大脑对颜色产生了认…...

设计模式:6、装饰模式(包装器)

目录 0、定义 1、装饰模式包含的四种角色 2、装饰模式的UML类图 3、示例代码 0、定义 动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。 1、装饰模式包含的四种角色 抽象组件&#xff08;Component&#xff09;&#xff1a;抽象组件是一个抽象…...

vue-office:word(.docx)、pdf、excel(.xlsx,.xls)格式文件预览

vue-office&#xff1a;word&#xff08;.docx&#xff09;、excel&#xff08;.xlsx&#xff0c;.xls&#xff09;格式文件预览 组件安装 // docx文档预览组件 npm install vue-office/docx vue-demi0.14.6// excel文档预览组件 npm install vue-office/excel vue-demi0.14.…...

简单工厂模式

简单工厂模式详解 定义 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;用于创建对象的实例。通过一个工厂类来决定实例化哪一个具体类&#xff0c;降低客户端与具体类之间的耦合。 对于长switch或者长if、else&#xff0c;且…...

得物彩虹桥架构演进之路-负载均衡篇

文 / 新一 一、前言 一年一更的彩虹桥系列又来了&#xff0c;在前面两期我们分享了在稳定性和性能2个层面的一些演进&优化思路。近期我们针对彩虹桥 Proxy 负载均衡层面的架构做了一次升级&#xff0c;目前新架构已经部署完成&#xff0c;生产环境正在逐步升级中&#xf…...

【大数据学习 | Spark-Core】spark-shell开发

spark的代码分为两种 本地代码在driver端直接解析执行没有后续 集群代码&#xff0c;会在driver端进行解析&#xff0c;然后让多个机器进行集群形式的执行计算 spark-shell --master spark://nn1:7077 --executor-cores 2 --executor-memory 2G sc.textFile("/home/ha…...

macos 使用 nvm 管理 node 并自定义安装目录

系统环境&#xff1a;MacOS Version 参考文章&#xff1a; Github 地址&#xff1a;https://github.com/nvm-sh/nvm 安装的方式是很简单的&#xff0c;直接执行下面的命令即可&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bas…...

MongoDB分片集群搭建

什么是分片 分片是一种跨多台机器分布数据的方法。MongoDB 使用分片来支持超大数据集和高吞吐量操作的部署。什么情况下使用分片 存储容量受单机限制&#xff0c;即磁盘资源遭遇瓶颈。读写能力受单机限制&#xff0c;可能是CPU、内存或者网卡等资源遭遇瓶颈&#xff0c;导致读…...

MySQL数据库基础

1.数据库的操作 1.1 显示当前数据库 show databses; 1.2 创建数据库 create database [if not exist] db_name; 创建名为db_test1的数据库 create database db_test1; 说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集;utf8,校验规则是 utf8_general_c…...

前端性能优化

前端性能优化是提升用户体验的重要环节&#xff0c;优化的目标是减少页面加载时间、提高交互响应速度、降低资源消耗。以下从 加载性能优化、渲染性能优化 和 交互性能优化 三个维度详细说明&#xff1a; 一、加载性能优化 目标是减少页面首次加载时间&#xff0c;提升页面的加…...

深度学习中的正则化技术

在深度学习中&#xff0c;正则化是一种防止模型过拟合的重要手段。过拟合是指模型在训练数据上表现良好&#xff0c;但在未见数据上表现不佳的现象。正则化通过引入额外的约束或信息来限制模型的复杂性&#xff0c;从而提高模型的泛化能力。本文将介绍几种常见的正则化技术&…...

工商银行湖仓智一体创新应用实践

数智技术已经成为企业数字化转型的核心动力 国家《“十四五”数字经济发展规划》指出数字经济是未来的主要经济形态,数据因其倍增效应和乘数效应,可以带来全要素效率的提升,已经成为数字经济的核心要素资源,是企业数字化转型的新要素、新动能。为了高质量推进企业数字化转…...

测试实项中的偶必现难测bug之模糊匹配逻辑

问题: 现在有一个场景,如果只是通过功能测试会比较难测,例如刚开始我们做会员的时候,只有白银会员,在用户分群的场景下,需要用条件逻辑匹配,当时开发用了like的匹配方式没有问题。1年后加了白银试用会员,导致在统计会员分群的时候明明条件选的是白银会员,但是统计的数…...