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

【Viper】配置格式与支持的数据源与go案例

Viper 是一个用于 Go 应用程序的配置管理库,支持多种配置格式和数据源。


安装依赖

go get github.com/spf13/viper
go get github.com/spf13/viper/remote
go get go.etcd.io/etcd/client/v3

"github.com/spf13/viper/remote"要写在etcd客户端import里

1. 配置格式—就是可以读的配置类型

Viper 支持多种常见的配置格式,包括:

  • JSON: 一种轻量级的数据交换格式,易于阅读和编写。
  • YAML: 一种人类可读的数据序列化格式,常用于配置文件。
  • TOML: 一种易于阅读的配置文件格式,旨在成为最小的配置文件格式。
  • HCL: HashiCorp 配置语言,用于描述基础设施配置。
  • Java Properties: 一种简单的键值对格式,常用于 Java 应用程序。
  • INI: 一种简单的配置文件格式,常用于 Windows 应用程序。
  • Envfile: 环境变量文件格式,通常用于存储环境变量。

2. 支持的数据源—可以从哪里导入要读的配置

Viper 不仅支持从文件中读取配置,还支持从多种数据源获取配置,包括:

  • 文件: 从本地文件系统中读取配置文件。
  • 环境变量: 从操作系统的环境变量中读取配置。
  • io.Reader: 从Reader中读取配置。
  • 远程配置系统: 从远程配置系统(如 etcd、Consul)中读取配置。

Viper 支持的四种常见数据源的简单实现:

1. 文件

Viper 支持从多种文件格式中读取配置,包括 JSON、YAML、TOML、HCL、INI 等。

使用方法

  • 设置配置文件路径和名称
    viper.SetConfigName("config") // 配置文件名称(不带扩展名)
    viper.SetConfigType("yaml")   // 配置文件类型(如 yaml、json 等)
    viper.AddConfigPath(".")      // 配置文件搜索路径
    
  • 读取配置文件
    if err := viper.ReadInConfig(); err != nil {log.Fatalf("Error reading config file: %s", err)
    }
    

示例

假设有一个 config.yaml 文件:

database:host: localhostport: 5432

读取配置:

viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
if err := viper.ReadInConfig(); err != nil {log.Fatal(err)
}
fmt.Println("Database Host:", viper.GetString("database.host"))
fmt.Println("Database Port:", viper.GetInt("database.port"))

2. 环境变量

Viper 可以从操作系统的环境变量中读取配置,适合在容器化或云原生环境中使用。

使用方法

  • 启用环境变量支持
    viper.AutomaticEnv() // 自动绑定环境变量
    
  • 设置环境变量前缀(可选):
    viper.SetEnvPrefix("MYAPP") // 环境变量前缀(如 MYAPP_DATABASE_HOST)
    
  • 绑定特定键到环境变量
    viper.BindEnv("database.host", "DB_HOST") // 将 database.host 绑定到环境变量 DB_HOST
    

示例

假设设置了环境变量:

export DB_HOST=localhost
export DB_PORT=5432

读取配置:

viper.AutomaticEnv()
viper.BindEnv("database.host", "DB_HOST")
viper.BindEnv("database.port", "DB_PORT")
fmt.Println("Database Host:", viper.GetString("database.host"))
fmt.Println("Database Port:", viper.GetInt("database.port"))

3. io.Reader

Viper 支持从实现了 io.Reader 接口的对象中读取配置,适合从内存或网络流中加载配置。

使用方法

  • io.Reader 读取配置
    configData := []byte(`{"database": {"host": "localhost", "port": 5432}}`)
    reader := bytes.NewReader(configData)
    viper.SetConfigType("json") // 设置配置类型
    if err := viper.ReadConfig(reader); err != nil {log.Fatal(err)
    }
    

示例

configData := []byte(`
database:host: localhostport: 5432
`)
reader := bytes.NewReader(configData)
viper.SetConfigType("yaml")
if err := viper.ReadConfig(reader); err != nil {log.Fatal(err)
}
fmt.Println("Database Host:", viper.GetString("database.host"))
fmt.Println("Database Port:", viper.GetInt("database.port"))

4. etcd

Viper 支持从 etcd(分布式键值存储)中读取配置,适合分布式系统的配置管理。

使用方法

  • 安装 etcd 支持
    go get github.com/spf13/viper/remote
    
  • 配置 etcd 客户端
    import ("github.com/spf13/viper"_ "github.com/spf13/viper/remote"
    )
    
  • 从 etcd 读取配置
    viper.AddRemoteProvider("etcd", "http://127.0.0.1:2379", "/config/path")
    viper.SetConfigType("yaml") // 设置配置类型
    if err := viper.ReadRemoteConfig(); err != nil {log.Fatal(err)
    }
    

示例

假设 etcd 中存储了以下配置:

database:host: localhostport: 5432

读取配置:

viper.AddRemoteProvider("etcd", "http://127.0.0.1:2379", "/config/path")
viper.SetConfigType("yaml")
if err := viper.ReadRemoteConfig(); err != nil {log.Fatal(err)
}
fmt.Println("Database Host:", viper.GetString("database.host"))
fmt.Println("Database Port:", viper.GetInt("database.port"))

总结

  • 文件:适合本地开发和静态配置。
  • 环境变量:适合容器化或云原生环境。
  • io.Reader:适合从内存或网络流中加载配置。
  • etcd:适合分布式系统的动态配置管理。

综合go案例

config.env

env=dev
server.ip=127.0.0.1
server.port=8080
courses=["golang", "C/C++", "音视频", "kernel", "dpdk", "面试题", "游戏"]

config.json

{"env": "dev","server": {"ip":"127.0.0.1","port": 8085},"courses": ["golang","C/C++","音视频","kernel","dpdk","面试题","游戏"],"list": [{"name": "golang","author": "nick"},{"name": "C/C++","author": "king"},{"name": "kernel","author": "vico"},{"name": "音视频","author": "Darren"},{"name": "游戏","author": "mark"}]
}

config.noext

# 键值
env: dev
# 对象或map
server:ip: 127.0.0.1port: 8080
# 数组或列表
courses:- "golang"- "C/C++"- "音视频"- "kernel"- "dpdk"- "面试题"- "游戏"list:- name: golangauthor: nick- name: C/C++author: king- name: kernelauthor: vico- name: 音视频author: Darren- name: 游戏author: mark

config.yaml

# 键值
env: dev
# 对象或map
server:ip: 127.0.0.1port: 8080
# 数组或列表
courses:- "golang"- "C/C++"- "音视频"- "kernel"- "dpdk"- "面试题"- "游戏"list:- name: golangauthor: nick- name: C/C++author: king- name: kernelauthor: vico- name: 音视频author: Darren- name: 游戏author: mark

data_source.go

package configimport ("github.com/spf13/viper"_ "github.com/spf13/viper/remote""io""log"
)// LoadFromFile 加载配置文件。
// 该函数使用 vipers 去从指定的文件路径加载配置。
// 参数:
//
//	filepath - 配置文件的路径。
//	typ - 可选参数,指定配置文件的类型。
//
// 返回值:
//
//	*viper.Viper - 加载了配置文件数据的 viper 实例。
//	error - 如果加载配置文件时发生错误,返回该错误。
func LoadFromFile(filepath string, typ ...string) (*viper.Viper, error) {// 创建一个新的 viper 实例。v := viper.New()// 设置配置文件的路径。v.SetConfigFile(filepath)// 如果提供了配置文件类型,则设置配置文件类型。if len(typ) > 0 {v.SetConfigType(typ[0])}// 读取并解析配置文件到viper中。err := v.ReadInConfig()// 返回 viper 实例和可能的错误。return v, err
}// LoadFromEnv 初始化一个viper实例,并将其配置为自动从环境变量中加载配置。
// 该函数返回一个指向viper实例的指针,以及一个错误(此示例中未实现错误处理)。
func LoadFromEnv() (*viper.Viper, error) {// 创建一个新的viper实例。v := viper.New()// 启用自动环境变量加载,viper将自动查找与结构体字段同名的环境变量。//v.AutomaticEnv()// 手动绑定环境变量GOPATH和GOROOT到viper实例。// 这样做是为了方便地从环境变量中读取这些值,而无需手动查询环境变量。v.BindEnv("GOPATH")v.BindEnv("GOROOT")// 返回viper实例指针,以及nil作为错误值,表示没有发生错误。return v, nil
}// LoadFromIoReader 从 io.Reader 类型的参数中加载配置信息。
// 此函数主要用于从不同的读取源(如文件、网络流等)中加载配置,
// 并根据提供的 typ 参数设置配置的类型。
// 参数:
//   - reader: io.Reader 类型的接口,代表任何可以读取字节流的对象。
//   - typ: 字符串,指定配置文件的类型(例如 "json"、"yaml")。
//
// 返回值:
//   - *viper.Viper: 一个指向 viper.Viper 实例的指针,用于进一步操作或获取配置信息。
//   - error: 在读取配置过程中遇到的错误(如果有)。
func LoadFromIoReader(reader io.Reader, typ string) (*viper.Viper, error) {// 创建一个新的 viper 实例。v := viper.New()// 设置配置类型,根据传入的 typ 参数。v.SetConfigType(typ)// 从 reader 参数指定的源中读取配置信息。err := v.ReadConfig(reader)// 返回 viper 实例和可能的错误。return v, err
}// LoadFromEtcd loadFromEtcd 从 Etcd 中加载配置信息。
// 参数:
//
//	etcdAddr: Etcd服务器的地址。
//	key: 配置在Etcd中的键路径。
//	typ: 配置文件的类型。
//
// 返回值:
//
//	*viper.Viper: 加载配置后的Viper实例指针。
//	error: 错误信息,如果有的话。
func LoadFromEtcd(etcdAddr, key, typ string) (*viper.Viper, error) {// 创建一个新的Viper实例。v := viper.New()// 为Viper实例添加Etcd3远程提供者。// 这里可能会出现错误,如果提供的Etcd地址或键路径无效。err := v.AddRemoteProvider("etcd3", etcdAddr, key)if err != nil {// 记录错误信息。log.Println(err)// 返回nil和错误信息。return nil, err}// 设置Viper实例的配置类型。v.SetConfigType(typ)// 从远程提供者读取配置信息。// 这里可能会出现错误,如果无法从远程提供者获取配置信息。err = v.ReadRemoteConfig()// 返回Viper实例和可能的错误信息。return v, err
}

main.go

package mainimport ("bytes""context""fmt"clientv3 "go.etcd.io/etcd/client/v3""golang20-viper/config""log""os"
)func main() {//loadFile()//loadEnv()//loadReader()loadEtcd()
}// loadFile 函数演示了如何从不同格式的配置文件中加载配置。
// 它依次尝试加载 .env, .json, .yaml, .toml 和 .yaml 文件,并打印出特定配置项的值。
func loadFile() {// 从 "config.env" 文件加载配置,并打印出环境、服务器端口和课程信息。v1, err := config.LoadFromFile("config.env", "env")fmt.Println("config.env", err, v1.Get("env"), v1.Get("server.port"), v1.Get("courses"))// 从 "config.json" 文件加载配置,包括环境、服务器端口、课程信息和作者信息。v2, err := config.LoadFromFile("config.json")fmt.Println("config.json", err, v2.Get("env"), v2.Get("server.port"), v2.Get("courses").([]any)[0], v2.Get("list").([]any)[0].(map[string]any)["author"])// 从 "config.noext" 文件加载 YAML 格式的配置,同样打印环境、服务器端口、课程信息和作者信息。v3, err := config.LoadFromFile("config.noext", "yaml")fmt.Println("config.noext", err, v3.Get("env"), v3.Get("server.port"), v3.Get("courses").([]any)[0], v3.Get("list").([]any)[0].(map[string]any)["author"])// 从 "config.toml" 文件加载配置,展示如何获取嵌套配置项的值。v4, err := config.LoadFromFile("config.toml")fmt.Println("config.toml", err, v4.Get("env"), v4.Get("server.port"), v4.Get("courses").(map[string]any)["list"].([]any)[0], v4.Get("list").([]any)[0].(map[string]any)["author"])// 从 "config.yaml" 文件加载配置,再次打印出环境、服务器端口、课程信息和作者信息,验证不同格式文件的兼容性。v5, err := config.LoadFromFile("config.yaml")fmt.Println("config.yaml", err, v5.Get("env"), v5.Get("server.port"), v5.Get("courses").([]any)[0], v5.Get("list").([]any)[0].(map[string]any)["author"])
}func loadEnv() {v, err := config.LoadFromEnv()fmt.Println(err, v.Get("GOROOT"), v.Get("gopath"))
}// loadReader 读取配置文件并解析特定配置项。
// 该函数没有输入参数和返回值。
// 功能描述:
// 1. 读取名为 "config.yaml" 的配置文件。
// 2. 如果读取过程中遇到错误,记录错误信息并终止程序运行。
// 3. 使用 bytes.NewReader 创建一个字节流读取器来读取配置文件内容。
// 4. 调用 config.LoadFromIoReader 函数从字节流读取器中加载配置信息。
// 5. 打印解析后的配置项,包括环境变量、服务器端口、课程信息和作者信息。
func loadReader() {// 读取配置文件 "config.yaml" 的内容到 byteList。byteList, err := os.ReadFile("config.yaml")if err != nil {// 如果读取配置文件时发生错误,记录错误信息并终止程序。log.Fatalln(err)}// 创建一个新的字节流读取器来读取配置文件内容。r := bytes.NewReader(byteList)// 从字节流读取器中加载配置信息,并处理可能的错误。v, err := config.LoadFromIoReader(r, "yaml")// 打印解析后的配置项。fmt.Println("io.reader", err, v.Get("env"), v.Get("server.port"), v.Get("courses").([]any)[0], v.Get("list").([]any)[0].(map[string]any)["author"])
}// loadEtcd 函数用于从本地文件加载配置并写入到 etcd 中,然后从 etcd 中读取配置并打印部分配置项。
// 该函数不接收任何参数,也不返回任何值。
func loadEtcd() {// 定义 etcd 的地址、配置项的键以及本地配置文件的路径etcdAddr := "192.168.88.131:2379"key := "/0voice/viper/config.yaml"loaclFilepath := "config.yaml"// 将本地配置文件的内容写入到 etcd 中writeConfToEtcd(etcdAddr, key, loaclFilepath)// 从 etcd 中加载配置,并解析为 yaml 格式v, err := config.LoadFromEtcd(etcdAddr, key, "yaml")// 打印从 etcd 中读取的配置项,包括环境、服务器端口、课程列表中的第一个课程以及列表中的第一个作者的名称fmt.Println("etcd", err, v.Get("env"), v.Get("server.port"), v.Get("courses").([]any)[0], v.Get("list").([]any)[0].(map[string]any)["author"])//fmt.Println(err, v)
}// writeConfToEtcd 将本地配置文件内容写入到etcd指定键中
// 参数说明:
//   - etcdAddr: etcd服务地址,格式为"IP:PORT"
//   - key: etcd中存储配置的键名
//   - localFilepath: 本地配置文件的路径
//
// 功能说明:
//
//	读取配置文件,将其内容存入etcd集群的指定键中
//	遇到任何错误(文件读取、连接etcd、写入etcd)将直接终止程序
func writeConfToEtcd(etcdAddr, key, localFilepath string) {// 从固定路径读取配置文件内容byteList, err := os.ReadFile(localFilepath)if err != nil {// 如果读取配置文件时发生错误,记录错误信息并终止程序。log.Fatalln(err)}v := string(byteList)// 创建etcd客户端连接cli, err := clientv3.New(clientv3.Config{Endpoints: []string{etcdAddr},})if err != nil {log.Fatal(err)}// 将配置内容写入etcd指定键_, err = cli.Put(context.Background(), key, v)if err != nil {log.Fatal(err)}
}

etcd docker部署

docker run -d \
-p 2379:2379 \
-p 2380:2380 \
--restart always \
--volume=/home/etcd:/etcd-data \
--name etcd quay.io/coreos/etcd:v3.5.7 \
/usr/local/bin/etcd \
--data-dir=/etcd-data --name node1 \
--initial-advertise-peer-urls http://192.168.239.161:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--advertise-client-urls http://192.168.239.161:2379 \
--listen-client-urls http://0.0.0.0:2379 \
--initial-cluster node1=http://192.168.239.161:2380 \
--initial-cluster-token tkn \
--initial-cluster-state new

https://github.com/0voice

相关文章:

【Viper】配置格式与支持的数据源与go案例

Viper 是一个用于 Go 应用程序的配置管理库,支持多种配置格式和数据源。 安装依赖 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要写在etcd客户端import里 1…...

【工具变量】地级市数字基础设施水平数据(2003-2024年)

一、数据来源:数据涵盖了2003-2024年间地级市新型数字基础设施的发展水平测量值。数据的核心来自地方政府工作报告中提及的相关词汇,并通过对这些报告的分词和频次统计,得出每个城市在该领域的数字基础设施发展水平。 数据覆盖全国285个地级市…...

Ae:常见的光照控件和材质控件

在 After Effects中,几种模拟效果都有类似的光照控件和材质控件,比如,焦散、卡片动画、碎片等。 光照控件和材质控件允许用户模拟不同光源、阴影和高光效果,控制表面反射特性,从而实现真实的光照和反射模拟。适用于材质…...

POI 的 Excel 读写操作教程

POI 的 Excel 读写操作教程 一、POI 简介 Apache POI 是一款在 Java 开发中广受欢迎的开源库,主要用于处理各种 Microsoft Office 文件格式,Excel 文件便是其中之一。凭借其功能强大的 API,POI 不仅支持对 Excel 文件的读取、写入和修改&am…...

java处理pgsql的text[]类型数据问题

背景 公司要求使用磐维数据库,于是去了解了这个是基于PostgreSQL构建的,在使用时有场景一条图片数据中可以投放到不同的页面,由于简化设计就放在数组中,于是使用了text[]类型存储;表结构 #这是一个简化版表结构&…...

数据结构:Map Set(一)

目录 一、搜索树 1、概念 2、查找 3、插入 4、删除 二、搜索 1、概念及场景 2、模型 (1)纯key模型 (2)Key-Value模型 三、Map的使用 1、什么是Map? 2、Map的常用方法 (1)V put(K …...

Ansible 自动化 Linux 运维:解放你的双手,让运维变得简单

Ansible 自动化 Linux 运维:解放你的双手,让运维变得简单 在现代 IT 运维中,随着系统规模的不断扩展,如何高效地管理和维护大量的服务器成为了一项巨大挑战。传统的手动操作不仅费时费力,还容易出错。而 Ansible 作为一款开源的自动化运维工具,凭借其易用性和强大的功能…...

不需要移植和配置xinetd 等相类似执行文件,tftp-hpa服务器交叉移植使用说明

tftp-hpa-5.2.tar.gz :下载链接 https://download.csdn.net/download/lyeffort/90361414 tar -xvf tftp-hpa-5.2.tar.gz -C /root/tftpd/ # ./autogen.sh # export PATH/root/linux-arm-tools/mips-linux-gclibc/bin:$PATH # mkdir /root/tftpd/install # ./configure --h…...

利用用个人PC搭建私有大模型(低成本、易实施的私有大模型部署方案,兼顾英语 5G协议学习与实践需求)

背景 个人有2台电脑, 第一台: laptop cpu 12th Gen Intel Core™ i7-1260P 2.10 GHz, GPU intel iris Xe graphics, 第二台: MS-7D22,Intel Core™ i5-10400F CPU 2.90GHz, GeForce GT 730。想…...

SAP 借助 Databricks 推出Business Data Cloud

SAP与Databricks合作推出了SAP Business Data Cloud,这是一项突破性的解决方案,旨在统一和整合企业内所有SAP及第三方数据,为企业提供可信的数据基础,从而推动更具影响力的决策并促进可靠的AI应用。这一合作标志着企业数据管理的新…...

地基Spring中bean生命周期和设计模式

面试问题: 在Java面试中,当被提问到Spring中Bean的生命周期和设计模式时,你可以按照以下方式回答,以体现自己的专业知识和实际项目经验: Spring中Bean的生命周期 Spring中Bean的生命周期是一个复杂但有序的过程&#…...

CanMV的刷新比Openmv强

今天使用CanMV k230的板子,发现CanMV的刷新比Openmv强,速度快,不用再次拍照刷新,写一次就能在ide屏幕上同时显示。 参考一下CanMV K230拍照保存Demo - CanMV(K210 / K230) - 01科技 | 01Studio Takephot(…...

Xilinx kintex-7系列 FPGA支持PCIe 3.0 吗?

Xilinx kintex-7系列资源如下图 Xilinx各系列的GT资源类型和性能 PCIe Gen1/2/3的传输速率对比 K7上面使用的高速收发器GTX最高速率为12.5GT/s, PCIe Gen2 每个通道的传输速率为 5 GT/s。 PCIe Gen3 每个通道的传输速率为 8 GT/s。 所以理论上硬件支持PCIe3.0&#…...

蓝桥杯篇---实时时钟 DS1302

文章目录 前言特点简介1.低功耗2.时钟/日历功能3.32字节的额外RAM4.串行接口 DS1302 引脚说明1.VCC12.VCC23.GND4.CE5.I/O6.SCLK DS1302 寄存器1.秒寄存器2.分钟寄存器3.小时寄存器4.日寄存器5.月寄存器6.星期寄存器7.年寄存器8.控制寄存器 DS1302 与 IAP25F2K61S2 的连接1.CE连…...

【蓝桥杯嵌入式】8_IIC通信-eeprom读写

全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 这个电路允许通过I2C总线与EEPROM(M24C02-WMN6TP)和数字电位器(MCP4017T-104ELT)进行通信。EEPROM用于存储数据,而数字电位器可以用…...

支持向量机原理

支持向量机(简称SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法,不考虑特定的训练数据集,尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…...

E8移动建模关联建模表单,写入无数据

场景:移动建模新建一个招聘页面,每次通过移动建模写入建模表数据,建模表的值都要权限重构才可看见,且明细无数据。 排查原因:移动建模提交后返回的ID值为空 正常情况下提交数据应该要返回一个ID值如下: 解…...

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型,以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 📝 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。…...

前端面试大全

前端面试大全 一、htmlcss1、垂直定位的实现方式 二、javascript1、深拷贝浅拷贝2、作用域3、原型原型链4、防抖节流5、设计模式 三、ES61、 四、typescript五、vue1、vue2和vue3的区别2、生命周期3、computedwatch 六、react七、uni-app八、Cesiumopenlayer九、Threejs十、ngi…...

如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?

载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等,载体(特别是涉密载体)是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术&#xf…...

Python 调用 DeepSeek API 案例详细教程

本案例为以 Python 为例的调用 DeepSeek API 的小白入门级详细教程 步骤 先注册并登录 DeepSeek 官网:https://www.deepseek.com/ 手机号验证码注册或登录即可 创建 API KEY 注意保存,写代码时必须提供的 打开 Pycharm 创建工程 并安装 OpenAI 库编写代…...

牛客面筋学习

准备阶段: 楼主其实很早就开始准备了,大概从年初开始,陆陆续续总结自己的项目,复盘,然后复习数电模电信号电路等,复习完后,便开始刷题;顺便说一下,如果需要发小论文的也…...

对指针的深入运用-通讯录的初步实现

1.通讯录的功能 手机里的通讯录,是能够存放联系人的信息,包括姓名,性别,地址,电话号码,也可以加上性别。而且手机中的通讯录肯定有增删查改的功能,而且在list里是按照顺序排序的,可以…...

VUE环境搭建

node.js安装 node npm – node Package Management 安装完成后,需要设置: npm config set prefix "D:\nodejs"注意:“D:\nodejs” 此处为自己安装的node.js路径。管理员身份运行 切换镜像源 npm config set registry https://r…...

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…...

C# ASP.NET的未来发展趋势

.NET学习资料 .NET学习资料 .NET学习资料 在快速发展的技术浪潮中,C# ASP.NET不断顺应时代潮流,展现出一系列令人瞩目的未来发展趋势。这些趋势不仅反映了技术的进步,也为开发者带来了更多的机遇和挑战。 云原生应用开发 随着云计算的普及…...

leetcode 416. 分割等和子集

题目如下 数据范围 本题和leetcode 2915. 和为目标值的最长子序列的长度类似&#xff0c;这里不过多赘述。leetcode 2915. 和为目标值的最长子序列的长度 通过代码 class Solution { public:bool canPartition(vector<int>& nums) {int n nums.size();int an…...

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性&#xff1a;理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据&#xff08;Metadata…...

浅聊MQ之Kafka与RabbitMQ简用

Kafka与RabbitMQ的使用举例 Kafka的使用举例 安装与启动&#xff1a; 从Apache Kafka官网下载Kafka中间件的运行脚本。解压后&#xff0c;通过命令行启动Zookeeper&#xff08;Kafka的运行依赖于Zookeeper&#xff09;。启动Kafka的服务器进程。 基本功能实现&#xff1a; 生…...

2.1 JUnit 5 测试发现机制详解

JUnit 5 测试发现机制详解 JUnit 5 的测试发现机制是框架的核心功能之一&#xff0c;负责识别测试类、方法和其他可执行元素&#xff0c;并构建出可执行的测试计划。该机制通过模块化设计支持高度扩展性&#xff0c;允许开发者自定义测试发现规则。以下是其工作原理的详细解析…...

【Elasticsearch】match查询

Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值&#xff0c;并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析&#xff0c;包括其工作原理、参数配置和使用场景。 1.match查询的…...

【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案

概述 由于最近客户需要解决redis版本升级问题&#xff0c;故而全网寻找安全版本&#xff0c;redis7.4.x版本求而为果&#xff0c;只能自己编译了。 截止发文时间2025-02-12 最新稳定版的redis版本号为7.4.2 Security fixes (CVE-2024-46981) Lua script commands may lead t…...

云计算——AWS Solutions Architect – Associate(saa)6.CloudWatch

Amazon CloudWatch 是一种面向开发运营工程师、开发人员、站点可靠性工程师(SRE)和 IT 经理的监控和可观测性服务。CloudWatch 为我们提供相关数据和切实见解&#xff0c;以监控应用程序、响应系统范围的性能变化、优化资源利用率&#xff0c;并在统一视图中查看运营状况。 Clo…...

面试实战题:手写一个队列和介绍Stream流怎么使用

手写一个队列 思路解析&#xff1a; 队列要有入队和出队操作&#xff0c;还要有查看队列大小&#xff0c;查看队头元素&#xff0c;查看队列是否为空&#xff0c;查看队列是否满了这些功能 package com.example.transational.MyQueue;public class MyQueue<T> {privat…...

Jmeter+Influxdb+Grafana平台监控性能测试过程

一、Jmeter自带插件监控 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/ 安装&#xff1a;下载后文件为jmeter-plugins-manager-1.3.jar&#xff0c;将其放入jmeter安装目录下的lib/ext目录&#xff0c;然后重启jmeter&#xff0c;即可。 启动Jmeter&…...

【现代深度学习技术】深度学习计算 | GPU

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

基于斜坡单元的机器学习模型预测滑坡易发性,考虑条件因素的异质性

&#xff11;、引用 Chang Z, Catani F, Huang F, et al. Landslide susceptibility prediction using slope unit-based machine learning models considering the heterogeneity of conditioning factors[J]. Journal of Rock Mechanics and Geotechnical Engineering, 2023…...

Node.js调用DeepSeek Api 实现本地智能聊天的简单应用

在人工智能快速发展的今天&#xff0c;如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用&#xff0c;它通过调用硅基流动&#xff08;SiliconFlow&#xff09;的API接口&#xff0c;实现了与DeepSeek模型的智能对话…...

实战 - 编写一个最简单的 Hello World 内核模块

实战 - 编写一个最简单的 Hello World 内核模块 在嵌入式开发中&#xff0c;编写 Linux 内核模块是设备驱动开发的重要基础。内核模块可以帮助我们在不修改内核源码的情况下扩展内核功能。本篇博客将指导你如何编写并运行一个简单的 Hello World 内核模块&#xff0c;让你快速…...

面向对象程序设计-实验七

6-1 计算捐款总量 这里需要设计一个捐款人类Donator及一个相关函数getMaxName( )&#xff0c;Donator类中包含捐款人的姓名及其捐款额 代码清单&#xff1a; #include <iostream> using namespace std; class Donator { private: string name; float money; //单位&…...

JVM组成

JVM是什么&#xff1f; JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a;Java程序的运行环境(java二进制字节码的运行环境) 好处&#xff1a; 1.一次编写&#xff0c;到处运行 Java代码是如何做到一次编写&#xff0c;到处运行&#xff1f; 计算机的最底层是计…...

java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException

Java8升级到17之后, 启动报错, :LocalValidatorFactoryBean]: Factory method defaultValidator threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException 报错原因:这个错误通常是由于缺少 javax.xml.bind 相关的依赖引起…...

Electron 实现自定义系统托盘菜单

效果如下&#xff1a; 其实实现自定义托盘菜单的本质上&#xff0c;就是开一个新窗口&#xff0c;下面直接给出核心代码。 // 加载窗口 const loadWindow (example, path) > {if (is.dev && process.env[ELECTRON_RENDERER_URL]) {example.loadURL(process.env[EL…...

HCIA-路由器相关知识和面试问题

二、 路由器 2.1 关于路由器的知识 2.1.1 什么是路由器 路由器是一种网络层互联设备&#xff0c;主要用于连接多个逻辑上分开的网络&#xff0c;实现不同网络之间的数据路由和通信。它能根据网络层地址&#xff08;如 IP 地址&#xff09;来转发数据包&#xff0c;在网络中起…...

2.【BUUCTF】bestphp‘s revenge

进入题目页面如下 进行代码审计 <?php // 1. 高亮显示当前PHP文件的源代码&#xff0c;方便开发者查看代码内容&#xff0c;在生产环境中不应使用此函数&#xff0c;可能会导致代码泄露。 highlight_file(__FILE__);// 2. 定义变量 $b &#xff0c;其值为字符串 implode &…...

wx060基于springboot+vue+uniapp的宿舍报修系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…...

使用 meshgrid函数绘制网格点坐标的原理与代码实现

使用 meshgrid 绘制网格点坐标的原理与代码实现 在 MATLAB 中&#xff0c;meshgrid 是一个常用函数&#xff0c;用于生成二维平面网格点的坐标矩阵。本文将详细介绍如何利用 meshgrid 函数生成的矩阵绘制网格点的坐标&#xff0c;并给出具体的代码实现和原理解析。 实现思路 …...

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...

HCIA项目实践---ACL访问控制列表相关知识和配置过程

十 ACL访问控制列表 1 策略的概念 在网络连通之后&#xff0c; 把所有为了追求控制而实现的技术都叫策略 2 访问控制 在路由器流量流入或者流出的接口上&#xff0c;匹配流量&#xff0c;执行相应的动作。&#xff08;流量流入或者流出的接口并不是一个固定的概念而是一个相对的…...