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

深入浅出Go的`encoding/xml`库:实战开发指南

深入浅出Go的`encoding/xml`库:实战开发指南

    • 引言
    • 基本概念
      • XML简介
      • Go语言中的XML处理
      • 结构体标签(Struct Tags)
    • 解析XML数据
      • 使用`xml.Unmarshal`解析XML
      • 结构体标签详解
      • 处理常见解析问题
    • 生成XML数据
      • 使用`xml.Marshal`生成XML
      • 使用`xml.MarshalIndent`优化XML输出
      • 自定义标签改变输出结果
      • 优化XML输出的技巧
    • 处理XML流
      • 使用`xml.Decoder`处理大型XML文件
      • 使用`xml.Encoder`生成XML数据流
      • 实战:流式处理XML数据的应用案例
    • 高级特性
      • 使用命名空间处理复杂XML
      • 处理XML属性的高级技巧
      • 使用`xml:",any"`处理未知XML标签
      • XML解析性能优化技巧
    • 实战案例分析
      • 案例1:配置文件的解析与生成
        • 解析XML配置文件
        • 生成XML配置文件
      • 案例2:与Web服务交互的XML数据处理
        • 发送XML请求
        • 解析XML响应
      • 案例3:处理复杂XML文档的策略
    • 总结

在这里插入图片描述

引言

在数字化时代,XML(可扩展标记语言)作为一种灵活的标记语言,在数据交换、配置文件、网络服务之间的通信等多个领域发挥着至关重要的作用。其自描述性的特点和强大的数据描述能力使得XML成为了不可或缺的数据格式之一。然而,处理XML数据并非总是一帆风顺,特别是在需要高效率和精准解析时。这就是为什么encoding/xml库在Go语言中显得尤为重要。

Go语言(又称Golang)以其简洁、高效、强大的并发支持而著称,在处理XML数据时也不例外。encoding/xml库提供了一套丰富的工具,使得在Go程序中解析和生成XML数据变得既简单又高效。无论是开发网络应用、读取配置文件,还是实现复杂的数据交换,encoding/xml库都能够提供强大的支持。

本文将深入探讨encoding/xml库的使用,从基本的XML处理到高级技巧,再到实战案例分析,旨在为中级至高级的Go开发者提供一份全面的指南。我们将通过实际的代码示例来展示如何有效地利用encoding/xml库来解析和生成XML数据,处理流数据,以及优化性能。无论您是刚开始接触XML处理,还是寻求提高已有技能,本文都将为您提供宝贵的参考和指导。

让我们一起开始这段既充满挑战又充满机遇的旅程,深入了解encoding/xml库,掌握处理XML数据的艺术。通过本文,您将能够更加自信地在Go语言项目中处理各种复杂的XML数据问题,提升您的开发效率和程序的性能。

基本概念

在深入探讨encoding/xml库的具体应用之前,了解一些XML和Go语言中处理XML数据的基本概念是非常必要的。这不仅能帮助我们更好地理解后续的内容,也能在实际开发中避免一些常见的误区。

XML简介

XML(可扩展标记语言)是一种用于标记电子文件使其具有结构性的标记语言。它允许设计者自定义标签,使得信息组织和呈现更为清晰。XML广泛用于互联网、软件配置以及复杂数据结构的描述中,其特点包括自我描述性、可扩展性和跨平台性。

Go语言中的XML处理

在Go语言中,encoding/xml包提供了对XML数据的编码和解码功能。通过这个包,我们可以轻松地将XML数据解析到Go的结构体中,或者将Go的数据结构转换为XML格式。encoding/xml包中最核心的两个功能是XML的解码(解析)和编码(生成)。

  • 解码(Unmarshalling):将XML数据解析到Go语言的结构体中。这个过程涉及到将XML元素和属性映射到结构体的字段上。
  • 编码(Marshalling):将Go语言的数据结构转换成XML格式的字符串。这个过程涉及到将结构体的字段映射到XML元素和属性上。

结构体标签(Struct Tags)

在使用encoding/xml包进行XML数据的编解码时,结构体标签起到了至关重要的作用。通过在结构体字段上使用标签(tags),我们可以定义该字段与XML元素或属性之间的映射关系。例如:

type Person struct {Name string `xml:"name"`Age  int    `xml:"age"`
}

在上述例子中,Name字段被映射到XML中的<name>元素上,Age字段被映射到<age>元素上。标签中还可以包含更多的选项,用于控制编解码行为,比如元素的命名空间、属性的处理等。

解析XML数据

解析XML数据是encoding/xml库的一个核心功能,它允许我们将XML格式的数据转换成Go语言的数据结构,以便在程序中使用。这一过程主要依赖于xml.Unmarshal函数。在本节中,我们将详细介绍如何使用xml.Unmarshal进行数据解析,以及如何通过结构体标签来控制解析行为。

使用xml.Unmarshal解析XML

xml.Unmarshal函数可以将XML格式的字节切片解析到Go的结构体中。其基本使用方式如下:

data := []byte(`<Person><Name>John Doe</Name><Age>30</Age></Person>`)
var person Person
err := xml.Unmarshal(data, &person)
if err != nil {log.Fatal(err)
}
fmt.Println(person)

在这个例子中,我们定义了一个Person结构体,并使用xml.Unmarshal函数将XML数据解析到这个结构体实例中。这要求结构体的字段名与XML元素匹配,或通过结构体标签指定映射关系。

结构体标签详解

结构体标签在解析XML数据时起到了关键作用,它们定义了结构体字段和XML数据之间的映射关系。以下是一些常用的标签选项:

  • xml:"name":将结构体字段映射到XML元素或属性名为name的元素上。
  • xml:",attr":指定结构体字段对应XML元素的一个属性,而不是子元素。
  • xml:",chardata":用于处理文本数据,将字段映射到XML元素内部的文本上。
  • xml:",innerxml":将字段映射到XML元素的原始内部XML上,包括标签和文本。
  • xml:",omitempty":在编码时,如果字段为空,则省略此字段。

处理常见解析问题

在解析XML时,我们可能会遇到各种问题,如未知的元素、可选的元素缺失等。以下是一些处理常见问题的策略:

  • 未知元素:可以使用xml:",any"标签来捕获未知的XML元素。这对于灵活处理不完全符合预期结构的XML数据非常有用。
  • 可选元素:通过将结构体字段定义为指针类型,我们可以区分缺失的元素和值为零的元素。

通过上述方法,我们可以灵活地处理XML数据的解析,确保即使在面对复杂或不规范的XML结构时,也能够准确无误地将数据载入到Go的数据结构中。

生成XML数据

在掌握了如何解析XML数据后,另一个重要的能力是生成XML数据。encoding/xml库提供了xml.Marshalxml.MarshalIndent函数,使得将Go语言的数据结构转换成XML格式的数据变得简单高效。本节将详细介绍这两个函数的使用方法,以及如何通过结构体标签来控制生成的XML数据的格式。

使用xml.Marshal生成XML

xml.Marshal函数能够将Go语言的数据结构转换为XML字节切片。如果转换成功,它将返回XML数据的字节切片和一个nil错误。其基本使用示例如下:

type Person struct {Name string `xml:"name"`Age  int    `xml:"age"`
}person := Person{Name: "John Doe", Age: 30}
xmlData, err := xml.Marshal(person)
if err != nil {log.Fatal(err)
}
fmt.Println(string(xmlData))

这段代码将输出Person结构体实例的XML表示。默认情况下,xml.Marshal输出的XML不包括XML声明,并且元素之间没有缩进。

使用xml.MarshalIndent优化XML输出

为了生成更加可读的XML数据,xml.MarshalIndent提供了额外的功能,允许我们指定元素之间的缩进。这对于生成配置文件或需要人工审核的XML数据非常有用。示例如下:

xmlData, err := xml.MarshalIndent(person, "", "  ")
if err != nil {log.Fatal(err)
}
fmt.Println(string(xmlData))

这将生成具有两个空格缩进的XML数据,使得输出的XML结构更加清晰。

自定义标签改变输出结果

通过在结构体定义中使用XML标签,我们可以进一步控制生成的XML数据的格式。以下是一些高级的标签用法:

  • xml:",cdata":将字符串字段的内容作为CDATA部分输出。
  • xml:",attr":指定字段作为XML元素的属性而非子元素输出。
  • xml:"name,attr":将字段作为具有指定名称的属性输出。

优化XML输出的技巧

生成XML数据时,有几个技巧可以帮助我们优化输出结果:

  • 使用指针来表示可选字段:这允许我们在字段为空时不生成对应的XML元素。
  • 利用xml:",omitempty"标签:对于零值或空的字段,这可以防止其被包含在输出的XML中。
  • 为复杂结构设计合理的Go数据结构:合理的数据结构设计可以简化XML生成过程,减少转换过程中的错误。

通过这些方法,我们可以灵活地生成满足具体需求的XML数据,无论是为了数据交换、配置管理还是其他目的。

处理XML流

在处理大型XML文件或实时XML数据流时,使用流式处理可以显著提高内存和时间效率。encoding/xml库提供了xml.Decoderxml.Encoder两个类型来支持流式处理XML数据。本节将探讨如何使用这些工具来高效地处理XML流。

使用xml.Decoder处理大型XML文件

xml.Decoder类型提供了一种逐步读取和解析XML文档的方法。相比于xml.Unmarshal一次性读取整个文档,xml.Decoder可以在文档被完全加载入内存之前开始处理数据,这对于处理大型文件非常有利。以下是使用xml.Decoder的一个基本示例:

file, err := os.Open("example.xml")
if err != nil {log.Fatal(err)
}
defer file.Close()decoder := xml.NewDecoder(file)
for {// 创建一个用于存储解析数据的变量var element MyElement// 尝试解析下一个XML元素err := decoder.Decode(&element)if err == io.EOF {break // 文件结束} else if err != nil {log.Fatal(err) // 处理可能的解析错误}// 处理解析得到的数据fmt.Println(element)
}

在这个示例中,xml.Decoder逐个读取并解析XML文档中的元素,直到遇到文件结束标志io.EOF。这种方式非常适合于逐行处理大文件或实时处理XML数据流。

使用xml.Encoder生成XML数据流

xml.Decoder相对应,xml.Encoder允许我们逐步生成XML文档。这在需要动态生成大型XML文档或实时发送XML数据时特别有用。以下是使用xml.Encoder的一个示例:

file, err := os.Create("output.xml")
if err != nil {log.Fatal(err)
}
defer file.Close()encoder := xml.NewEncoder(file)
encoder.Indent("", "  ") // 设置缩进,提高可读性for _, element := range elements {if err := encoder.Encode(element); err != nil {log.Fatal(err)}
}// 确保所有数据都正确写入文件
if err := encoder.Flush(); err != nil {log.Fatal(err)
}

通过xml.Encoder,我们可以一步步构建XML文档,并通过调用Flush方法确保所有数据都被正确写入目标文件或数据流。

实战:流式处理XML数据的应用案例

流式处理XML数据在实际开发中非常有用,特别是在以下场景:

  • 处理网络数据流:在网络编程中,可以使用xml.Decoder直接从网络连接中读取并解析XML数据,或使用xml.Encoder向网络连接发送XML数据。
  • 读写大型XML文件:对于大型XML文件,流式处理可以减少内存占用,提高处理速度。
  • 实时数据处理:在需要实时处理XML格式的日志或消息时,流式处理提供了一种高效的解决方案。

通过结合xml.Decoderxml.Encoder,我们可以在Go程序中灵活高效地处理各种XML数据流场景。

高级特性

掌握encoding/xml库的基础用法之后,我们可以进一步探索一些高级特性,以更加灵活和高效地处理XML数据。这些高级特性包括命名空间的处理、属性的高级技巧,以及如何处理未知的XML标签。这些功能在处理复杂的XML文档时尤为重要。

使用命名空间处理复杂XML

XML命名空间是处理复杂XML文档中常见的一个概念,它可以避免元素名冲突,并明确元素的定义域。在Go的encoding/xml库中,可以通过在结构体标签中指定命名空间来处理带有命名空间的XML元素:

type Book struct {Title string `xml:"urn:isbn:1-931666-22-9 title"`
}data := []byte(`<Book xmlns="urn:isbn:1-931666-22-9"><title>XML Mastery</title></Book>`)
var book Book
err := xml.Unmarshal(data, &book)
if err != nil {log.Fatal(err)
}
fmt.Println(book.Title) // 输出: XML Mastery

在这个例子中,我们通过在结构体标签中指定命名空间和元素名来正确解析带有命名空间的<title>元素。

处理XML属性的高级技巧

XML属性在许多XML文档中用于提供元素的额外信息。在Go中,可以通过在结构体标签中使用,attr来指定一个字段应该与XML元素的属性相对应:

type Image struct {Width  int    `xml:"width,attr"`Height int    `xml:"height,attr"`Source string `xml:"src,attr"`
}data := []byte(`<Image width="600" height="400" src="example.jpg"/>`)
var img Image
err := xml.Unmarshal(data, &img)
if err != nil {log.Fatal(err)
}
fmt.Printf("Image: %dx%d, Source: %s\n", img.Width, img.Height, img.Source)

通过这种方式,我们可以灵活地处理XML元素的属性,使得数据结构与XML文档之间的映射更加清晰和直观。

使用xml:",any"处理未知XML标签

在某些情况下,我们可能需要处理一些未知的或动态变化的XML标签。encoding/xml库提供了xml:",any"标签,允许我们捕获并处理未知的XML元素:

type CustomElement struct {XMLName xml.NameContent string `xml:",chardata"`
}type Document struct {Elements []CustomElement `xml:",any"`
}data := []byte(`<Document><Custom>Content</Custom></Document>`)
var doc Document
err := xml.Unmarshal(data, &doc)
if err != nil {log.Fatal(err)
}
for _, element := range doc.Elements {fmt.Printf("Element: %s, Content: %s\n", element.XMLName.Local, element.Content)
}

这种方式为处理动态或不规范的XML文档提供了极大的灵活性,使我们能够在不完全了解文档结构的情况下,也能够读取和处理XML数据。

XML解析性能优化技巧

处理大型或复杂的XML文档时,性能成为一个重要考虑因素。以下是一些优化XML解析性能的技巧:

  • 使用流式处理:对于大型XML文件,使用xml.Decoder进行流式处理可以显著减少内存消耗。
  • 避免频繁的内存分配:在可能的情况下,复用已有的变量和数据结构,减少内存分配的次数。
  • 并行处理:如果XML文档的不同部分之间相互独立,可以考虑将文档拆分并使用并行处理来加快处理速度。

通过掌握和应用这些高级特性和优化技巧,您可以更加高效地处理各种复杂的XML数据,满足不同的业务需求。

实战案例分析

在理解了encoding/xml库的基础和高级用法之后,让我们通过几个实战案例来深入探讨如何在实际开发中应用这些知识。这些案例将涵盖从配置文件的解析与生成,到与Web服务交互的XML数据处理,再到处理复杂XML文档的策略。

案例1:配置文件的解析与生成

在许多应用程序中,使用XML格式的配置文件是一种常见的做法。这些配置文件通常包含了程序运行所需的参数或设置。

解析XML配置文件

假设我们有一个XML格式的配置文件,如下所示:

<Config><Database><Host>localhost</Host><Port>3306</Port><Username>user</Username><Password>pass</Password></Database>
</Config>

我们可以定义以下Go结构体来映射这个配置文件的结构:

type Config struct {Database struct {Host     string `xml:"Host"`Port     int    `xml:"Port"`Username string `xml:"Username"`Password string `xml:"Password"`} `xml:"Database"`
}

使用xml.Unmarshal函数,我们可以轻松地将配置文件解析到这个结构体中:

var cfg Config
if err := xml.Unmarshal(data, &cfg); err != nil {log.Fatalf("XML Unmarshal error: %v", err)
}
fmt.Println(cfg)
生成XML配置文件

相反地,如果我们需要生成这样的配置文件,可以使用xml.MarshalIndent函数来创建一个格式化的XML文档:

cfg := Config{Database: struct {Host     string `xml:"Host"`Port     int    `xml:"Port"`Username string `xml:"Username"`Password string `xml:"Password"`}{Host:     "localhost",Port:     3306,Username: "user",Password: "pass",},
}xmlData, err := xml.MarshalIndent(cfg, "", "    ")
if err != nil {log.Fatalf("XML Marshal error: %v", err)
}
fmt.Println(string(xmlData))

案例2:与Web服务交互的XML数据处理

XML经常被用于Web服务中数据的交换。例如,SOAP(一种基于XML的Web服务协议)就广泛使用XML来封装请求和响应。

发送XML请求

当与一个接收XML请求的Web服务交互时,我们可以构造一个对应的XML请求体,并使用http.Client发送请求:

type RequestBody struct {// 定义请求体结构
}body := &RequestBody{// 初始化请求体
}xmlData, _ := xml.Marshal(body)
req, _ := http.NewRequest("POST", "https://example.com/api", bytes.NewBuffer(xmlData))
req.Header.Set("Content-Type", "application/xml")client := &http.Client{}
resp, err := client.Do(req)
if err != nil {log.Fatal(err)
}
defer resp.Body.Close()// 处理响应
解析XML响应

收到XML格式的响应后,我们可以使用xml.Decoder来逐个解析响应中的元素,特别是当响应体较大或需要流式处理时:

decoder := xml.NewDecoder(resp.Body)
for {var element ResponseElementif err := decoder.Decode(&element); err == io.EOF {break} else if err != nil {log.Fatal(err)}// 处理解析得到的元素
}

案例3:处理复杂XML文档的策略

在面对结构复杂、含有多层嵌套元素的XML文档时,合理的策略是将文档分解为更小、更易管理的部分。利用xml:",any"标签可以帮助我们处理不确定的或可变的XML结构,同时使用命名空间可以确保元素名称的唯一性和准确性。

type ComplexDoc struct {Parts []interface{} `xml:",any"`// 使用interface{}来处理不同类型的元素
}// 使用特定的结构体来定义可能的元素类型

在解析过程中,可以根据元素的XMLName来确定其类型,并将其转换为相应的具体类型,以便进行进一步处理。

由于已经覆盖了encoding/xml库在Go语言中处理XML数据的各个方面,从基本的解析和生成到流式处理、高级特性的应用,以及通过实战案例深入探讨了其实用性和灵活性,现在是时候总结我们的讨论,并提出一些前进的方向。

总结

在本文中,我们详细探讨了Go语言标准库中的encoding/xml包,展示了它在解析和生成XML数据方面的强大能力。我们从基本概念出发,逐步深入到流式处理、高级特性,以及实战案例的分析,旨在为中级到高级的开发者提供一个全面的指南,帮助他们在实际开发中有效地使用XML。

通过本文,我们了解到:

  • xml.Unmarshalxml.Marshal函数是处理XML数据的基石,它们分别用于将XML数据解析到Go的结构体中和将结构体生成XML数据。
  • 结构体标签在映射XML数据结构时扮演着关键角色,通过它们,我们可以定义复杂的映射关系,包括处理属性、文本内容、以及未知的XML标签。
  • xml.Decoderxml.Encoder支持流式处理XML数据,这对于处理大型文件或实时数据流非常有用。
  • 通过使用命名空间和处理XML属性的高级技巧,我们可以更加灵活地处理复杂的XML文档。
  • 实战案例分析展示了encoding/xml库在不同场景下的应用,从配置文件的处理到与Web服务的交互,再到复杂文档的解析,这些案例证明了Go在XML数据处理方面的高效和灵活。

尽管encoding/xml库提供了丰富的功能来处理XML数据,但在实际开发中,我们还可能面临更多复杂的情况和挑战。因此,不断探索和学习是提高我们处理XML数据能力的关键。以下是一些建议的前进方向:

  • 深入理解XML标准:了解XML的更多细节和标准,如XML Schema、XPath和XSLT,可以帮助我们更有效地处理XML数据。
  • 探索第三方库:除了标准库之外,Go社区也提供了一些第三方库来处理XML数据,这些库可能在特定场景下提供了更优的解决方案。
  • 性能优化:在处理大规模XML数据时,性能成为一个重要考虑因素。深入研究和应用性能优化技巧,如并发处理和内存管理,可以提高程序的效率。
  • 安全性考虑:处理来自不可信来源的XML数据时,需要注意安全性问题,如XML注入攻击和实体展开攻击。了解和采取相应的防护措施是必要的。

通过不断学习和实践,您将能够更加熟练地利用Go语言处理各种XML数据,解决实际开发中遇到的问题。

相关文章:

深入浅出Go的`encoding/xml`库:实战开发指南

深入浅出Go的encoding/xml库&#xff1a;实战开发指南 引言基本概念XML简介Go语言中的XML处理结构体标签&#xff08;Struct Tags&#xff09; 解析XML数据使用xml.Unmarshal解析XML结构体标签详解处理常见解析问题 生成XML数据使用xml.Marshal生成XML使用xml.MarshalIndent优化…...

深度学习之扩散模型(Diffusion model)

代码解析&#xff1a;正向扩散过程和加噪演示 引言 这段代码实现了一个正向扩散过程和加噪演示的功能。通过生成一个特定形状的数据集&#xff0c;并在每个时间步长上应用正向扩散过程和加噪过程&#xff0c;最终展示了数据点在空间中的演变过程。 数据集生成 通过 make_swiss…...

Tomcat Session ID---会话保持

简单拓补图 一、负载均衡、反向代理 7-1nginx代理服务器配置 [rootdlnginx ~]#yum install epel-release.noarch -y ###安装额外源[rootdlnginx ~]#yum install nginx -y[rootdlnginx ~]#systemctl start nginx.service[rootdlnginx ~]#systemctl status nginx.service [ro…...

Session会话绑定

1.需求原因 用户的请求,登录的请求,经过负载均衡后落到后面的web服务器上,登录的状态/信息也会记录在web服务器上,就会导致不通的web服务器上,登录状态不统一,造成用户频繁需要登录 2.目标&#xff1a;如何实现会话保持/会话共享 方案一&#xff1a;登录状态写入cookie中.(wor…...

win7、win10、win11 系统能安装的.net framework 版本以

win7、win10、win11 系统能安装的.net framework 版本分别是多少&#xff1f;以及能安装的最高版本是多少&#xff1f; 以下是各Windows系统能够安装和支持的.NET Framework版本及其最高可安装版本的概述&#xff1a; Windows 7&#xff1a; 自带 .NET Framework 3.5.1&#x…...

RediSearch比Es搜索还快的搜索引擎

1、介绍 RediSearch是一个Redis模块&#xff0c;为Redis提供查询、二次索引和全文搜索。要使用RediSearch&#xff0c;首先要在Redis数据上声明索引。然后可以使用重新搜索查询语言来查询该数据。RedSearch使用压缩的反向索引进行快速索引&#xff0c;占用内存少。RedSearch索…...

mybatis-plus 的saveBatch性能分析

Mybatis-Plus 的批量保存saveBatch 性能分析 目录 Mybatis-Plus 的批量保存saveBatch 性能分析背景批量保存的使用方案循环插入使用PreparedStatement 预编译优点&#xff1a;缺点&#xff1a; Mybatis-Plus 的saveBatchMybatis-Plus实现真正的批量插入自定义sql注入器定义通用…...

python异常:pythonIOError异常python打开文件异常

1.python读取不存在的文件时&#xff0c;抛出异常 通过 open()方法以读“r”的方式打开一个 abc.txt 的文件&#xff08;该文件不存在&#xff09;&#xff0c;执行 open()打开一个不存在的文件时会抛 IOError 异常&#xff0c;通过 Python 所提供的 try...except...语句来接收…...

电话机器人语音识别用哪家更好精准度更高。

语音识别系统的选择取决于你的具体需求&#xff0c;包括但不限于识别精度、速度、易用性、价格等因素。以下是一些在语音识别领域表现较好的公司和产品&#xff1a; 科大讯飞&#xff1a;科大讯飞是中国最大的语音识别技术提供商之一&#xff0c;其语音识别技术被广泛应用于各…...

【Unity动画】Unity如何导入序列帧动画(GIF)

Unity 不支持GIF动画的直接播放&#xff0c;我们需要使用序列帧的方式 01准备好序列帧 02全部拖到Unity 仓库文件夹中 03全选修改成精灵模式Sprite 2D ,根据需要修改尺寸&#xff0c;点击Apply 04 创建一个空物体 拖动序列上去 然后全选所有序列帧&#xff0c;拖到这个空物体…...

uniapp APP 上传文件

/*** 上传文件*/uploadPhoneFile:function(callback,params {}) {let fileType [.pdf,.doc,.xlsx,.docx,.xls]// #ifdef APP-PLUSplus.io.chooseFile({title: 选择文件, filetypes: [doc, docx], // 允许的文件类型 multiple: false, // 是否允许多选 },(e)>{const tem…...

arcgis数据导出到excel

将arcgis属性数据导出到excel&#xff1a; 1&#xff09; 工具箱\系统工具箱\Conversion Tools.tbx\Excel\Excel 转表 2&#xff09;用excel打开导出的图层文件中后缀为.dbf的数据&#xff08;方便快捷&#xff0c;但是中文易乱码&#xff09;...

吴恩达深度学习环境本地化构建wsl+docker+tensorflow+cuda

Tensorflow2 on wsl using cuda 动机环境选择安装步骤1. WSL安装2. docker安装2.1 配置Docker Desktop2.2 WSL上的docker使用2.3 Docker Destop的登陆2.4 测试一下 3. 在WSL上安装CUDA3.1 Software list needed3.2 [CUDA Support for WSL 2](https://docs.nvidia.com/cuda/wsl-…...

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包:第七:trans_network class

# 网络是研究微生物生态共现模式的常用方法。在这一部分中&#xff0c;我们描述了trans_network类的所有核心内容。 # 网络构建方法可分为基于关联的和非基于关联的两种。有几种方法可以用来计算相关性和显著性。 #我们首先介绍了基于关联的网络。trans_network中的cal_cor参数…...

ubuntu下在vscode中配置matplotlibcpp

ubuntu下在vscode中配置matplotlibcpp 系统&#xff1a;ubuntu IDE&#xff1a;vscode 库&#xff1a;matplotlib-cpp matplotlibcpp.h文件可以此网址下载&#xff1a;https://github.com/lava/matplotlib-cpp 下载的压缩包中有该头文件&#xff0c;以及若干实例程序。 参考…...

Vue面试题,背就完事了

1.vue的生命周期有哪些及每个生命周期做了什么? Vue.js 的生命周期可以分为以下几个核心阶段&#xff0c;每个阶段都伴随着特定的钩子函数&#xff08;生命周期钩子&#xff09;来执行相应的操作&#xff1a; 创建阶段&#xff1a; beforeCreate&#xff1a;实例被创建后、数…...

centos创建并运行一个redis容器 并支持数据持久化

步骤 : 创建redis容器命令 docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes 进入容器 : docker exec -it mr bash 链接redis : redis-cli 查看数据 : keys * 存入一个数据 : set num 666 获取数据 : get num 退出客户端 : exit 再退…...

nvm安装和使用保姆级教程(详细)

一、 nvm是什么 &#xff1a; nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和npm都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。 二、卸载之前安装的node: …...

跳绳计数,YOLOV8POSE

跳绳计数&#xff0c;YOLOV8POSE 通过计算腰部跟最初位置的上下波动&#xff0c;计算跳绳的次数...

阿里云ecs服务器配置反向代理上传图片

本文所有软件地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/12OSFilS-HNsHeXTOM47iaA 提取码&#xff1a;dqph 为什么要使用阿里云服务器&#xff1f; 项目想让别人通过外网进行访问就需要部署到我们的服务器当中 1.国内知名的服务器介绍 国内比较知名的一些…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...