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

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

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

相关文章

加速量子计算机商业化!富士通日立NEC等联合成立新量子计算公司

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨王珩 编译/排版丨沛贤 深度好文&#xff1a;700字丨5分钟阅读 日本工业界和学术界将在 2024 年联合成立新一家公司&#xff0c;研发量子计算机并将其商业化。包括富士通、日立和NEC在内…

arcgis 点连接到面(以地级市图层为例)

地级市图层进行“点到面”的连接&#xff0c;并输出 在点击地级市图层&#xff0c;右击——连接和关联——连接 选择基于空间位置的另一图层数据&#xff0c;文件选择上面输出并添加的图层文件&#xff0c;进行“点到面”的连接&#xff0c;可依据新需求选择平均值&#xff0c…

Halcon 3D算子总结整理

halcon 3D包含以下几个模块&#xff1a; 3D Matching&#xff08;3D匹配&#xff09;3D Object Model&#xff08;3D模型&#xff09;3D Reconstruction&#xff08;3D重构&#xff09;3D Transformations&#xff08;3D转换&#xff09; 1. 3D Matching 1.1 3D Box3D盒查找器…

解锁数据可视化新境界:山海鲸可视化免费编辑与组件探索

作为一名长期使用山海鲸可视化的资深用户&#xff0c;我在数据可视化看板的制作过程中&#xff0c;深刻感受到了这款软件带来的便捷与高效。今天&#xff0c;我想与大家分享一些我在使用山海鲸可视化制作数据可视化看板时的经验&#xff0c;给对这款产品同样感兴趣的朋友同行一…

TT-100K数据集,YOLO格式

TT-100K数据集YOLO格式&#xff0c;分为train、val和test&#xff0c;其中train中共有6793张图片&#xff0c;val中共有1949张图片&#xff0c;test中共有996张图片。数据集只保留包含图片数超过100的类别。共计46类。

C#,图论与图算法,无向图(Graph)回环(Cycle)的不相交集(disjoint)或并集查找(union find)判别算法与源代码

1 回环(Cycle)的不相交集(disjoint)或并集 不相交集数据结构是一种数据结构,它跟踪划分为多个不相交(非重叠)子集的一组元素。联合查找算法是对此类数据结构执行两个有用操作的算法: 查找:确定特定元素所在的子集。这可用于确定两个元素是否在同一子集中。 并集:将…

Windows server 2008 R2共享文件配置和web网站的发布 试题一(Windows部分)

Windows server 2008 R2共享文件配置和web网站的发布 试题一&#xff08;Windows部分&#xff09; 设置虚拟机与本机互通设置虚拟机IP关闭虚拟机防火墙设置本机IP测试本机与虚拟机是否可以互通 开启文件共享function discovery resource publication服务的开启SSDP Discovery服…

web渗透测试漏洞复现:Elasticsearch未授权漏洞复现

web渗透测试漏洞复现 Elasticsearch未授权漏洞复现Elasticsearch简介Elasticsearch复现Elasticsearch漏洞修复和加固措施 Elasticsearch未授权漏洞复现 Elasticsearch简介 Elasticsearch 是一款 Java 编写的企业级搜索服务&#xff0c;它以分布式多用户能力和全文搜索引擎为特…

利用textarea和white-space实现最简单的文章编辑器 支持缩进和换行

当你遇到一个非常基础的文章发布和展示的需求&#xff0c;只需要保留换行和空格缩进&#xff0c;你是否会犹豫要使用富文本编辑器&#xff1f;实际上这个用原生的标签两步就能搞定&#xff01; 1.直接用textarea当编辑器 textarea本身就可以保存空格和换行符&#xff0c;示例如…

【目标检测】2. RCNN

接上篇 【目标检测】1. 目标检测概述_目标检测包括预测目标的位置吗?-CSDN博客 一、前言 CVPR201 4经典paper:《 Rich feature hierarchies for accurate object detection and semantic segmentation》&#xff0c;https://arxiv.org/abs/1311.2524, 这篇论文的算法思想被称…

C#集合:从字典到队列——探索数据结构核心

文章目录 C# 中的集合类型C# Dictionary 字典C# Hashtable&#xff1a;哈希表Hashtable 类中的属性Hashtable 类中的方法 C# SortedList&#xff1a;排序列表SortedList 类的中的属性SortedList 类的中的方法 C# Stack&#xff1a;堆栈Stack 类中的属性Stack 类中的方法 C# Que…

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示&#xff08;图片检测批量检测视频检测摄像头检测&#xff09; 基于深度学习YOLOv8Pyqt…

JVM的双亲委派模型和垃圾回收机制

jvm的作用是解释执行java字节码.java的跨平台就是靠jvm实现的.下面看看一个java程序的执行流程. 1. jvm中的内存区域划分 jvm也是一个进程,进程在运行过程中,要行操作系统申请一些资源.这些内存空间就支撑了后续java程序的执行. jvm从系统申请了一大块内存,这块内存在java程序使…

影响MySql 服务性能最重要的两个参数。

不同的需求&#xff0c;不同服务器硬件配置&#xff0c;要想MySql 服务处于最优状态是需要调试一些参数的&#xff0c;可调的参数非常多&#xff0c;在看完官方的mysql的文档&#xff0c;结合以前的配置情况在这里选择影响性能最大的参数作介绍&#xff1a; 先查一下参数情况&…

吴恩达深度学习环境本地化构建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-…

Hive SQL必刷练习题:连续问题 间断连续(*****)

问题描述&#xff1a; 1&#xff09; 连续问题&#xff1a;找出连续三天&#xff08;或者连续几天的啥啥啥&#xff09;。 2&#xff09; 间断连续&#xff1a;统计各用户连续登录最长天数&#xff0c;间断一天也算连续&#xff0c;比如1、3、4、6也算登陆了6天 问题分析&am…

html-docx-js-typescript——将html生成docx文档

html-docx-js-typescript源码&#xff1a;GitHub - caiyexiang/html-docx-js-typescript: Convert HTML documents to docx format. html-docx-js地址&#xff1a;html-docx-js - npm *简单使用&#xff1a; 获取需要转为word文档的html节点&#xff0c;借助file-saver提供的…

判断闰年(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int year 2000;//执行循环判断&#xff1b;while (year < 2010){//执行流程&#xff1b;//判断能否整除4&#xff1…

Chrome历史版本下载地址:Google Chrome Older Versions Download (Windows, Linux Mac)

最近升级到最新版本Chrome后发现页面居然显示错乱,是在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 32-bit VersionSizeDate104.0.5112.10279.68 MB2022-05-30…

Vue3学习日记 Day4 —— pnpm,Eslint

注&#xff1a;此课程需要有Git的基础才能学习 一、pnpm包管理工具 1、使用原因 1.1、速度快&#xff0c;远胜过yarn和npm 1.2、节省磁盘空间 2、使用方式 2.1、安装方式 npm install -g pnpm 2.2、创建项目 pnpm create vue 二、Eslint配置代码风格 1、环境同步 1、禁用Pret…