Golang 依赖注入库Wire应用案例

news2025/1/31 11:05:55

文章目录

  • 简介
  • Github
  • 指南
  • 安装
  • 案例
    • wire.NewSet
    • wire.Build
    • wire.Bind
    • wire.Struct
    • wire.Value
    • wire.InterfaceValue

简介

Go语言的依赖注入库Wire是由Google提供的一个代码生成工具,用于简化和自动化依赖注入过程。Wire主要通过生成代码来处理依赖关系,而不是在运行时动态地解决依赖,这使得它更高效且易于调试。

  • wire.NewSet: NewSet 函数用于创建一个新的依赖集合。你可以将需要被注入的类型和提供这些类型依赖的函数放入到这个集合中。

  • wire.Build: Build 函数用于生成依赖注入代码。你可以将之前创建的依赖集合传递给 Build 函数,然后它将生成相应的代码用于构建依赖。

  • wire.Bind: Bind 函数用于将一个接口类型与其实现类型进行绑定。这样在依赖注入时,当需要注入某个接口类型时,Wire会知道该使用哪个具体的实现类型。

  • wire.Struct: Struct 函数用于将结构体类型与其字段进行绑定。这样在依赖注入时,可以将结构体的字段通过依赖注入的方式进行初始化。

  • wire.Value: Value 函数用于声明一个特定的值作为依赖。在依赖注入时,这个值会被直接使用,而不需要再进行额外的初始化。

  • wire.InterfaceValue: InterfaceValue 函数用于声明一个接口类型的值作为依赖。在依赖注入时,这个值会被用作接口类型的实现。

  • Wire的应用场景:

    • 构建复杂依赖图:Wire特别适用于处理具有复杂依赖关系的应用程序,尤其是当依赖项数量庞大且层次深厚时。

    • 简化初始化逻辑:通过自动生成依赖注入代码,Wire简化了对象的初始化逻辑,使代码更加简洁和易于维护。

    • 提高代码可测试性:通过接口绑定和依赖注入,Wire可以帮助实现松耦合结构,从而提高代码的可测试性。

    • 提升性能:Wire在编译时解析和生成依赖注入代码,因此在运行时不需要额外的依赖解析步骤,这使得它比一些运行时依赖注入框架更高效。

Github

  • https://github.com/google/wire

指南

  • https://github.com/google/wire/blob/main/docs/guide.md

安装

go get github.com/google/wire/cmd/wire
# 安装
go install github.com/google/wire/cmd/wire@latest

案例

wire.NewSet

wire.NewSet 是 Wire 库中用于创建依赖集合的函数。在依赖注入的场景中,你可以使用 wire.NewSet 将多个提供者函数(即构造函数)或现有值组合到一起,形成一个提供依赖项的集合。这对于组织和管理依赖项非常有帮助。

  • 应用场景
    • 分组管理依赖项:你可以将相关的依赖项分组到一个集合中,方便在不同的构建上下文中复用这些依赖项。
    • 模块化设计:通过创建不同的依赖集合,可以更清晰地表达模块之间的依赖关系。
    • 测试:可以创建不同的依赖集合用于测试,以便轻松替换实际依赖项。

wire.Build

wire.Build 是 Wire 库中的核心函数,用于生成依赖注入代码。它通过构建依赖图,根据提供的依赖集合自动生成所需的初始化代码。

  • 应用场景
    • 复杂依赖关系管理:在大型应用程序中,管理复杂的依赖关系是很困难的,使用 wire.Build 可以自动处理这些依赖。
    • 模块化开发:在模块化开发中,每个模块可能有自己的依赖项,通过 wire.Build 可以轻松组合不同模块的依赖。
    • 测试和替换依赖:在测试中,使用 wire.Build 可以方便地替换实际依赖项以进行单元测试。

在这里插入图片描述

  1. 定义依赖项和构造函数:定义 Database, HTTPServer 和 App 结构体,以及它们的构造函数。
  2. 创建依赖集合:使用 wire.NewSet 将构造函数组合成集合 ProviderSet。
  3. 生成依赖注入代码:在 app/wire.go 中,使用 wire.Build 和 ProviderSet 生成依赖注入代码。
  4. 使用生成的代码:在 main.go 中,调用 app.InitApp 函数初始化应用程序。
cd demo
# 初始化
go mod init example.com/demo
# 下载依赖库
go mod tidy
  • app/app.go
package app

import (
	"github.com/google/wire"
	"example.com/demo/db"
	"example.com/demo/server"
)

// App 是我们的应用程序,依赖于 HTTPServer
type App struct {
	Server *server.HTTPServer
}

// NewApp 是 App 的构造函数
func NewApp(server *server.HTTPServer) *App {
	return &App{
		Server: server,
	}
}

// ProviderSet 是应用程序模块的依赖集合
var ProviderSet = wire.NewSet(NewApp, db.ProviderSet, server.ProviderSet)
  • app/wire.go
// +build wireinject

package app

import (
	"github.com/google/wire"
)

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	wire.Build(ProviderSet)
	return &App{}
}
  • app/wire_gen.go
// Code generated by Wire. DO NOT EDIT.

//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject

package app

import (
	"example.com/demo/db"
	"example.com/demo/server"
)

// Injectors from wire.go:

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	database := db.NewDatabase()
	httpServer := server.NewHTTPServer(database)
	app := NewApp(httpServer)
	return app
}
  • db/db.go
package db

import "github.com/google/wire"

// Database 是一个简单的数据库连接模拟
type Database struct {
	DSN string
}

// NewDatabase 是 Database 的构造函数
func NewDatabase() *Database {
	return &Database{
		DSN: "user:password@/dbname",
	}
}

// ProviderSet 是数据库模块的依赖集合
var ProviderSet = wire.NewSet(NewDatabase)
  • server/server.go
package server

import (
	"example.com/demo/db"
	"github.com/google/wire"
)

// HTTPServer 是一个简单的 HTTP 服务器
type HTTPServer struct {
	DB *db.Database
}

// NewHTTPServer 是 HTTPServer 的构造函数
func NewHTTPServer(db *db.Database) *HTTPServer {
	return &HTTPServer{
		DB: db,
	}
}

// ProviderSet 是服务器模块的依赖集合
var ProviderSet = wire.NewSet(NewHTTPServer)
  • main.go
package main

import (
	"fmt"
	"example.com/demo/app"
)

func main() {
	// 调用 app 包中的 InitApp 函数初始化应用
	myApp := app.InitApp()
	fmt.Printf("App initialized with server: %+v\n", myApp.Server)
}
  • 生成wire_gen.go
cd demo && wire
# 或
cd demo/app && wire
cd demo
go run .

wire.Bind

wire.Bind 是 Wire 提供的一个功能,用于将接口类型与具体实现类型绑定。这在依赖注入的场景中特别有用,因为它允许你将接口注入到依赖树中,而不是具体实现,从而实现更灵活和可测试的代码结构。

  • 应用场景
    • 接口与实现的解耦:当你的代码依赖于接口而不是具体实现时,可以更容易地更换实现或者进行单元测试。
    • 依赖注入中的多态性:在构建依赖图时,可以选择不同的具体实现绑定到相同的接口上,以实现多态行为。

在这里插入图片描述

  1. 定义接口和实现:在 service 包中定义 Service 接口和 RealService 实现。
  2. 构造函数和 ProviderSet:定义 NewRealService 构造函数和 ProviderSet,并使用 wire.Bind 将 Service 接口绑定到 RealService 实现。
  3. 使用依赖注入:在 app 包中定义 App 结构体及其构造函数 NewApp,并在 ProviderSet 中包含 service.ProviderSet。
  4. 生成 Wire 代码:在 app/wire.go 中使用 wire.Build 和 ProviderSet 生成依赖注入代码。
  5. 初始化应用:在 main.go 中调用 app.InitApp 初始化应用,并调用服务的方法。
  • app/app.go
package app

import (
	"github.com/google/wire"
	"example.com/demo/service"
)

// App 是我们的应用程序,依赖于 Service
type App struct {
	Service service.Service
}

// NewApp 是 App 的构造函数
func NewApp(service service.Service) *App {
	return &App{
		Service: service,
	}
}

// ProviderSet 是应用程序模块的依赖集合
var ProviderSet = wire.NewSet(NewApp, service.ProviderSet)
  • app/wire.go
// +build wireinject

package app

import (
	"github.com/google/wire"
)

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	wire.Build(ProviderSet)
	return &App{}
}
  • app/wire_gen.go
// Code generated by Wire. DO NOT EDIT.

//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject

package app

import (
	"example.com/demo/service"
)

// Injectors from wire.go:

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	realService := service.NewRealService()
	app := NewApp(realService)
	return app
}
  • service/service.go
package service

import (
	"github.com/google/wire"
)

// Service 是一个接口,定义了服务的行为
type Service interface {
	Serve() string
}

// RealService 是 Service 接口的具体实现
type RealService struct{}

// Serve 是 RealService 的 Serve 方法实现
func (s *RealService) Serve() string {
	return "Real service serving"
}

// NewRealService 是 RealService 的构造函数
func NewRealService() *RealService {
	return &RealService{}
}

// ProviderSet 是服务模块的依赖集合
var ProviderSet = wire.NewSet(
	NewRealService,
	wire.Bind(new(Service), new(*RealService)),
)
  • main.go
package main

import (
	"fmt"
	"example.com/demo/app"
)

func main() {
	// 调用 app 包中的 InitApp 函数初始化应用
	myApp := app.InitApp()
	fmt.Println(myApp.Service.Serve())
}

wire.Struct

wire.Struct 是 Wire 提供的一个功能,用于简化结构体的构造。当一个结构体有多个字段需要注入时,wire.Struct 可以自动生成构造函数,注入所有字段。它特别适用于需要依赖注入的复杂结构体。

  • 应用场景
    • 简化构造函数:当一个结构体有很多字段时,手动编写构造函数可能会很繁琐,使用 wire.Struct 可以自动生成构造函数。
    • 减少样板代码:在大型项目中,减少手动编写的构造函数代码,提高开发效率。
    • 保证依赖注入的正确性:通过自动生成构造函数,减少人为错误。

在这里插入图片描述

  1. 定义结构体:在 app 包中定义 App 结构体,它依赖于 HTTPServer 和 Database。
  2. 使用 wire.Struct:在 ProviderSet 中使用 wire.Struct(new(App), “*”),表示将自动生成 App 的构造函数并注入所有字段。
  3. 生成依赖注入代码:在 app/wire.go 中使用 wire.Build 和 ProviderSet 生成依赖注入代码。
  4. 初始化应用:在 main.go 中调用 app.InitApp 函数初始化应用。
  • app/app.go
package app

import (
	"github.com/google/wire"
	"example.com/demo/db"
	"example.com/demo/server"
)

// App 是我们的应用程序,依赖于 HTTPServer 和 Database
type App struct {
	Server *server.HTTPServer
	Db     *db.Database
}

// ProviderSet 是应用程序模块的依赖集合
var ProviderSet = wire.NewSet(wire.Struct(new(App), "*"), db.ProviderSet, server.ProviderSet)
  • app/wire.go
// +build wireinject

package app

import (
	"github.com/google/wire"
)

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	wire.Build(ProviderSet)
	return &App{}
}
  • app/wire_gen.go
// Code generated by Wire. DO NOT EDIT.

//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject

package app

import (
	"example.com/demo/db"
	"example.com/demo/server"
)

// Injectors from wire.go:

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	database := db.NewDatabase()
	httpServer := server.NewHTTPServer(database)
	app := &App{
		Server: httpServer,
		Db:     database,
	}
	return app
}
  • db/db.go
package db

import "github.com/google/wire"

// Database 是一个简单的数据库连接模拟
type Database struct {
	DSN string
}

// NewDatabase 是 Database 的构造函数
func NewDatabase() *Database {
	return &Database{
		DSN: "user:password@/dbname",
	}
}

// ProviderSet 是数据库模块的依赖集合
var ProviderSet = wire.NewSet(NewDatabase)
  • server/server.go
package server

import (
	"example.com/demo/db"
	"github.com/google/wire"
)

// HTTPServer 是一个简单的 HTTP 服务器
type HTTPServer struct {
	DB *db.Database
}

// NewHTTPServer 是 HTTPServer 的构造函数
func NewHTTPServer(db *db.Database) *HTTPServer {
	return &HTTPServer{
		DB: db,
	}
}

// ProviderSet 是服务器模块的依赖集合
var ProviderSet = wire.NewSet(NewHTTPServer)
  • main.go
package main

import (
	"fmt"
	"example.com/demo/app"
)

func main() {
	// 调用 app 包中的 InitApp 函数初始化应用
	myApp := app.InitApp()
	fmt.Printf("App initialized with server: %+v\n", myApp.Server)
}

wire.Value

wire.Value 是 Wire 提供的一个功能,用于注入一个特定的值。这在配置项或常量注入等场景中特别有用,能够为依赖注入过程提供静态的值。

  • 应用场景
    • 配置注入:将配置项(如数据库连接字符串、API 密钥等)注入到依赖树中。
    • 静态值注入:对于某些不会改变的常量值,使用 wire.Value 注入这些值。
    • 默认值注入:为某些依赖项提供默认值。

在这里插入图片描述

  1. 定义配置结构体:在 config 包中定义 Config 结构体和 NewConfig 构造函数。
  2. 使用 wire.Value:在 config.ProviderSet 中使用 wire.Value(Config{DSN: “user:password@/dbname”}) 注入静态配置值。
  3. 定义数据库结构体:在 db 包中定义 Database 结构体和 NewDatabase 构造函数。
  4. 构建依赖树:在 app 包中定义 App 结构体及其构造函数 NewApp,并在 ProviderSet 中包含 db.ProviderSet 和 config.ProviderSet。
  5. 生成依赖注入代码:在 app/wire.go 中使用 wire.Build 和 ProviderSet 生成依赖注入代码。
  6. 初始化应用:在 main.go 中调用 app.InitApp 函数初始化应用。
  • app/app.go
package app

import (
	"github.com/google/wire"
	"example.com/demo/db"
)

// App 是我们的应用程序,依赖于 Database
type App struct {
	Database *db.Database
}

// NewApp 是 App 的构造函数
func NewApp(database *db.Database) *App {
	return &App{
		Database: database,
	}
}

// ProviderSet 是应用程序模块的依赖集合
var ProviderSet = wire.NewSet(NewApp, db.ProviderSet)
  • app/wire.go
// +build wireinject

package app

import (
	"github.com/google/wire"
	"example.com/demo/config"
)

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	wire.Build(ProviderSet, config.ProviderSet)
	return &App{}
}
  • app/wire_gen.go
// Code generated by Wire. DO NOT EDIT.

//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject

package app

import (
	"example.com/demo/config"
	"example.com/demo/db"
)

// Injectors from wire.go:

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	config := _wireConfigValue
	database := db.NewDatabase(config)
	app := NewApp(database)
	return app
}

var (
	_wireConfigValue = config.Config{DSN: "user:password@/dbname"}
)
  • config/config.go
package config

import "github.com/google/wire"

// Config 是一个简单的配置结构体
type Config struct {
	DSN string
}

// NewConfig 是 Config 的构造函数
func NewConfig(dsn string) *Config {
	return &Config{
		DSN: dsn,
	}
}

// ProviderSet 是配置模块的依赖集合
var ProviderSet = wire.NewSet(
	wire.Value(Config{DSN: "user:password@/dbname"}),
)
  • db/db.go
package db

import (
	"example.com/demo/config"
	"github.com/google/wire"
)

// Database 是一个简单的数据库连接模拟
type Database struct {
	DSN string
}

// NewDatabase 是 Database 的构造函数
func NewDatabase(config config.Config) *Database {
	return &Database{
		DSN: config.DSN,
	}
}

// ProviderSet 是数据库模块的依赖集合
var ProviderSet = wire.NewSet(NewDatabase)
  • main.go
package main

import (
	"fmt"
	"example.com/demo/app"
)

func main() {
	// 调用 app 包中的 InitApp 函数初始化应用
	myApp := app.InitApp()
	fmt.Printf("App initialized with database DSN: %+v\n", myApp.Database.DSN)
}

wire.InterfaceValue

wire.InterfaceValue 是 Wire 提供的一个功能,用于将一个特定的实现绑定到一个接口。这在依赖注入中非常有用,特别是在你有多个实现并且希望在运行时或编译时决定使用哪个实现的情况下。

  • 应用场景
    • 接口实现的动态选择:当你的代码依赖于接口而不是具体实现时,可以使用 wire.InterfaceValue 动态选择不同的实现。
    • 配置驱动的实现选择:根据配置或环境变量选择不同的实现。
    • 测试替身的注入:在测试中,可以用 wire.InterfaceValue 注入模拟或替身实现。

在这里插入图片描述

  1. 定义接口和实现:在 service 包中定义 Service 接口和 RealService, MockService 实现。
  2. 配置选择实现:在 config 包中定义 SelectedService 函数,用于选择具体的服务实现。
  3. 使用 wire.InterfaceValue:在 app/wire.go 中使用 wire.InterfaceValue 将 config.SelectedService() 的返回值绑定到 Service 接口。
  4. 构建依赖树:在 app 包中定义 App 结构体及其构造函数 NewApp,并在 ProviderSet 中包含 service.ProviderSet。
  5. 生成依赖注入代码:在 app/wire.go 中使用 wire.Build 和 ProviderSet 生成依赖注入代码。
  6. 初始化应用:在 main.go 中调用 app.InitApp 函数初始化应用,并调用服务的方法。
  • app/app.go
package app

import (
	"github.com/google/wire"
	"example.com/demo/service"
)

// App 是我们的应用程序,依赖于 Service
type App struct {
	Service service.Service
}

// NewApp 是 App 的构造函数
func NewApp(service service.Service) *App {
	return &App{
		Service: service,
	}
}

// ProviderSet 是应用程序模块的依赖集合
var ProviderSet = wire.NewSet(NewApp, service.ProviderSet)
  • app/wire.go
// +build wireinject

package app

import (
	"github.com/google/wire"
	"example.com/demo/config"
	"example.com/demo/service"
)

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	wire.Build(
		ProviderSet,
		wire.InterfaceValue(new(service.Service), config.SelectedService()),
	)
	return &App{}
}
  • app/wire_gen.go
// Code generated by Wire. DO NOT EDIT.

//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject

package app

import (
	"example.com/demo/config"
)

// Injectors from wire.go:

// InitApp 使用 Wire 生成依赖注入代码
func InitApp() *App {
	service := _wireServiceValue
	app := NewApp(service)
	return app
}

var (
	_wireServiceValue = config.SelectedService()
)
  • config/config.go
package config

import "example.com/demo/service"

// SelectedService 返回要使用的服务实现
func SelectedService() service.Service {
	// 根据需要选择实际的服务实现,这里可以是基于配置或环境变量的逻辑
	return &service.RealService{}
}
  • db/db.go
package db

import (
	"example.com/demo/config"
	"github.com/google/wire"
)

// Database 是一个简单的数据库连接模拟
type Database struct {
	DSN string
}

// NewDatabase 是 Database 的构造函数
func NewDatabase(config config.Config) *Database {
	return &Database{
		DSN: config.DSN,
	}
}

// ProviderSet 是数据库模块的依赖集合
var ProviderSet = wire.NewSet(NewDatabase)
  • service/service.go
package service

import "github.com/google/wire"

// Service 是一个接口,定义了服务的行为
type Service interface {
	Serve() string
}

// RealService 是 Service 接口的一个具体实现
type RealService struct{}

func (s *RealService) Serve() string {
	return "Real service serving"
}

// MockService 是 Service 接口的另一个具体实现
type MockService struct{}

func (s *MockService) Serve() string {
	return "Mock service serving"
}

// ProviderSet 是服务模块的依赖集合
var ProviderSet = wire.NewSet()
  • main.go
package main

import (
	"fmt"
	"example.com/demo/app"
)

func main() {
	// 调用 app 包中的 InitApp 函数初始化应用
	myApp := app.InitApp()
	fmt.Println(myApp.Service.Serve())
}

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

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

相关文章

Matlab解决施密特正交规范化矩阵(代码开源)

#最近在学习matlab,刚好和线代论文重合了 于是心血来潮用matlab建了一个模型来解决施密特正交规范化矩阵。 我们知道这个正交化矩阵挺公式化的,一般公式化的内容我们都可以用计算机来进行操作,节约我们人工的时间。 我们首先把矩阵导入进去…

木工开料机与雕刻机:区别何在,如何选择?

在木工行业中,开料机和雕刻机都是不可或缺的重要设备。虽然它们在某些方面有着相似之处,但实际上它们的功能、应用场景以及操作方式都存在着明显的差异。那么,木工开料机与雕刻机到底有哪些区别呢?又该如何根据实际需求进行选择呢…

PS系统教程16

图案图章工具-印象派效果 另一种用法-印象派效果 新建图层选择图案进行绘画 如果绘画效果不强 进行画笔设置 选择复位所有锁定位置 将画笔改为硬边缘 为什么没有出来雨点效果 因为我们选择了印象派 新建图层取消勾选印象派 基本用法:可以去做图案和背景 使用…

Nginx配置详细解释:(6)实现反向代理服务器,动静分离,负载均衡

作为代理服务器是当客户端访问代理服务器时,代理服务器代理客户端去访问真实web服务器。proxy_pass; 用来设置将客户端请求转发给的后端服务器的主机。 需要模块ngx_http_upstream_module支持。 单台反向代理 在第三台主机上下载安装httpd,在主页面/v…

数据结构笔记39-48

碎碎念:想了很久,不知道数据结构这个科目最终该以什么笔记方式呈现出来,是纸质版还是电子版?后来想了又想,还是电子版吧?毕竟和计算机有关~(啊哈哈哈哈哈哈哈) 概率论已经更新完了&…

C语言经典指针运算笔试题图文解析

指针运算常常出现在面试题中&#xff0c;画图解决是最好的办法。 题目1&#xff1a; #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } //程序的结果是什么&…

JavaWeb5 SpringBoot+HTTP协议

Spring Spring Boot 非常快速构建应用程序&#xff0c;简化开发 &#xff08;1&#xff09;创建Springboot工程&#xff0c;勾选web开发依赖 创建好的目录&#xff0c;并将没用多余的删掉了 &#xff08;2&#xff09;定义请求处理类&#xff0c;并添加方法 创建请求处理类…

【iOS】UI学习(三)

目录 前言步进器和分栏控制器警告对话框和等待提示器UITextField登陆界面案例UIScrollView基础滚动视图的高级功能总结 前言 本篇博客是我在学习UI部分内容的学习笔记&#xff0c;希望对你有所帮助&#xff0c;如有错误&#xff0c;还请指出&#xff01; 步进器和分栏控制器 …

OpenEuler系统学习

OpenEuler系统简介 什么是OpenEuler&#xff0c;个人理解就是&#xff1a;通过社区合作&#xff0c;打造统一和开放的操作系统。 官方是这么介绍的&#xff1a; 欧拉是数字基础设施的开源操作系统&#xff0c;可广泛部署于服务器、云计算、边缘计算、嵌入式等各种形态设备&a…

朴素贝叶斯分类器 #数据挖掘 #Python

朴素贝叶斯分类器是一种基于概率统计的简单但强大的机器学习算法。它假设特征之间是相互独立的&#xff08;“朴素”&#xff09;&#xff0c;尽管在现实世界中这通常不成立&#xff0c;但在许多情况下这种简化假设仍能提供良好的性能。 基本原理&#xff1a;朴素贝叶斯分类器…

视觉系统辅助引导在激光导航AGV中应用

agv 在全球经济步入“寒冬”的大背景下&#xff0c;大量传统制造业企业开始谋划转变。通过引入AGV系统提升厂内物流效率、降低运营成本&#xff0c;已经成为制造业升级的趋势之一。 AGV是移动机器人的一个重要分支&#xff0c;具有并行作业、自动化、智能化和柔性化等优势&…

使用B树实现员工(人事)管理系统

1. 前言 使用B树来表示人事管理系统&#xff0c;其中每个节点代表一个人员&#xff0c;树的根节点为董事长&#xff0c;每个节点可以有多个子节点&#xff0c;表示下属。每一层代表一个等级分布。 addPerson: 添加人员功能通过查找指定上司节点&#xff0c;然后将新的人员作…

Windows 11中轻松显示休眠菜单的方法

在Windows 11中显示 眠菜单的方法 打开控制面板&#xff1a; 找到电源选项&#xff1a; 选择电源按钮的功能&#xff1a; 更改当前不可用的设置&#xff1a; 勾选休眠选项&#xff1a; 保存更改&#xff1a; 查看休眠选项&#xff1a; 如果以上步骤中未发现休眠选项&…

C++ 01 之 hello world

c01helloworld.cpp #include <iostream>using namespace std;int main() {cout << "hello world" << endl;return 0; } #include<iostream>; 预编译指令&#xff0c;引入头文件iostream.using namespace std; 使用标准命名空间cout <&l…

Golang 百题(实战快速掌握语法)_1

整形转字符串类型 实验介绍 本实验将展示三种方法来实现整形类型转字符串类型。 知识点 strconvfmt Itoa 函数 代码实例 Go 语言中 strconv 包的 itoa 函数输入一个 int 类型&#xff0c;返回转换后的字符串。下面是一个例子。 package mainimport ("fmt"&qu…

el-select filterable模糊搜索在iOS手机上无法弹出软键盘,解决方案

前提&#xff1a; el-select filterable模糊搜索在iOS手机上无法弹出软键盘&#xff0c;在手机上使用时&#xff0c;iOS手机&#xff0c;该组件无法唤起软键盘&#xff0c;导致没法进行模糊搜素。 于是。开始去找原因&#xff0c;发现主要是因为 组件中&#xff0c;input上有一…

分析GIS在疾病传播模型和公共卫生决策中的作用

在这个全球化日益加深的时代&#xff0c;疾病的跨国界传播成为全球公共卫生面临的重大挑战。地理信息科学&#xff08;GIS&#xff09;作为一门集成了空间数据采集、处理、分析及可视化的技术体系&#xff0c;在公共健康领域展现出其不可替代的价值。本文旨在深入探讨GIS如何助…

「面试必看」JS百题斩~ 原型 与 原型链

什么是原型&#xff0c;为什么需要原型 原型的强大之处在于&#xff0c;如果一组属性应该出现在每一个实例上&#xff0c;那我们就可以重用它们——尤其是对于方法。如下例子&#xff1a; function User(name,age){this.name name;this.age age;this.sayHi function(){con…

Linux命令-⽤户、权限管理

目录 <1>查看当前⽤户&#xff1a;whoami <2>查看登录⽤户&#xff1a;who <3>退出登录账户&#xff1a; exit <4>添加⽤户账号&#xff1a;useradd <5>设置⽤户密码&#xff1a;passwd <6>删除⽤户&#xff1a;userdel <7>切换⽤户…

【数据结构】双向链表(C语言)

哈喽铁子们&#xff0c;这里是博主鳄鱼皮坡。这篇文章将分享交流双向链表的相关知识&#xff0c;下面正式开始。 1. 双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严 谨&#xff0c;但是为了老…