高效Go编程: encoding/csv标准库深度解析

news2024/11/17 15:34:15

高效Go编程: encoding/csv标准库深度解析

    • 引言
    • 了解encoding/csv库
      • CSV文件的基本结构
      • encoding/csv库的核心功能
      • 应用场景
    • 读取CSV文件
      • 基本步骤
      • 代码示例
      • 处理不同的分隔符
      • 错误处理
    • 处理CSV数据
      • 数据解析
      • 代码示例
      • 处理不规则数据
      • 代码示例
    • 写入CSV文件
      • 基本步骤
      • 代码示例
      • 自定义设置
      • 错误处理
    • 高级应用
      • 使用结构体映射数据
        • 代码示例
      • 处理大型CSV文件
        • 代码示例
    • 错误处理和调试
      • 错误处理策略
      • 代码示例
      • 调试技巧
    • 案例研究
      • 场景描述
      • 步骤分解
      • 代码示例
    • 总结
      • 主要学习点
      • 结论

在这里插入图片描述

引言

在当今数据驱动的编程世界中,CSV(逗号分隔值)格式的数据无处不在。它简单、灵活,被广泛应用于数据导入、导出和分析。Go语言,以其高效和简洁著称,提供了encoding/csv库,专门用于处理CSV格式的数据。这个库不仅简化了读取和写入CSV文件的过程,还支持定制化和高级数据操作,非常适合中级和高级开发者在实际开发中使用。

本文将详细介绍如何利用Go的encoding/csv库来高效处理CSV数据。我们将从基础的读取和写入操作开始,逐步深入到更高级的数据处理技巧。通过实际的代码示例和案例分析,本文旨在帮助开发者全面掌握encoding/csv库的强大功能,从而在实际项目中灵活运用。

接下来,让我们首先了解encoding/csv库的基本功能和应用场景。

了解encoding/csv库

Go语言的encoding/csv库是标准库的一部分,专门用于处理CSV格式的数据。它提供了一系列方便的API,使得读取和写入CSV文件变得简单高效。在深入编码之前,了解这个库的基本功能和应用场景对于有效地利用它至关重要。

CSV文件的基本结构

CSV文件主要由以逗号分隔的文本数据组成。每一行代表一个数据记录,每个记录可以包含多个字段,字段之间以逗号(,)分隔。例如:

姓名,年龄,职业
张三,30,软件工程师
李四,28,数据分析师

encoding/csv库的核心功能

  1. 读取CSV文件encoding/csv允许您轻松读取CSV文件,将每行数据转换为字符串切片。
  2. 写入CSV文件:同样地,这个库也支持将数据写入CSV格式的文件。
  3. 自定义分隔符:虽然标准的CSV使用逗号作为分隔符,但encoding/csv库允许自定义分隔符,增加了处理不同格式CSV文件的灵活性。
  4. 支持多种字符编码:可以处理不同字符编码的CSV文件,例如UTF-8或GBK。

应用场景

encoding/csv库的应用场景非常广泛,包括但不限于:

  • 数据导入和导出:在Web应用中常常需要导出或导入CSV格式的数据。
  • 数据分析:数据科学家和分析师经常使用CSV格式来存储和处理数据。
  • 自动化脚本:自动化处理CSV格式的日志文件或报告。

接下来,我们将探讨如何使用encoding/csv库来读取CSV文件,并提供实际的代码示例。

读取CSV文件

读取CSV文件是encoding/csv库的基础功能之一。在Go中读取CSV文件不仅简单,而且可以高度定制化,以适应不同的数据格式和需求。下面,我们将通过实际的代码示例来展示如何使用Go语言读取CSV文件。

基本步骤

  1. 打开CSV文件:首先,我们需要使用Go的标准库函数os.Open来打开一个CSV文件。

  2. 创建CSV阅读器:接着,利用csv.NewReader函数创建一个CSV文件的阅读器。

  3. 逐行读取数据:使用ReadReadAll方法来逐行读取CSV文件中的数据。

代码示例

下面是一个基本的例子,展示了如何读取一个CSV文件:

package main

import (
    "encoding/csv"
    "fmt"
    "os"
)

func main() {
    // 打开CSV文件
    file, err := os.Open("example.csv")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer file.Close()

    // 创建CSV阅读器
    reader := csv.NewReader(file)

    // 逐行读取数据
    for {
        record, err := reader.Read()
        if err != nil {
            break
        }
        fmt.Println(record)
    }
}

这段代码将会打开一个名为example.csv的文件,并逐行打印出其中的数据。

处理不同的分隔符

有时候,CSV文件可能使用不同的分隔符(如分号;)。encoding/csv库允许你自定义分隔符来适应这些情况。例如:

reader.Comma = ';'

这样设置后,阅读器会将分号作为字段分隔符来解析CSV文件。

错误处理

处理CSV文件时,错误处理也非常重要。例如,当到达文件末尾或遇到格式错误时,Read方法会返回错误。合理的错误处理可以确保程序的健壮性和可靠性。

在下一部分,我们将探讨如何处理和解析CSV数据,并提供相应的代码示例。

处理CSV数据

一旦成功读取了CSV文件的数据,下一步就是对这些数据进行处理和解析。在Go语言中,encoding/csv库提供了灵活的方式来处理各种复杂的CSV数据格式。我们将通过代码示例来展示如何进行这些操作。

数据解析

在读取CSV数据后,通常需要将这些数据转换为更有用的格式。例如,你可能需要将字符串数据转换为整数、浮点数或其他类型。

代码示例

假设我们有一个CSV文件,其中包含用户的姓名和年龄,我们想要将姓名保持为字符串,将年龄转换为整数:

package main

import (
    "encoding/csv"
    "fmt"
    "os"
    "strconv"
)

func main() {
    file, err := os.Open("users.csv")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer file.Close()

    reader := csv.NewReader(file)

    for {
        record, err := reader.Read()
        if err != nil {
            break
        }

        name := record[0]
        age, err := strconv.Atoi(record[1])
        if err != nil {
            fmt.Println("Error converting age:", err)
            continue
        }

        fmt.Printf("Name: %s, Age: %d\n", name, age)
    }
}

这个例子中,我们使用strconv.Atoi函数将年龄从字符串转换为整数。

处理不规则数据

有时,CSV文件中的数据可能不规则或包含错误。例如,某些行可能缺少某些字段,或者数据格式可能不正确。在这种情况下,合理的错误处理和数据验证变得尤为重要。

代码示例

处理不规则数据的一个简单方法是检查每行数据的长度:

for {
    record, err := reader.Read()
    if err != nil {
        break
    }

    if len(record) < 2 {
        fmt.Println("Invalid record:", record)
        continue
    }

    // 数据处理逻辑
}

在这个例子中,如果一行数据的字段少于2个,我们将其视为无效记录并跳过处理。

在接下来的部分,我们将讨论如何使用encoding/csv库写入CSV文件,并提供相关的代码示例。

写入CSV文件

除了读取CSV文件外,encoding/csv库同样提供了写入CSV文件的功能。这对于生成报告、导出数据或任何需要将数据保存为CSV格式的场景都非常有用。在本节中,我们将探讨如何使用Go语言将数据写入CSV文件,并提供相应的代码示例。

基本步骤

  1. 创建或打开CSV文件:使用Go的os包创建或打开一个文件用于写入数据。
  2. 创建CSV写入器:利用csv.NewWriter函数创建一个CSV文件的写入器。
  3. 写入数据到CSV:使用WriteWriteAll方法将数据写入CSV文件。
  4. 刷新写入器缓存:确保所有数据都被正确写入到文件中。

代码示例

以下是一个简单的例子,演示了如何将数据写入CSV文件:

package main

import (
    "encoding/csv"
    "os"
)

func main() {
    file, err := os.Create("output.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    records := [][]string{
        {"姓名", "年龄", "职业"},
        {"张三", "30", "软件工程师"},
        {"李四", "28", "数据分析师"},
    }

    for _, record := range records {
        if err := writer.Write(record); err != nil {
            panic(err)
        }
    }
}

在这个例子中,我们创建了一个名为output.csv的新文件,并写入了几行数据。

自定义设置

encoding/csv库允许你自定义CSV的写入行为,例如更改字段分隔符、行结束符等。例如,要将字段分隔符更改为分号(;),可以这样设置:

writer.Comma = ';'

错误处理

和读取操作一样,写入CSV文件时也需要注意错误处理。确保在写入过程中正确处理任何可能出现的错误,以确保数据的完整性和程序的稳定性。

接下来,我们将探讨一些高级应用技巧和最佳实践,帮助你更有效地使用encoding/csv库。

理解您的要求,我会提供一个更完整的代码示例来展示encoding/csv库的高级应用。我们将专注于使用结构体映射CSV数据,并处理大型CSV文件的技巧。

高级应用

使用结构体映射数据

当处理结构化的CSV数据时,使用结构体映射每一条记录是一个高效且清晰的方法。这种方法可以提高代码的可读性,并利用Go语言的强类型特性来增强数据处理的准确性。

代码示例

假设我们有一个包含用户信息的CSV文件,格式如下:

姓名,年龄,职业
张三,30,软件工程师
李四,28,数据分析师

我们可以创建一个对应的User结构体来映射这些数据:

package main

import (
    "encoding/csv"
    "fmt"
    "os"
    "strconv"
)

// User 结构体用于映射CSV文件中的一行数据
type User struct {
    Name     string
    Age      int
    JobTitle string
}

// parseUser 将CSV记录解析为User结构体
func parseUser(record []string) (*User, error) {
    if len(record) != 3 {
        return nil, fmt.Errorf("invalid record length: %v", record)
    }

    age, err := strconv.Atoi(record[1])
    if err != nil {
        return nil, fmt.Errorf("invalid age: %s", record[1])
    }

    return &User{
        Name:     record[0],
        Age:      age,
        JobTitle: record[2],
    }, nil
}

func main() {
    file, err := os.Open("users.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    reader := csv.NewReader(file)

    var users []*User

    for {
        record, err := reader.Read()
        if err != nil {
            break
        }

        user, err := parseUser(record)
        if err != nil {
            fmt.Println("Error parsing record:", err)
            continue
        }

        users = append(users, user)
    }

    // 打印解析后的用户信息
    for _, user := range users {
        fmt.Printf("%+v\n", *user)
    }
}

这个程序首先定义了一个User结构体,然后使用parseUser函数将CSV记录解析为User对象。在主函数中,我们读取CSV文件,并将每行数据解析为User结构体的实例。

处理大型CSV文件

处理大型CSV文件时,考虑到内存和性能问题,建议使用流式处理。这意味着逐行读取文件,而不是一次性将整个文件加载到内存中。

代码示例

在上面的例子中,我们已经使用了流式处理方法。通过使用csv.NewReader和逐行读取的方式,我们可以有效地处理大型文件,而不会耗尽内存资源。

for {
    record, err := reader.Read()
    if err != nil {
        break
    }

    // 处理每行记录的代码
}

这种方法在处理大型CSV文件时非常有效,因为它只在任何给定时间占用少量内存,并且可以逐行处理数据。

结合这些高级技巧,你现在应该能够更有效地使用encoding/csv库来处理各种复杂和大型的CSV文件了。

错误处理和调试

处理CSV文件时,正确的错误处理和有效的调试是保证数据准确性和程序稳定性的关键。encoding/csv库在处理文件时可能会遇到各种错误,例如格式错误、文件读取错误等。在这一节中,我们将讨论如何进行错误处理和调试,以确保您的CSV处理逻辑是健壮和可靠的。

错误处理策略

  1. 预期错误处理:处理文件不存在、无法打开或读取错误等预期内的错误。
  2. 意外错误处理:处理意外的数据格式错误、解析错误等。
  3. 记录和报告错误:合理地记录错误信息,方便调试和问题追踪。

代码示例

以下是一个扩展的错误处理和调试的示例:

package main

import (
    "encoding/csv"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("users.csv")
    if err != nil {
        fmt.Printf("Error opening file: %v\n", err)
        return
    }
    defer file.Close()

    reader := csv.NewReader(file)

    lineNumber := 0
    for {
        record, err := reader.Read()
        if err != nil {
            if err == csv.ErrFieldCount {
                fmt.Printf("Warning: wrong number of fields at line %d\n", lineNumber)
            } else if err == csv.ErrQuote {
                fmt.Printf("Warning: quote error at line %d\n", lineNumber)
            } else {
                fmt.Printf("Error reading CSV at line %d: %v\n", lineNumber, err)
                break
            }
        }
        lineNumber++

        // 处理记录的代码
    }
}

在这个例子中,我们处理了各种可能的错误情况,并添加了行号信息以帮助定位错误发生的位置。

调试技巧

  1. 增加日志输出:在关键步骤增加日志输出,可以帮助您跟踪数据处理的流程和状态。
  2. 使用调试器:如果您的开发环境支持,使用调试器可以逐步执行代码,检查变量状态,这对于发现和解决问题非常有用。
  3. 单元测试:编写单元测试可以帮助您验证代码逻辑的正确性,并在未来的开发中防止回归错误。

通过实施这些错误处理和调试策略,您可以确保您的CSV数据处理逻辑更加健壮和可靠。下一部分,我们将通过一个案例研究来展示encoding/csv库在实际应用中的使用。

案例研究

为了更好地理解encoding/csv库在实际开发中的应用,我们将通过一个具体的案例研究来展示它的实用性。假设我们需要开发一个程序,该程序读取一个包含员工数据的CSV文件,并根据某些条件筛选和统计数据,最后输出结果到另一个CSV文件。

场景描述

我们的CSV文件employees.csv包含以下字段:姓名部门入职年份。我们的目标是找出在特定部门工作,并且入职年份超过5年的员工。

步骤分解

  1. 读取CSV文件:读取employees.csv文件中的员工数据。
  2. 筛选数据:根据部门和入职年份筛选员工。
  3. 统计和处理数据:对筛选后的数据进行必要的统计和处理。
  4. 输出结果:将处理后的数据输出到新的CSV文件。

代码示例

package main

import (
    "encoding/csv"
    "fmt"
    "os"
    "strconv"
    "time"
)

// Employee 结构体用于映射员工数据
type Employee struct {
    Name       string
    Department string
    JoinYear   int
}

// parseEmployee 将CSV记录解析为Employee结构体
func parseEmployee(record []string) (*Employee, error) {
    joinYear, err := strconv.Atoi(record[2])
    if err != nil {
        return nil, fmt.Errorf("invalid join year: %s", record[2])
    }

    return &Employee{
        Name:       record[0],
        Department: record[1],
        JoinYear:   joinYear,
    }, nil
}

func main() {
    file, err := os.Open("employees.csv")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()

    reader := csv.NewReader(file)
    var employees []*Employee

    for {
        record, err := reader.Read()
        if err != nil {
            break
        }

        employee, err := parseEmployee(record)
        if err != nil {
            fmt.Println("Error parsing record:", err)
            continue
        }

        employees = append(employees, employee)
    }

    // 筛选员工数据
    var selectedEmployees []*Employee
    currentYear := time.Now().Year()
    for _, employee := range employees {
        if employee.Department == "IT" && (currentYear-employee.JoinYear) > 5 {
            selectedEmployees = append(selectedEmployees, employee)
        }
    }

    // 输出筛选结果到新的CSV文件
    outputFile, err := os.Create("selected_employees.csv")
    if err != nil {
        panic(err)
    }
    defer outputFile.Close()

    writer := csv.NewWriter(outputFile)
    defer writer.Flush()

    for _, employee := range selectedEmployees {
        if err := writer.Write([]string{employee.Name, employee.Department, strconv.Itoa(employee.JoinYear)}); err != nil {
            panic(err)
        }
    }
}

在这个例子中,我们首先定义了一个Employee结构体来映射CSV中的数据。然后,我们读取CSV文件,将每行数据解析为Employee对象。接下来,我们根据部门和入职年份筛选员工,并将筛选结果写入新的CSV文件中。

通过这个案例,我们可以看到encoding/csv库在实际项目中如何用于处理和分析数据。这只是一个简单的例子,但它展示了Go语言在数据处理方面的强大能力。

总结

通过本文的深入探讨和案例研究,我们了解了Go语言中encoding/csv库的强大功能和应用。从基本的读写操作到高级的数据处理技巧,encoding/csv库证明了其在处理CSV数据方面的高效性和灵活性。以下是我们所学内容的总结:

主要学习点

  1. 基础操作:我们探讨了如何使用encoding/csv库进行基本的CSV文件读写操作,这是处理CSV数据的基石。

  2. 数据处理:通过将CSV数据映射到结构体、错误处理、以及动态数据处理,我们展示了在实际应用中处理复杂CSV数据的方法。

  3. 高级应用:我们学习了一些高级技巧,比如使用结构体映射数据、处理大型CSV文件,以及合理的错误处理和调试策略,这些都是提高开发效率和代码质量的关键。

  4. 实际案例:通过一个实际的案例研究,我们展示了如何将学到的知识应用于实际问题解决中,强化了理论与实践的结合。

结论

无论是在数据导入/导出、数据分析还是自动化脚本开发中,Go语言的encoding/csv库都是一个非常有用的工具。它的简洁性、灵活性和强大的功能使得处理CSV数据变得简单而高效。通过本文的学习,开发者们应该能够更加自信地在自己的项目中使用这个库来处理各种CSV数据。

希望这篇文章能帮助你理解并有效地使用Go的encoding/csv库。不论你是在处理小型的数据集还是大型的CSV文件,它都将是你强大的工具之一。记住,实践是学习的最好方式,不断尝试和探索将帮助你更深入地理解和掌握这些概念。

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

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

相关文章

C语言——详解字符函数和字符串函数(一)

Hi,铁子们好呀&#xff01;今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下&#xff1a; 文章目录 &#x1f386;1.字符分类函数&#x1f4af;&#x1f4af;⏩1.1 什么是字符分类函数的&#xff1f;&#x1f4af;&#x1f4af;⏩1.2 字符函数的类型有哪…

DXP软件界面显示“No Hard Devices”【简单的操作问题】加【软件下载】

目录 一&#xff0c;DXP软件界面显示“No Hard Devices” 二&#xff0c;软件下载的百度网盘资源 一&#xff0c;DXP软件界面显示“No Hard Devices” Protel DXP是2004是澳大利亚Altium公司于2002年推出的一款电子设计自动化软件。它的主要功能包括&#xff1a;原理图编辑、印…

北斗卫星推动数智油田建设

北斗卫星推动数智油田建设 中国石油大港油田采油三厂深入推动北斗智能终端在智能巡检、安全监督、油井导航、坐标测绘等多场景应用&#xff0c;实现了人工查井向智能巡检的变革。截至2月下旬&#xff0c;场景覆盖率达100%&#xff0c;高效助推大港南部“双高”老区数智油田建设…

修改vscode的相对路径计算逻辑

vscode的相对路径计算逻辑是&#xff0c;"./"表示当前项目的文件夹&#xff0c;而不是当前文件所在的文件夹 做出如下修改&#xff1a; File-->Preferences-->settings 搜索Execute in File Dir , 然后取消勾选

TikTok新手如何起号?环境因素与内容创新技巧

相信很多刚入行的TikTok玩家都遇到过一个难题&#xff0c;那就是账号权重低&#xff0c;播放量在个位数徘徊&#xff0c;其实都是因为还没起号&#xff01;那么具体如何起号呢&#xff1f;下面小编也给大家分享一下技巧。 一、如何起号 1、明确注册 TikTok 账号的目的 无论是…

Linux 管道

目录 一、认识管道 二、匿名管道 pipe函数 用法&#xff1a; pipefd&#xff1a; 匿名管道通信&#xff1a; 三、命名管道 概念&#xff1a; 创建&#xff1a; 特性&#xff1a; 用途&#xff1a; 四、命名管道和匿名管道的区别 命名&#xff1a; 持久性&#xff1a;…

MySQL:概念简章

1.SQL通用语法 SQL单行、多行书写&#xff0c;以分号结尾SQL可以以空格有缩进增加代码可读性SQL语句不区分大小写 2.SQL语句分类 2.1 DDL&#xff08;数据定义语言&#xff09; 用于数据库、数据表、字段的定义的语言 create by 表名 &#xff08;表里有什么字段&#xff09;…

力扣经典题:化栈为队

整体思路&#xff1a;入栈然后出栈&#xff0c;操作就和队列相同了 大佬的代码 typedef struct Node {int val;struct Node* next; }Node; Node* newNode(int Val) {Node* n(Node*)malloc(sizeof(Node));n->valVal;n->nextNULL;return n; } void push(Node* Head,int Va…

怎么把mp4转换成amv格式?如何下载amv格式视频?

MP4&#xff08;MPEG-4 Part 14&#xff09;是一种通用的视频文件格式&#xff0c;广泛用于多媒体应用。作为MPEG-4标准的一部分&#xff0c;MP4以其卓越的压缩性能、出色的视频质量和广泛的兼容性成为当前最流行的视频格式之一。 AMV文件格式的介绍 AMV文件格式起源于中国公司…

c语言大小写字母的转换

通过ascll码表我们可以知道大写字母与小写字母相差32个数&#xff08;小写字母比大写字母大&#xff09;。因此&#xff0c;通过相加减32即可转换大小写字母。 #include <stdio.h>int main() {char ch c;char CH A;printf("%c\n", ch - 32);printf("%c…

网工内推 | 上市公司网工,IE认证优先,最高18K*13薪,包吃住

01 深圳市宝腾互联科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、是整个数据中心的网络技术及安全问题的负责人&#xff0c;确保数据中心业务的正常进行&#xff1b; 2、负责规划、设计、搭建、维护数据中心的网络环境&#xff0c;确保IDC /云平台&a…

【Qt】常用控件或属性(1)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、QWidget属性一览 二、控件button、属性enabled(可用状态) 三、属性geometry(修改位置和尺寸) 1、QRect类型的结…

第五十五天| 583. 两个字符串的删除操作、72. 编辑距离

Leetcode 583. 两个字符串的删除操作 题目链接&#xff1a;583 两个字符串的删除操作 题干&#xff1a;给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 思考&#xff1a;动态规划。本题中…

现已修复!微软 SmartScreen 漏洞被用于分发 DarkGate 恶意软件

昨天&#xff08;3月13日&#xff09;&#xff0c;趋势科技分析师报告称有黑客利用Windows SmartScreen 漏洞在目标系统投放DarkGate 恶意软件。 该漏洞被追踪为 CVE-2024-21412 漏洞&#xff0c;是一个 Windows Defender SmartScreen 漏洞&#xff0c;它允许特制的下载文件绕…

Self-supervised Contextual Keyword and Keyphrase Retrieval with Self-Labelling

文章目录 题目摘要方法数据集实验 题目 通过自我标记进行自我监督的上下文关键字和关键词短语检索 论文地址&#xff1a;https://www.preprints.org/manuscript/201908.0073/v1 项目地址&#xff1a;https://github.com/naister/Keyword-OpenSource-Data 摘要 在本文中&#x…

SE园区综合实验(未补齐版)

实验要求&#xff1a; 1.局域网存在vlan10和vlan20两个业务vlan&#xff0c;ip网段分别对应192.168.1.0/24和192.168.2.0/24 2.业务vlan可以在所有链路上传输数据 3.sw1和sw2之间的直连链路上配置静态链路聚合实现链路冗余&#xff0c;并提高链路带宽 4.sw3为某接入点二次交…

【教学类-34-11】20240314 动物拼图(Midjounery生成线描图,8*8格拼图块 A4整张)(AI对话大师)

作品展示&#xff1a;——A4整页&#xff08;一人2张纸&#xff09; 背景需求&#xff1a; 通过春天拼图的个别化实验&#xff0c;我发现&#xff1a; 【教学类-34-10】20240313 春天拼图&#xff08;Midjounery生成线描图&#xff0c;4*4格拼图块&#xff09;&#xff08;AI…

单例模式( Singleton)——创建型模式

单例模式——创建型模式 什么是单例模式&#xff1f; 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。简单来说如果你创建了一个对象&#xff0c; 过一会儿后你决定再创建一个新对象&#xff0c; 此…

【Memcached】

memcached 有一个很大的缺陷不能持久化&#xff0c;不能存储在硬盘里 1.NoSQL介绍 NoSQL是对 Not Only SQL、非传统关系型数据库的统称。 NoSQL一词诞生于1998年&#xff0c;2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。 随着互联网时代的到…

Node.js 学习笔记 fs、path、http模块;模块化;包;npm

Node.js学习 Node.js一、定义1.前端工程化2.Node.js 为何能执行 JS&#xff1f;3.安装nodejs、删除之前的nodejs4.使用 Node.js 二、fs模块 \- 读写文件三、path 模块案例 - 压缩前端html四、HTTP相关URL中的端口号常见的服务程序http 模块-创建 Web 服务案例&#xff1a;浏览时…