掌握Go语言邮件发送:net/smtp实用教程与最佳实践

news2024/11/18 9:29:46

掌握Go语言邮件发送:net/smtp实用教程与最佳实践

    • 概述
    • 基本配置与初始化
      • 导入`net/smtp`包
      • 设置SMTP服务器基本信息
      • 创建SMTP客户端实例
      • 身份验证
    • 发送简单文本邮件
      • 配置发件人信息
      • 构建邮件头部信息
      • 编写邮件正文
      • 使用`SendMail`方法发送邮件
      • 示例代码
    • 发送带附件的邮件
      • 邮件多部分格式简介
      • 构建带有附件的邮件体
      • 使用`SendMail`方法发送邮件
    • 发送HTML格式的邮件
      • HTML邮件的优势和应用场景
      • 构建HTML邮件内容
      • 嵌入图片和其他资源
      • 使用`SendMail`方法发送HTML邮件
    • 处理错误与常见问题
      • 错误处理策略
      • `net/smtp`常见问题及其解决方案
        • 1. **连接超时**
        • 2. **身份验证失败**
        • 3. **发送附件大小限制**
        • 4. **TLS/SSL要求**
      • 安全性考虑:如何安全地使用SMTP服务
    • 高级技巧与最佳实践
      • 性能优化建议
        • 1. **使用连接池**
        • 2. **异步发送邮件**
        • 3. **批量处理邮件发送**
      • 代码重构与维护性提升
        • 1. **模块化邮件构建过程**
        • 2. **使用配置文件管理SMTP设置**
      • 使用第三方库增强`net/smtp`功能
      • 真实案例分析
    • 总结
      • 核心要点回顾

在这里插入图片描述

概述

net/smtp包是Go语言标准库中一个专门用于实现SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)客户端的包。它提供了一系列的功能,使开发者能够以编程的方式发送电子邮件。通过使用这个包,开发者可以轻松实现邮件的发送功能,包括文本邮件、含附件的邮件或HTML格式的邮件。

在实际开发中,net/smtp包的应用非常广泛,无论是发送系统通知邮件、用户注册验证邮件、还是营销推广邮件等,都可以通过这个包来实现。其强大的功能和灵活性使其成为Go开发者在处理邮件发送任务时的首选库。

本文将全面详细地介绍如何使用net/smtp包,包括基础配置、发送各类型邮件的技术细节以及如何处理常见的错误和问题。通过本文的学习,开发者将能够掌握使用net/smtp包进行高效邮件发送的技能,并应用在实际的项目开发中。

基本配置与初始化

在开始使用net/smtp包发送邮件之前,首先需要进行一些基本的配置和初始化。这些步骤是确保邮件能够正确发送到接收者邮箱的基础。

导入net/smtp

要使用net/smtp包,首先需要在Go程序中导入它:

import (
    "net/smtp"
)

设置SMTP服务器基本信息

发送邮件前,需要设置SMTP服务器的地址和端口。例如,如果你使用的是Google的Gmail服务,其SMTP服务器地址为smtp.gmail.com,端口通常为587(使用TLS时)。

smtpHost := "smtp.gmail.com"
smtpPort := "587"

创建SMTP客户端实例

为了与SMTP服务器建立连接,需要使用smtp包中的Dial函数。此函数需要SMTP服务器的地址和端口组合字符串。

// 连接到SMTP服务器
client, err := smtp.Dial(smtpHost + ":" + smtpPort)
if err != nil {
    log.Fatalf("Failed to connect to the SMTP server: %v", err)
}
defer client.Close()

在建立了连接之后,根据服务器的要求,可能需要进行身份验证。大多数SMTP服务器要求安全的连接,因此,使用StartTLS方法来启用TLS连接是很常见的需求:

// 启用TLS连接
tlsConfig := &tls.Config{
    ServerName: smtpHost,
}
if err := client.StartTLS(tlsConfig); err != nil {
    log.Fatalf("Failed to start TLS: %v", err)
}

身份验证

发送邮件前,需要对客户端进行身份验证。使用net/smtp包的PlainAuth方法可以创建一个使用普通文本方式的认证器:

auth := smtp.PlainAuth("", "your-email@gmail.com", "your-password", smtpHost)

// 登录SMTP服务器
if err := client.Auth(auth); err != nil {
    log.Fatalf("Failed to authenticate: %v", err)
}

这里的PlainAuth需要四个参数:一个身份标识(通常留空即可),用户的邮箱地址,邮箱密码,以及SMTP服务器的主机名。

发送简单文本邮件

一旦完成了net/smtp包的基本配置和身份验证,就可以开始发送简单的文本邮件。这部分将详细介绍如何设置发件人和收件人信息,构建邮件内容,以及使用net/smtp包的SendMail方法发送邮件。

配置发件人信息

在发送邮件时,首先需要定义发件人的邮箱地址。这将作为邮件头部中的From字段。

from := "your-email@gmail.com"

构建邮件头部信息

邮件的头部不仅包含发件人信息,还需要包括收件人、邮件主题等信息。这些信息将按照SMTP协议的标准格式组装成邮件头部。

to := []string{"recipient1@example.com", "recipient2@example.com"}
subject := "Test Email"
header := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n", from, strings.Join(to, ", "), subject)

编写邮件正文

邮件的正文是邮件内容的主体部分,可以是纯文本格式。在这里,我们将简单的文本作为邮件的正文。

body := "Hello, this is a test email from Go application using net/smtp package."
message := header + body

使用SendMail方法发送邮件

最后,使用smtp包中的SendMail函数来发送邮件。这个函数需要SMTP服务器的地址、认证信息、发件人地址、收件人列表和邮件内容。

err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message))
if err != nil {
    log.Fatalf("Failed to send email: %v", err)
}

这个方法将连接到SMTP服务器,进行必要的认证,并发送构建好的邮件内容。如果过程中有任何错误发生,将返回错误信息。

示例代码

将前面的步骤组合成完整的示例:

package main

import (
    "fmt"
    "log"
    "net/smtp"
    "strings"
)

func main() {
    // SMTP服务器信息
    smtpHost := "smtp.gmail.com"
    smtpPort := "587"
    from := "your-email@gmail.com"
    auth := smtp.PlainAuth("", from, "your-password", smtpHost)

    // 邮件内容
    to := []string{"recipient1@example.com", "recipient2@example.com"}
    subject := "Test Email"
    header := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n", from, strings.Join(to, ", "), subject)
    body := "Hello, this is a test email from Go application using net/smtp package."
    message := header + body

    // 发送邮件
    err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message))
    if err != nil {
        log.Fatalf("Failed to send email: %v", err)
    }
}

发送带附件的邮件

发送带附件的邮件稍微复杂一些,因为需要使用MIME(多用途互联网邮件扩展)来格式化邮件内容。这一部分将展示如何构建一个多部分的邮件,包括文本和附件。

邮件多部分格式简介

邮件的多部分格式允许将文本和附件结合在一个邮件体内。这需要使用"mime/multipart"包来构建一个多部分的邮件体,其中每个部分都可以是不同类型的内容。

构建带有附件的邮件体

首先,创建一个multipart.Writer实例,这将用于写入不同的邮件部分。

package main

import (
    "bytes"
    "mime/multipart"
    "net/smtp"
    "os"
    "path/filepath"
)

func main() {
    // 邮件服务器信息和身份验证
    smtpHost := "smtp.gmail.com"
    smtpPort := "587"
    from := "your-email@gmail.com"
    auth := smtp.PlainAuth("", from, "your-password", smtpHost)

    // 创建一个新的缓冲区来存储邮件
    var emailBody bytes.Buffer
    writer := multipart.NewWriter(&emailBody)

接下来,添加一个邮件的文本部分:

    // 添加文本部分
    part, err := writer.CreatePart(textproto.MIMEHeader{"Content-Type": {"text/plain; charset=UTF-8"}})
    if err != nil {
        log.Fatalf("Failed to create part for text: %v", err)
    }
    part.Write([]byte("Hello, this is a test email with attachments from Go application using net/smtp package."))

然后,添加一个或多个附件。假设我们要添加一个图片作为附件:

    // 添加附件
    filePath := "path/to/your/image.jpg"
    file, err := os.Open(filePath)
    if err != nil {
        log.Fatalf("Failed to open file: %v", err)
    }
    defer file.Close()

    part, err = writer.CreatePart(textproto.MIMEHeader{
        "Content-Disposition": {"form-data; name=\"attachment\"; filename=\"" + filepath.Base(filePath) + "\""},
        "Content-Type": {"application/octet-stream"},
    })
    if err != nil {
        log.Fatalf("Failed to create part for attachment: %v", err)
    }
    io.Copy(part, file)

完成所有部分后,关闭writer以完成邮件体的构建:

    writer.Close()

使用SendMail方法发送邮件

最后,使用SMTP客户端的SendMail方法,将包含文本和附件的邮件发送出去。需要设置正确的MIME类型和边界。

    to := []string{"recipient1@example.com"}
    subject := "Email with Attachments"
    header := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=%s\r\n\r\n", from, strings.Join(to, ", "), subject, writer.Boundary())
    message := append([]byte(header), emailBody.Bytes()...)

    // 发送邮件
    err = smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message)
    if err != nil {
        log.Fatalf("Failed to send email: %v", err)
    }
}

这段代码演示了如何发送包含文本和附件的复杂邮件。这是一个功能丰富的邮件发送示例,可以根据实际需要添加更多类型的附件。

发送HTML格式的邮件

发送HTML格式的邮件可以让你的邮件内容更丰富和有吸引力,比如可以包含格式化的文本、链接、图片等。本部分将介绍如何构建HTML邮件,并发送它。

HTML邮件的优势和应用场景

HTML邮件的主要优势在于其多样化的呈现方式。不仅可以提供比纯文本更丰富的信息,还可以通过设计提高用户的阅读体验。常见的应用场景包括商业促销、新闻通讯、客户服务通知等。

构建HTML邮件内容

首先,你需要创建一个HTML的字符串,这将作为邮件的主体内容。在HTML内容中,你可以像在普通的网页中一样使用各种HTML标签。

htmlBody := `
<html>
<head>
  <title>Email Title</title>
</head>
<body>
  <h1>Hello, World!</h1>
  <p>This is a <strong>HTML</strong> email sent from a Go application using net/smtp package.</p>
</body>
</html>
`

嵌入图片和其他资源

在HTML邮件中嵌入图片需要使用CID(Content ID)来引用邮件正文中的多媒体部分。这需要将图片作为邮件的一部分发送,并在HTML中通过CID引用它。

// 创建一个multipart的writer
var emailBody bytes.Buffer
writer := multipart.NewWriter(&emailBody)

// 创建一个HTML部分
part, err := writer.CreatePart(textproto.MIMEHeader{"Content-Type": {"text/html; charset=UTF-8"}})
if err != nil {
    log.Fatalf("Failed to create HTML part: %v", err)
}
part.Write([]byte(htmlBody))

// 添加图片作为附件
filePath := "path/to/your/image.jpg"
file, err := os.Open(filePath)
if err != nil {
    log.Fatalf("Failed to open file: %v", err)
}
defer file.Close()

// 创建图片部分
part, err = writer.CreatePart(textproto.MIMEHeader{
    "Content-Type": {"image/jpeg"},
    "Content-Disposition": {"attachment; filename=\"" + filepath.Base(filePath) + "\""},
    "Content-ID": {"<image1>"},
})
if err != nil {
    log.Fatalf("Failed to create image part: %v", err)
}
io.Copy(part, file)

// 关闭writer
writer.Close()

使用SendMail方法发送HTML邮件

发送HTML邮件的过程与发送带附件的邮件类似。确保设置正确的头部和MIME类型。

to := []string{"recipient1@example.com"}
subject := "HTML Email"
header := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\nMIME-Version: 1.0\r\nContent-Type: multipart/related; boundary=%s\r\n\r\n", from, strings.Join(to, ", "), subject, writer.Boundary())
message := append([]byte(header), emailBody.Bytes()...)

// 发送邮件
err = smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message)
if err != nil {
    log.Fatalf("Failed to send HTML email: %v", err)
}

以上代码示例展示了如何发送一个包含HTML内容和嵌入图片的邮件。这种类型的邮件可以用于各种营销和通讯目的,提供了更加丰富和吸引人的邮件内容。

处理错误与常见问题

在使用net/smtp包发送邮件的过程中,可能会遇到各种错误和问题。这一部分将讨论一些常见的问题,并提供解决方法,确保邮件发送流程的健壮性和可靠性。

错误处理策略

良好的错误处理是确保程序稳定运行的关键。在使用net/smtp进行邮件发送时,应该充分处理可能发生的各种错误情况。

if err != nil {
    log.Printf("An error occurred: %v", err)
    // 可以根据错误类型进行更详细的错误处理
}

net/smtp常见问题及其解决方案

1. 连接超时
  • 问题描述:在尝试连接SMTP服务器时可能会遇到超时问题。
  • 解决方案:检查网络连接,确保SMTP服务器地址和端口配置正确。增加超时时间或使用更稳定的网络连接。
2. 身份验证失败
  • 问题描述:提供的身份验证信息不正确,导致连接被拒绝。
  • 解决方案:确认邮箱账号和密码正确无误,以及SMTP服务器的身份验证设置。
3. 发送附件大小限制
  • 问题描述:尝试发送过大的附件时,可能会被SMTP服务器拒绝。
  • 解决方案:检查并遵守SMTP服务器关于邮件大小的限制。如果必须发送大文件,考虑使用文件分享服务链接而不是直接发送附件。
4. TLS/SSL要求
  • 问题描述:一些SMTP服务器要求加密连接。
  • 解决方案:确保使用StartTLS或相应的SSL连接方法与SMTP服务器建立加密连接。

安全性考虑:如何安全地使用SMTP服务

在使用SMTP服务发送邮件时,保护账户安全和邮件内容安全至关重要。以下是一些安全最佳实践:

  • 使用应用程序专用密码:如果支持,为邮件发送功能配置独立的应用程序密码,而不是使用主账户密码。
  • 启用双因素认证(2FA):为你的邮箱账户启用2FA,提高安全性。
  • 使用加密连接:始终使用TLS或SSL加密发送邮件,防止数据在传输中被窃取。

通过实现上述策略,可以大幅度提高使用SMTP服务发送邮件的安全性和可靠性。

高级技巧与最佳实践

在掌握了net/smtp包基础功能的使用后,接下来将介绍一些高级技巧和最佳实践,以提升邮件发送功能的效率和可维护性。

性能优化建议

1. 使用连接池
  • 为了避免频繁地创建和销毁SMTP连接,可以实现一个连接池,复用已建立的连接。这对于高频率的邮件发送任务尤其重要。
2. 异步发送邮件
  • 邮件发送可以采用异步处理的方式,避免在发送大量邮件时阻塞主程序流程。可以使用Go的goroutine来并行处理邮件发送任务。
3. 批量处理邮件发送
  • 如果需要发送大量相似的邮件(例如通知邮件或月度报告),考虑批量构建和发送邮件,而不是单独发送每一封,可以减少网络请求和服务器负载。

代码重构与维护性提升

1. 模块化邮件构建过程
  • 将邮件构建过程分解成独立的模块或函数,如创建头部信息、正文、附件等,这样不仅代码更清晰,也方便维护和扩展。
2. 使用配置文件管理SMTP设置
  • 把SMTP服务器的地址、端口、用户凭证等配置信息放在外部配置文件中,而不是硬编码在程序中。这样更安全,也便于管理多环境配置。

使用第三方库增强net/smtp功能

虽然net/smtp包提供了基础的邮件发送功能,但在某些复杂场景下,可能需要更多高级功能。可以考虑使用如下第三方库:

  • gomail:提供了更加灵活的邮件构建选项,如更容易地发送带有多个附件的邮件,或构建复杂的邮件体。
  • sendgrid-go:如果使用SendGrid服务,其官方Go库提供了方便的API接入和丰富的邮件处理功能。

真实案例分析

接下来,让我们通过一个真实案例来演示如何整合以上技巧和实践:

假设我们需要为一个在线课程平台实现一个服务,该服务负责发送课程通知和月度报告给数千名用户。我们将使用异步发送和连接池技术来确保服务的高效性和稳定性。邮件内容包括课程更新、专题文章链接以及个性化的学习建议,需要高度定制化且动态生成。

// 示例:使用goroutine异步发送邮件
func sendEmails(users []User, message EmailMessage) {
    sem := make(chan struct{}, 10) // 使用信号量控制并发数
    for _, user := range users {
        sem <- struct{}{}
        go func(u User) {
            defer func() { <-sem }()
            sendEmail(u, message) // sendEmail是发送单个邮件的函数
        }(user)
    }
    // 等待所有goroutine完成
    for i := 0; i < cap(sem); i++ {
        sem <- struct{}{}
    }
}

总结

在本文中,我们详细探讨了使用Go语言标准库net/smtp包发送邮件的各种技术和方法。从基本的邮件发送到处理带附件和HTML内容的复杂邮件,再到实现高级功能和性能优化,我们提供了丰富的示例和建议,旨在帮助开发者有效地利用这个强大的库。

核心要点回顾

  1. 基础使用:我们展示了如何进行SMTP服务器的配置、身份验证以及如何使用SendMail方法发送简单的文本邮件。
  2. 复杂邮件处理:介绍了发送带附件和HTML格式邮件的方法,特别强调了MIME协议在构建邮件中的应用。
  3. 错误处理和安全性:强调了在发送邮件过程中的错误处理的重要性,以及如何安全地使用SMTP服务。
  4. 性能与最佳实践:提供了关于异步邮件发送、使用连接池以及代码重构的高级技巧和建议。

邮件发送是现代应用程序中一个常见的需求,无论是在企业内部通信、自动化系统通知还是客户关系管理中,都扮演着重要角色。我们鼓励开发者不仅仅局限于本文介绍的内容,而应深入探索net/smtp包以外的其他高级库和工具,以更好地满足项目需求。

此外,技术是不断进步的,相关的库和工具也会更新升级。持续的学习和实践是跟上技术发展、提高项目质量和效率的关键。

通过本文的学习,希望你已经能够掌握使用Go语言进行邮件发送的核心技术,并可以在你的项目中灵活应用这些知识。不断实践并探索新的方法,将帮助你成为更加熟练和高效的Go开发者。

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

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

相关文章

硅纪元视角 | 1 分钟搞定 3D 创作,Meta 推出革命性 3D Gen AI 模型

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

服务器之BIOS基础知识总结

1.BIOS是什么&#xff1f; BIOS全称Basic Input Output System&#xff0c;即基本输入输出系统&#xff0c;是固化在服务器主板的专用ROM上&#xff0c;加载在服务器硬件系统上最基本的运行程序&#xff0c;它位于服务器硬件和OS之间&#xff0c;在服务器启动过程中首先运行&am…

《亚马逊搬运亚马逊产品》配合跟卖采集爬取跟卖店铺高质量

亚马逊高质量产品如何搬运&#xff1f;亚马逊采集亚马逊。 哈喽大家好&#xff0c;大家讲一下做亚马逊是发货、铺货这块的功能。目前这款软件做跟卖大家都知道&#xff0c;同时也支持做铺货。铺货可以采集国内的1688、淘宝、京东都可以采&#xff0c;采完之后也可以采速卖通&a…

flutter开发实战-Webview及dispose关闭背景音

flutter开发实战-Webview及dispose关闭背景音 当在使用webview的时候&#xff0c;dispose需要关闭网页的背景音或者音效。 一、webview的使用 在工程的pubspec.yaml中引入插件 webview_flutter: ^4.4.2webview_cookie_manager: ^2.0.6Webview的使用代码如下 初始化WebView…

UiPath+Appium实现app自动化测试

一、环境准备工作 1.1 完成appium环境的搭建 参考&#xff1a;pythonappiumpytestallure模拟器(MuMu)自动化测试环境搭建_appium mumu模拟器-CSDN博客 1.2 完成uipath的安装 登录官网&#xff0c;完成注册与软件下载安装。 UiPath业务自动化平台&#xff1a;先进的RPA及自动…

Linux操作系统学习:day08

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试 目录 day0853、命令和编辑模式之间的切换54、命令模式到末行模式的切换与末行模式下的保存退出命令模式到末行模式的切换保存退出 55、末行模式…

大模型训练优化方法

写在前面 在训练模型尤其是大模型的时候&#xff0c;如何加快训练速度以及优化显存利用率是一个很关键的问题。本文主要参考HF上的一篇文章&#xff1a;https://huggingface.co/docs/transformers/perf_train_gpu_one&#xff0c;以及笔者在实际训练中的一些经验&#xff0c;给…

SpringBoot 整合 Minio 实现文件切片极速上传技术

Centos7安装Minio 创建目标文件夹 mkdir minio使用docker查看目标镜像状况 大家需要注意&#xff0c;此处我们首先需要安装docker&#xff0c;对于相关安装教程&#xff0c;大家可以查看我之前的文章&#xff0c;按部就班就可以&#xff0c;此处不再赘述&#xff01;&#x…

【电商指标详解】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本篇文章主要和大家分享一下电商行业中常见指标的详解&#xff01;存在的原因和作用&#xff01;&#xff01;&#xff01;希望对大家有所帮助。 &#x1f49e;&#x1f49e;代码是你的画…

论文学习笔记1:Federated Graph Neural Networks: Overview, Techniques, and Challenges

文章目录 一、introduction二、FedGNN术语与分类2.1主要分类法2.2辅助分类法 三、GNN-ASSISTED FL3.1Centralized FedGNNs3.2Decentralized FedGNNs 四、FL-ASSISTED GNNS4.1horizontal FedGNNs4.1.1Clients Without Missing Edges4.1.1.1Non-i.i.d. problem4.1.1.2Graph embed…

Navicat和MySQL的安装

1、下载 Navicat Navicat 官网&#xff1a;www.navicat.com.cn/ 在产品中可以看到很多的产品&#xff0c;点击免费试用 Navicat Premium 即可&#xff0c;是一套多连数据库开发工具&#xff0c;其他的只能连接单一类型数据库 点击试用 选择系统直接下载 二、安装 Navicat 安…

天诚长租公寓智能门锁管理解决方案

人才是区域创新发展的第一资源&#xff0c;如何解决人才的住房问题&#xff0c;让人才“流进来”、“留下来”、“融进来”&#xff0c;就需要优先安排优质人才公寓、人才优租房和公共租赁住房房源&#xff0c;并为青年人才群体提供智能化、信息化的租住体验及通行服务。 一、…

Hive查询优化 - 面试工作不走弯路

引言&#xff1a;Hive作为一种基于Hadoop的数据仓库工具&#xff0c;广泛应用于大数据分析。然而&#xff0c;由于其依赖于MapReduce框架&#xff0c;查询的性能可能会受到影响。为了确保Hive查询能够高效运行&#xff0c;掌握查询优化技巧至关重要。在日常工作中&#xff0c;高…

实习总结 --- 其他业务

一. 回归测试&#xff1a;回归测试与测新是对应的&#xff0c;当需求准入交付测试的时候首先要进行的就是测新&#xff0c;也就是对新功能对测试&#xff0c;一般是在sim环境下测试的&#xff1b;当测新通过后才会进行回归测试&#xff0c;回归测试的目的是为了保证老功能的正确…

程序算法设计分析

动态规划和分治、贪心相比有什么区别&#xff1f;各自的优缺点&#xff1f; 分治算法特征&#xff1a; 1&#xff09;规模如果很小&#xff0c;则很容易解决。//一般问题都能满足 2&#xff09;大问题可以分为若干规模小的相同问题。//前提 3&#xff09;利用子问题的解&#x…

订单服务-提交订单业务立即购买业务

文章目录 1、提交订单 业务2、在 OrderController 创建 submitOrder 方法3、 在 OrderServiceImpl 中实现 submitOrder 方法4、根据id查询sku详情&#xff08;service-product"&#xff09;5、查询用户地址保存到订单项中&#xff08;service-user&#xff09;6、删除购物…

从.mat文件中导入数据到simulink进行FFT分析

1. 在matlab中准备数据 .mat 文件中包含时间向量和需要分析的数据 load(fcssiabc061302.mat);提取时间和需要分析的数据 time fcssiabc061302.X.Data; % 时间向量 signal fcssiabc061302.Y(1).Data; % A相电流数据 将数据转换为“structure with time”格式…

Redis(十八) 分布式锁

文章目录 前言什么是分布式锁分布式锁的基本实现引入过期时间引入校验 id引入 lua 脚本引入 watch dog&#xff08;看门狗&#xff09;引入 Redlock 算法 前言 在使用 redis 作为中间件的时候&#xff0c;如果使用单机部署的话&#xff0c;如果这个机器故障的话&#xff0c;那…

优先级队列(堆)学的好,头发掉的少(Java版)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

取证与数据恢复:冷系统分析,实时系统分析与镜像分析之间的过渡办法

天津鸿萌科贸发展有限公司是 ElcomSoft 系列取证软件的授权代理商。 ElcomSoft 系列取证软件 ElcomSoft 系列取证软件支持从计算机和移动设备进行数据提取、解锁文档、解密压缩文件、破解加密容器、查看和分析证据。 计算机和手机取证的完整集合硬件加速解密最多支持10,000计…