深入浅出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.Name
    Content 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 ResponseElement
    if 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数据,解决实际开发中遇到的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器磁盘更改挂载目录

linux服务器磁盘弹性扩容时&#xff0c;会出现没有挂载到理想的目录下&#xff0c;这时候就需要通过命令从新挂载目录&#xff0c;以下示例是把默认挂载目录/home更改为/data 1,df -lh ####查看现有挂载信息 2.lsblk ###查看文件形式&#xff0c;确保原有数据盘文件结构。 3.…

团队如何限制合适的在制品(WIP)数量?

看板之父David Anderson曾说过“看板的本质是一个很朴素的思想&#xff1a;在制品必须被限制。”但对于团队来说&#xff0c;确定一个合适的在制品限制可能是件棘手的事。 在《看板快速启动指南》一文中&#xff0c;我们已经初步了解如何打造一个看板&#xff0c;今天我们来一…

java学习之路-方法讲解

目录 1.方法概念及使用 1.1什么是方法 1.2方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系(重要) 1.5 没有返回值的方法 2.方法重载 3.方法递归 3.1递归概念 3.2递归执行过程分析 3.3递归练习 代码示例1 代码示例2 1.方法概念及使用 1.1什么是方法 方法就是…

jetson nano——编译一些包的网址导航,pyside2,qt(持续更新)

目录 1.PySide2下载地址2.tesserocr下载地址3.Qt下载地址4.OpenSSL官网5.latex编译器下载地址5.1MikTex5.2TeX Live 1.PySide2下载地址 https://download.qt.io/official_releases/QtForPython/pyside2/ 如下图&#xff1a; 2.tesserocr下载地址 https://github.com/simonflue…

python网络编程:通过socket实现TCP客户端和服务端

目录 写在开头 socket服务端&#xff08;基础&#xff09; socket客户端&#xff08;基础&#xff09; 服务端实现&#xff08;可连接多个客户端&#xff09; 客户端实现 数据收发效果 写在开头 近期可能会用python实现一些网络安全工具&#xff0c;涉及到许多关于网络…

PythonWeb——Django框架

框架介绍 1.什么是框架? 框架就是程序的骨架&#xff0c;主体结构&#xff0c;也是个半成品。 2.框架的优缺点 可重用、成熟,稳健、易扩展、易维护 3.Python中常见的框架 大包大揽 Django被官方称之为完美主义者的Web框架。力求精简web.py和Tornado新生代微框架Flask和B…

hadoop分布式环境ssh设置免密登陆之后目标主机更换无法连接解决

在进行hadoop分布式环境搭建时&#xff08;三台机&#xff0c;master&#xff0c;slave1&#xff0c;slave2&#xff09;&#xff0c;后期slave2系统出现问题&#xff0c;更换新机后&#xff0c;master与slave2文件传输失败&#xff1a; 以为是秘钥过期的问题&#xff0c;更换…

【Linux】一文解决如何在终端查看 python解释器 的位置

【Linux】一文解决如何在终端查看 python解释器 的位置 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…

Github主页设置贪吃蛇详细教程

先看最终实现结果&#xff1a; 有条贪吃蛇放在主页还是蛮酷的哈哈哈。接下来我来讲一讲怎么在Github主页添加一条贪吃蛇。 首先要修改自己的Github的主页&#xff0c;我们得有一个特殊的仓库——这个仓库必须与你的Github用户名保持一致&#xff0c;并且需要公开&#xff0c…

静默快速安装oracle 19c

静默快速安装oracle 19c 1.配置yum源 1.配置网络yum源 1.删除redhat7.0系统自带的yum软件包&#xff1b; rpm -qa|grep yum >oldyum.pkg 备份原信息rpm -qa|grep yum|xargs rpm -e --nodeps 不检查依赖&#xff0c;直接删除rpm包 1232.自行下载所需要的软件包。包名会…

求解3、4、6自由度仿射变换矩阵

说明&#xff1a;一开始将目光放在了opencv上&#xff0c;发现只有4、6自由度的仿射变换求解&#xff0c;后来发现skimage十分强大。 注&#xff1a;美中不足的是&#xff0c;skimage的实现没有RANSAC。 function&#xff1a;skimage.transform.estimate_transform() ttypeeu…

【SpringMVC】SpringMVC的整体执行流程

概述&#xff1a;MVC是一种设计模式&#xff0c;SpringMVC是按照MVC模式实现的优秀框架&#xff0c;可以帮助我们更简洁的完成Web开发&#xff0c;并且天然与Spring集成。后端项目分为Service层&#xff08;处理业务&#xff09;、Dao层&#xff08;数据库操作&#xff09;、En…

Java复习03 多线程

Java复习03 多线程 初学的时候 我的问题是 多线程是什么意思&#xff1f;进程和线程的区别&#xff1f; 线程创建的方式是什么&#xff1f;线程的状态是什么意思&#xff1f;分为哪几类&#xff1f;线程同步又是什么意思&#xff1f;有哪几种情况 &#xff1f;静态代理是什么意…

外贸人自己的时间管理方法,建议收藏

“最近忙吗&#xff1f;”好像取代“吃了吗”&#xff0c;成为外贸生活非常常见的问候了&#xff0c;有些人可能是真的很忙&#xff0c;有的人的忙可能是因为没有计划跟安排造成了的。 其实业务做的时间长了&#xff0c;容易形成惯性&#xff0c;做事情一成不变&#xff0c;按…

超分辨率(3)--基于RCAN网络实现图像超分辨率重建

一.项目介绍 RCAN&#xff1a;Residual Channel Attention Network&#xff08;残差通道注意网络 ) 卷积神经网络(CNN)的深度对于图像超分辨率(SR)是极其关键的因素。然而&#xff0c;我们观察到&#xff0c;更深层次的图像SR网络更难训练。低分辨率的输入和特征包含丰富的低…

HCIA——TCP协议详解

目录 1、TCP概念及协议头部格式 1.1TCP特点 1.2TCP协议协议头部格式 1.3字段进行介绍 1.3.1源端口和目的端口 1.3.2序号(seq) 1.3.3确认序号(ack) 1.3.4数据偏移 1.3.5标志位 1.3.6窗口 1.3.7校验和 1.3.8紧急指针 2、TCP的可靠性 2.1 TCP可靠性的保障 2.2排序机…

CSS动画属性(一)加两实例

keyframes 定义 使用可以创建动画&#xff08;逐步改变从一个CSS样式设定到另一个。)可以设置多次变化发生时使用%/关键字from和to 0&#xff05;是开头动画&#xff0c;100&#xff05;是当动画完成。 为了获得最佳的浏览器支持&#xff0c;始终定义为0&#xff05;和100&…

postgres让别人连接自己本地的库

本地安装了postgres&#xff0c;一般只能自己连接&#xff0c;如果别人想要连接我们自己的库&#xff0c;需要修改postgres的配置。 找到pg.gba.conf&#xff0c;路径是&#xff1a;postgres安装路径/PostgreSQL/data 使用记事本打开这个文件&#xff0c;将别人的ip填入其中即…

TCP:三次握手四次挥手及相关问题:

连接—三次握手&#xff1a; 流程图&#xff1a; 过程详解&#xff1a; 客户端(connect)连接服务器&#xff08;listen) Client将标志位SYN置为1,随机产生一个值seqx, 并将该数据包发送给Server, Client进入SYN_ SENT状态&#xff0c;等待Server确认。Server收到数据包后由标…

【Spring Cloud】feign调用携带token

当我们再用feign调用的时候&#xff0c;如果对应服务需要token验证则需要我们传递token 网上提供的方法都是添加如下配置: Configuration public class FeignConfig implements RequestInterceptor {Overridepublic void apply(RequestTemplate requestTemplate) {ServletReq…
最新文章