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

Go学习第十章——文件操作,Json和测试

Go文件操作,Json和测试

      • 1 文件
        • 1.1 基本介绍
        • 1.2 读取的基本操作
        • 1.3 写入的基本操作
        • 1.4 使用案例(三个)
      • 2 Go语言的Json使用
        • 2.1 序列化案例
        • 2.2 反序列化案例
      • 3 单元测试
        • 3.1 先看个需求
        • 3.2 快速入门
        • 3.3 入门总结

1 文件

1.1 基本介绍

文件在程序中是以流的形式来操作的。

image-20231026145329310

**流:**数据在数据源(文件)和程序(内存)之间经历的路径。

**输入流(读文件):**数据从数据源(文件)到程序(内存)的路径。

**输出流(写文件):**数据从程序(内存)到数据源(文件)的路径。

在Golang里,os.File封装所以文件相关操作,File是一个结构体。

// File represents an open file descriptor.
type File struct {*file // os specific
}
1.2 读取的基本操作

方法一:使用带缓存的方式读取,适用于大文件读取

读取文件需要先了解下面的几个方法函数,需要这四步才算是一个完整的读取操作。

  1. 使用 os.Open() 函数打开文件

    • 函数原型:func Open(name string) (*os.File, error)
    • 示例代码:
    file, err := os.Open("test.txt")
    if err != nil {log.Fatal(err)
    }
    

    完整代码:

    func main() {// 1.file 被叫做 file对象,file指针 ,file文件句柄file, err := os.Open("D:\\Desktop\\test.txt")if err != nil {log.Fatal(err)}// 输出文件fmt.Printf("file=%v", file)// 关闭文件err = file.Close()if err != nil {fmt.Println("close file err=", err)}
    }

    输出结果:file=&{0xc00009aa00}

  2. 使用 bufio.NewReader() 函数创建读取缓冲区

    • 函数原型:func NewReader(rd io.Reader) *bufio.Reader
    • 示例代码:
    reader := bufio.NewReader(file) // 默认缓冲区为4096
    
  3. 使用 ReadString() 函数读取文件内容

    • 函数原型:func (b *bufio.Reader) ReadString(delim byte) (string, error)
    • 示例代码:
    content, err := reader.ReadString('\n')
    if err != nil && err != io.EOF {log.Fatal(err)
    }
    
  4. 关闭文件

    • 示例代码:
    file.Close()
    

将上面的步骤合起来,就是读取文件的全过程:

func main() {// 1.file 被叫做 file对象,file指针 ,file文件句柄file, err := os.Open("D:\\Desktop\\test.txt")if err != nil {log.Fatal(err)}// 输出文件fmt.Printf("file=%v \n", file)// 关闭文件(defer 最后结束再执行)defer func(file *os.File) {err := file.Close()if err != nil {fmt.Println("close file err=", err)}}(file)// 创建读取缓冲区reader := bufio.NewReader(file)// 读取缓冲区内容,也就是文件内容content, err := reader.ReadString('\n')if err != nil && err != io.EOF {log.Fatal(err)}// 打印fmt.Printf("content=%v", content)
}

输出结果:

file=&{0xc000078a00}
content=你好,Hello Go File!!

方法二:一次性将文件读取到内存中,适用于文件不大的情况

  1. 使用 ReadFile() 函数读取文件内容,读取整个文件的操作已经封装在函数内,不用手动打开或关闭文件。。
  • 函数原型:func ReadFile(name string) ([]byte, error)
  • 示例代码:
data, err := io.ReadFile("test.txt")
if err != nil {log.Fatal(err)
}

代码示例:

func main() {// 一次性读取文件data, err := os.ReadFile("D:\\Desktop\\test.txt")if err != nil {log.Fatal(err)}fmt.Println(string(data))
}

输出结果:

你好,Hello Go File!!
  1. 使用 io.ReadAll() 时,需要先手动打开文件,并在读取完成后手动关闭。(不推荐,已经被舍弃
  • 函数原型:func ReadFile(name string) ([]byte, error)
  • 示例代码:
func main() {file, err := os.Open("D:\\Desktop\\test.txt")if err != nil {log.Fatal(err)}defer file.Close()data, err := ioutil.ReadAll(file)if err != nil {log.Fatal(err)}fmt.Println(string(data))
}

输出结果:

你好,Hello Go File!
1.3 写入的基本操作
  1. 使用 os.Create() 函数创建文件

    • 函数原型:func Create(name string) (*os.File, error)
    • 示例代码:
    file, err := os.Create("output.txt")
    if err != nil {log.Fatal(err)
    }
    
  2. 使用 file.Write() 函数将字符串写入文件

  • 函数原型:func (f *File) Write(b []byte) (n int, err error)
  • 示例代码:
_, err := file.Write([]byte("Hello, world!\n"))
if err != nil {log.Fatal(err)
}
  1. 关闭文件
  • 示例代码:
file.Close()

将上面的步骤合起来,就是创建并写入文件的全过程:

func main() {// 创建文件file, err := os.Create("D:\\Desktop\\output.txt")if err != nil {log.Fatal("创建文件错误",err)}// 将字符串写入文件_, err = file.Write([]byte("Hello, world!\n"))if err != nil {log.Fatal("文件写入错误:", err)}err = file.Close()if err != nil {fmt.Println("关闭文件错误:", err)}
}

输出结果:无。打开文件,就能发现写入成功啦~~~~

1.4 使用案例(三个)

**案例一:**将一个文件的内容,写到另一个文件,注意,两个文件都已经存在。

方案一:通过缓存的方式

func main() {// 打开原文件inputFile, err := os.Open("D:\\Desktop\\input.txt")if err != nil {log.Fatal(err)}defer inputFile.Close()// 创建目标文件outputFile, err := os.Create("D:\\Desktop\\output.txt")if err != nil {log.Fatal(err)}defer outputFile.Close()// 创建缓冲区buffer := make([]byte, 1024)// 读取原文件并写入目标文件for {// 从原文件读取数据到缓冲区n, err := inputFile.Read(buffer)if err != nil && err != io.EOF {log.Fatal(err)}if n == 0 {break}// 将数据从缓冲区写入目标文件_, err = outputFile.Write(buffer[:n])if err != nil {log.Fatal(err)}}log.Println("文件内容写入成功!")
}

方法二:使用io.Copy()复制io流

func main() {// 打开原文件inputFile, err := os.Open("D:\\Desktop\\input.txt")if err != nil {log.Fatal(err)}defer inputFile.Close()// 创建目标文件outputFile, err := os.Create("D:\\Desktop\\output.txt")if err != nil {log.Fatal(err)}defer outputFile.Close()// 将原文件内容写入目标文件_, err = io.Copy(outputFile, inputFile)if err != nil {log.Fatal(err)}log.Println("文件内容写入成功!")
}

输出结果:2023/10/26 16:29:29 文件内容写入成功!

**案例二:**将一个图片拷贝到另一个文件夹下

func main() {srcPath := "D:\\Desktop\\img.jpg"destPath := "D:\\Desktop\\img\\image.jpg"err := copyFile(srcPath, destPath)if err != nil {fmt.Println("Failed to copy file:", err)return}fmt.Println("File copied successfully!")
}func copyFile(srcPath, destPath string) error {srcFile, err := os.Open(srcPath)if err != nil {return err}defer srcFile.Close()destFile, err := os.Create(destPath)if err != nil {return err}defer destFile.Close()_, err = io.Copy(destFile, srcFile)if err != nil {return err}return nil
}

输出结果:File copied successfully!

上述代码中,srcPath和destPath分别表示源图片文件的路径和目标文件夹的路径。

在copyFile函数中,首先使用os.Open打开源图片文件,并使用os.Create创建目标文件。然后使用io.Copy将源图片文件的内容拷贝到目标文件中。最后返回nil表示拷贝成功,或者返回拷贝过程中遇到的错误。

**案例三:**统计一个文件内容里的英文、数字、空格和其他字符数量

func main() {filePath := "D:\\Desktop\\input.txt" // 文件路径data, err := os.ReadFile(filePath)if err != nil {fmt.Printf("读取文件失败:%s\n", err)return}charsCount := make(map[string]int)for _, ch := range string(data) {switch {case unicode.IsLetter(ch):charsCount["英文"]++case unicode.IsDigit(ch):charsCount["数字"]++case unicode.IsSpace(ch):charsCount["空格"]++default:charsCount["其他字符"]++}}fmt.Printf("英文字符数量:%d\n", charsCount["英文"])fmt.Printf("数字字符数量:%d\n", charsCount["数字"])fmt.Printf("空格数量:%d\n", charsCount["空格"])fmt.Printf("其他字符数量:%d\n", charsCount["其他字符"])
}

输出结果:

英文字符数量:652
数字字符数量:67
空格数量:133
其他字符数量:107

2 Go语言的Json使用

JSON易于机器解析和生成,并有效地提升网络传输效率通常程序在网络传输时会先将数据(结构体、map等)序列化成son字符串到接收方得到ison字符串时,在反序列化恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准。

image-20231026165248054

2.1 序列化案例
type Person struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {people := []map[string]interface{}{{"name": "Alice","age":  25,},{"name": "Bob","age":  30,},}data, err := json.Marshal(people)if err != nil {fmt.Printf("序列化失败: %s", err)return}err = ioutil.WriteFile("people.json", data, 0644)if err != nil {fmt.Printf("写入文件失败: %s", err)return}fmt.Println("JSON数据已写入文件")
}

在代码中,我们定义了一个Person结构体,表示每个人的姓名和年龄,这里主要添加tag,不然序列化后的是大写,不符合公共规范。然后,我们创建了一个包含多个map的切片people,每个map对应一个人的信息。

使用json.Marshal()函数将切片people序列化为JSON数据。json.Marshal()函数会返回一个[]byte类型的字节切片,表示JSON数据。

然后,我们使用ioutil.WriteFile()函数将JSON数据写入一个名为people.json的文件。

最后,我们输出一个提醒信息,表示JSON数据已成功写入文件。

运行以上代码,会在当前目录下生成一个名为people.json的文件,其中包含以下JSON数据:

[{"name":"Alice","age":25},{"name":"Bob","age":30}
]

这个JSON数组包含了两个map,每个map对应一个人的姓名和年龄。

2.2 反序列化案例

将上面的代码反过来,json格式转换成对应的数据

type Person struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {filePath := "D:\\Desktop\\people.json" // JSON文件路径// 读取JSON文件内容data, err := os.ReadFile(filePath)if err != nil {fmt.Printf("读取文件失败:%s\n", err)return}var people []Person// 反序列化JSON数据err = json.Unmarshal(data, &people)if err != nil {fmt.Printf("反序列化失败: %s\n", err)return}fmt.Printf("解析到%d个人的信息:\n", len(people))for _, p := range people {fmt.Printf("姓名:%s\t年龄:%d\n", p.Name, p.Age)}// 将JSON数据反序列化为map类型var peopleMap []map[string]interface{}err = json.Unmarshal(data, &peopleMap)if err != nil {fmt.Printf("反序列化为map失败: %s\n", err)return}fmt.Printf("解析到%d个人的信息:\n", len(peopleMap))for _, p := range peopleMap {fmt.Printf("姓名:%s\t年龄:%v\n", p["name"], p["age"])}
}

输出结果:

解析到2个人的信息:
姓名:Alice     年龄:25
姓名:Bob       年龄:30
解析到2个人的信息:
姓名:Alice     年龄:25
姓名:Bob       年龄:30

3 单元测试

3.1 先看个需求

在我们工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确,如下:

func addUpper(n int) int {res := 0for i := 1; i <= n; i++ {res += i}return res
}

在 main 函数中,调用 addUpper 函数,看看实际输出的结果是否和预期的结果一致,如果一致,则说明函数正确,否则函数有错误,然后修改错误.

传统方式的缺点

  1. 不方便,我们需要在 main 函数中去调用,这样就需要去修改 main 函数,如果现在项目正在运行,就可能去停止项目。
  2. 不利于管理,因为当我们测试多个函数或者多个模块时,都需要写在 main 函数,不利于我们管理和清晰我们思路
  1. 引出单元测试。-> testing 测试框架 可以很好解决问题。
3.2 快速入门

Go 语言中自带有一个轻量级的测试框架 testing 和自带的 go test 命今来实现单元测试和性能测试,testing 框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例,也可以基
于该框架写相应的压力测试用例。通过单元测试,可以解决如下问题:

  1. 确保每个函数是可运行,并且运行结果是正确
  2. 确保写出来的代码性能是好的,
  3. 单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,

image-20231026171938573

1. 创建一个cal.go文件,把需要测试的代码放在里面

package test01func AddUpper(n int) int {res := 0for i := 1; i <= n; i++ {res += i}return res
}

2. 创建cal_test.go文件,在里面写测试案例

import ("testing"
)func TestAddUpper(t *testing.T) {res := AddUpper(10)if res != 55 {// fmt.Printf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)t.Fatalf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)}// 如果正确,输出日志t.Logf("AddUpper(10) 执行正确。。。")
}

执行后的结果如图所示,我使用的GoLand,就比较方便:

image-20231026173326882

3.3 入门总结
  1. 测试用例文件名必须以 test.go 结尾。 比如 cal test.go ,cal 不是固定的。

  2. 测试用例函数必须以 Test 开头,一般来说就是 Test+被测试的函数名,比如 TestAddUpper

  3. TestAddUpper(t *tesing.T) 的形参类型必须是 *testing.T

  4. 一个测试用例文件中,可以有多个测试用例函数,比如 TestAddUpper、TestSub

  5. 运行测试用例指令
    (1) cmd>go test [ 如果运行正确,无日志,错误时,会输出日志 ]

(2) cmd>go test-v [ 运行正确或是错误,都输出日志 ]

  1. 当出现错误时,可以使用 t.Fatalf 来格式化输出错误信息,并退出程序

  2. t.Logf 方法可以输出相应的日志

  3. 测试用例函数,并没有放在 main 函数中,也执行了,这就是测试用例的方便之处

  4. PASS 表示测试用例运行成功,FAIL 表示测试用例运行失败

  5. 测试单个文件,一定要带上被测试的原文件
    go test -v cal test.go cal.go

  6. 测试单个方法
    go test -v -test.runTestAddUpper

相关文章:

Go学习第十章——文件操作,Json和测试

Go文件操作&#xff0c;Json和测试 1 文件1.1 基本介绍1.2 读取的基本操作1.3 写入的基本操作1.4 使用案例(三个) 2 Go语言的Json使用2.1 序列化案例2.2 反序列化案例 3 单元测试3.1 先看个需求3.2 快速入门3.3 入门总结 1 文件 1.1 基本介绍 文件在程序中是以流的形式来操作…...

学习不同概率分布(二项分布、泊松分布等)概念及基础语法

概率分布是描述随机变量取值的概率情况的函数。常见的概率分布包括二项分布、泊松分布等。 二项分布&#xff08;Binomial Distribution&#xff09;&#xff1a;描述了一次试验中成功事件发生的次数的概率分布。它的基础语法如下&#xff1a; 概率质量函数&#xff1a;pmf(k, …...

在3台不联网的 CentOS 7.8 服务器上部署 Elasticsearch 6.8 集群

为了在3台不联网的 CentOS 7.8 服务器上部署 Elasticsearch 6.8.23 集群&#xff0c;并考虑到path.data和path.logs的配置&#xff0c;我们可以按照以下步骤进行操作&#xff1a; 1. 准备工作 1.1 从有网络的机器下载 Elasticsearch 6.8.23 的 RPM 包&#xff1a; https://w…...

CentOS 7

导入已有虚拟机 设置SSH免密登录 参考Ubuntu- 远程连接虚拟机&#xff08;桥连接&#xff09; 宿主机&#xff1a;Win10虚拟机&#xff1a;VMware保证宿主机和主机在同一个网段下&#xff08;宿主机和主机通过手机热点连接&#xff0c;在特定网段内&#xff0c;不能更改&#…...

个人记账理财软件 Money Pro mac中文版软件介绍

Money Pro for mac是一款综合性高的理财工具&#xff0c;Money Pro是一套能够协同工作的工具&#xff0c;可用来追踪账户、管理账单以及制作预算&#xff0c;您可以为每个时间段设置不同的预算限值。财务一切尽在掌控之中。 Money Pro for mac软件介绍 Money Pro for mac提供一…...

DSP 开发教程(0): 汇总

目录 DSP 开发教程(0): 汇总开发环境搭建DSP 开发例程 DSP 开发教程(0): 汇总 开发环境搭建 开发环境的搭建参考: Tronlong创龙 的博客. 安装 CCS v5.5 安装 BIOS_MCSDK DSP 开发例程 名称说明led_flash此例程实现在 EVM6678L 开发板控制 LED 闪烁. 使用了 SYS/BIOS 和 MC…...

YouTrack 中如何设置邮件通知

在 YouTrack 中&#xff0c;默认是不会邮件通知的。 你可以为你的账号设置邮件通知。 设置的方法为单击用户属性&#xff0c;然后在弹出的小窗口中选择属性选项。 设置邮件通知 在通知 Tab 页面中&#xff0c;选择发送邮件的方式&#xff0c;默认这个选项是不选择的。 用户…...

Prevalence and prevention of large language model use in crowd work

本文是LLM系列文章&#xff0c;针对《Prevalence and prevention of large language model use in crowd work》的翻译。 众包工作中使用大型语言模型的流行率和预防 摘要1 研究1&#xff1a;LLM使用的普遍率2 研究2&#xff1a;LLM使用的预防3 讨论4 材料与方法 摘要 我们表…...

微信小程序学习(02)

页面导航 - 声明式导航 1. 导航到 tabBar 页面 tabBar 页面指的是被配置为 tabBar 的页面。 在使用<navigator> 组件跳转到指定的 tabBar 页面时&#xff0c;需要指定 url 属性和 open-type 属性&#xff0c;其中&#xff1a; ⚫ url 表示要跳转的页面的地址&#xff0…...

Transit path

一、什么是Transit path "Transit" 路径通常指的是网络上的一种数据传输路线或路径&#xff0c;该路线用于在计算机网络中传递数据包。这个术语通常在网络和通信领域中使用&#xff0c;用于描述数据从一个地方传输到另一个地方的路线或路径。 在计算机网络中&#…...

backend-learning: personal blog(1)

问题记录&#xff1a; 跨度太大&#xff0c;无法完成&#xff0c;遂决定从基础学起。 规划路线&#xff1a; 1.完成JAVA与c语言差异部分&#xff0c;&#xff08;注解&#xff0c;其实没多少&#xff09; 2.上springboot官网查看开发手册&#xff0c;了解大致原理。 3. 开始挑…...

centos7系统下,实现1台服务器免密登录多台服务器功能

SSH案例&#xff1a;实现kafka01服务器能够免密登录kafka02和kafka03服务器的需求&#xff08;不然后面一键启动的脚本将无法使用&#xff09;⭐ 1&#xff1a;检查每台服务器是否都安装了SSH&#xff1a; [rootkafka01 ~]# rpm -qa |grep ssh openssh-clients-7.4p1-21.el7.…...

【力扣SQL】几个常见SQL题

【力扣SQL】184. 部门工资最高的员工 Employee&#xff1a;id&#xff08;主键&#xff09;、name、salary、departmentId&#xff08;外键&#xff09; Department&#xff1a;id&#xff08;主键&#xff09;、name 出每个部门中薪资最高的员工&#xff1a;Department.name、…...

[Python] ModuleNotFoundError: No module named ‘_ctypes‘

Python 找不到模块 此前遇到了 python 中的 _ctypes 模块丢失的问题&#xff0c;经排查发现是 Pyenv 安装的 python 确实缺少了此模块&#xff0c;后来使用 conda 安装 Python 发现 _ctypes.cpython-37m-x86_64-linux-gnu.so 此包存在。 排查方法是先全局查找相关模块&#xff…...

牛客网刷题-(5)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

springcloud gateway转发后getServerName被更改的问题

该问题起源于一次将代码移植到微服务产生。当使用springcloud gateway更换掉nginx网关后&#xff0c;出现无法登录的情况&#xff0c;跟进发现转发的信息里丢失了Host MimeHeaders accept */* knife4j-gateway-code ROOT content-type application/x-www-form-urlencoded …...

Linux - firewall-cmd 命令添加端口规则不生效排查

文章目录 linux 防火墙 firewall-cmd 命令详解问题排查 linux 防火墙 firewall-cmd 命令详解 基本语法 firewall-cmd --zonezone-name --add-serviceservice-name --permanent命令参数 --zone&#xff1a;指定要添加服务的区域名称。 --add-service&#xff1a;指定要添加的…...

iPhone手机屏幕分辨率

ios app测试时&#xff0c;需要测试应用在不同型号的苹果手机上的表现形式&#xff0c;可以自己在浏览器上配置。 代数设备逻辑像素尺寸缩放发布时间第一代iPhone 2G320 x 480480 x 3203.5寸1x2007年6月29日第二代iPhone 3320 x 480480 x 3203.5寸1x2008年7月11日第三代iPhone …...

文件包含漏洞(3),日志利用, 图片木马利用

日志利用, 图片木马利用 一, 利用服务器日志 通过普通的网络请求向日志文件注入代码, 再利用文件包含漏洞执行日志中的代码段. apache log: /opt/lampp/logs/access_log nginx log: /usr/local/nginx/logs/access.log 首先可以利用文件包含漏洞测试日志文件的内容是否可以显…...

java面试--线程总结

Java中有几种方式来创建线程执行任务&#xff0c;分别是什么&#xff1f; 1、继承Thread类 public class MyThread extends Thread{public static void main(String[] args) {MyThread myThread new MyThread();myThread.start();}Overridepublic void run() {System.out.pr…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...