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

掌握 Go 语言:使用 net/http/httptrace 包优化HTTP请求

掌握 Go 语言:使用 net/http/httptrace 包优化HTTP请求

    • 介绍
    • net/http/httptrace 包的基础
      • 概述
      • 适用场景
    • 使用httptrace进行网络请求追踪
      • 配置httptrace的基本步骤
      • 示例:创建一个简单的HTTP客户端,使用httptrace监控连接
    • 示例:追踪HTTP请求的生命周期
      • 设置完整的Trace
    • 深入分析HTTP请求细节
      • 如何使用httptrace获取详细的连接信息
      • 示例:利用httptrace诊断网络延迟问题
    • 性能分析与优化
      • `httptrace`在性能优化中的应用
      • 示例:使用httptrace优化HTTP请求处理
    • `httptrace`的高级技巧
      • 自定义Trace以监控特定的网络事件
      • 示例:集成`httptrace`与其他监控工具
    • 错误处理和调试
      • 使用httptrace进行错误诊断和调试
      • 示例:实战中的问题解决
    • 结论
      • 主要优势
      • 实用性

在这里插入图片描述

介绍

在现代软件开发中,网络编程扮演着至关重要的角色。随着应用程序变得越来越依赖于网络通信,开发者需要更有效的工具来监控和优化网络请求。Go语言,作为一门高效的系统编程语言,提供了丰富的标准库来支持网络相关的开发工作。其中,net/http/httptrace包为HTTP请求提供了深入的跟踪能力。

httptrace包的设计目标是使开发者能够钩入HTTP请求的生命周期中的各个阶段,如连接的建立、连接复用的决策、请求的发送等,从而获得关于网络时延、网络错误以及性能瓶颈的详细信息。这种深入的信息获取能力,使得开发者可以对网络请求进行细粒度的分析和优化。

本文旨在全面介绍net/http/httptrace包的用法和技巧。我们将通过具体的代码示例和应用场景,展示如何利用这个工具来监控、分析和优化HTTP网络请求。无论是在开发过程中的调试,还是在生产环境中的性能优化,httptrace都能提供强大的支持。文章的每一部分都将通过实战示例来展示httptrace的应用方法,以帮助读者更好地理解和运用这个工具。

通过本文,您将学习到如何配置和使用httptrace,掌握使用它进行网络请求追踪的技术,以及如何通过这些信息优化您的应用程序。我们将从httptrace的基础开始,逐步深入到更高级的使用技巧。

net/http/httptrace 包的基础

在深入探索 httptrace 的各种实用技巧之前,了解其核心功能和基本工作原理是非常必要的。httptrace 是 Go 语言标准库中 net/http 包的一个扩展,它提供了一组钩子(hooks)来追踪 HTTP 请求的各个阶段。这些钩子可以被用于收集关于请求的详细诊断信息,非常适合需要对网络性能和问题进行深入分析的应用。

概述

httptrace 通过定义一系列的事件钩子,允许开发者在 HTTP 客户端发起请求的不同阶段插入自定义的逻辑。这些钩子包括:

  • GetConn:在客户端准备获取连接时触发。
  • GotConn:当客户端成功获取到连接时触发。
  • PutIdleConn:当连接放回连接池以复用时触发。
  • GotFirstResponseByte:当收到响应的第一个字节时触发。
  • Got100Continue:当服务器返回 100 Continue 状态码,表明客户端应继续发送请求体时触发。
  • DNSStartDNSDone:分别在 DNS 查找开始和结束时触发。
  • ConnectStartConnectDone:分别在 TCP 或其他类型的连接开始建立和建立完成时触发。
  • TLSHandshakeStartTLSHandshakeDone:分别在 TLS 握手开始和完成时触发。

这些事件钩子提供了一个框架,使得开发者可以精确地监控和测量网络请求的性能指标,比如连接时间、响应时间和DNS解析时间。

适用场景

httptrace 的功能尤其适合以下几种场景:

  • 性能监测:通过监测各个阶段的持续时间,开发者可以识别出网络请求过程中的瓶颈。
  • 故障诊断:当网络请求失败或性能低下时,httptrace 可以帮助开发者快速定位问题的根源。
  • 安全审计:追踪 TLS 握手等信息可以帮助确认加密通讯的安全性。

通过这些钩子,开发者不仅能够观察到应用程序与网络之间的交互细节,还能够利用这些信息进行更为精细的系统调优和问题解决。

使用httptrace进行网络请求追踪

要有效地利用 httptrace 来监控和优化网络请求,开发者需要理解如何在实际的 HTTP 请求中配置和使用这些钩子。在这一部分中,我们将通过具体的代码示例展示如何设置 httptrace 并捕获关键的网络事件信息。

配置httptrace的基本步骤

首先,我们需要创建一个 httptrace.ClientTrace 的实例,并将其附加到 http.Request 中。这样,我们就可以在请求执行期间监控各种网络事件。以下是一个基本的设置示例:

package mainimport ("net/http""net/http/httptrace""context""fmt"
)func main() {client := &http.Client{}req, _ := http.NewRequest("GET", "http://example.com", nil)// 创建一个带有 httptrace 的 contexttrace := &httptrace.ClientTrace{GotConn: func(info httptrace.GotConnInfo) {fmt.Println("Got Conn:", info.Conn.LocalAddr())},}ctx := httptrace.WithClientTrace(req.Context(), trace)req = req.WithContext(ctx)// 发送请求_, err := client.Do(req)if err != nil {fmt.Println("Request failed:", err)return}fmt.Println("Request successful")
}

在这个示例中,我们配置了 GotConn 钩子来打印连接信息。每当 http.Client 成功建立连接时,都会调用这个函数。

示例:创建一个简单的HTTP客户端,使用httptrace监控连接

让我们通过一个更复杂的例子来展示如何使用 httptrace 来监控一个完整的 HTTP 请求流程。我们将添加更多的钩子来观察 DNS 解析、TCP 连接以及 TLS 握手的过程:

package mainimport ("net/http""net/http/httptrace""context""fmt"
)func main() {client := &http.Client{}req, _ := http.NewRequest("GET", "https://www.google.com", nil)trace := &httptrace.ClientTrace{DNSStart: func(info httptrace.DNSStartInfo) {fmt.Println("DNS Start: ", info.Host)},DNSDone: func(info httptrace.DNSDoneInfo) {fmt.Println("DNS Done: ", info.Addrs)},ConnectStart: func(network, addr string) {fmt.Println("Connect start: ", addr)},ConnectDone: func(network, addr string, err error) {fmt.Println("Connect done: ", addr, "; error: ", err)},TLSHandshakeStart: func() {fmt.Println("TLS Handshake started")},TLSHandshakeDone: func(state tls.ConnectionState, err error) {fmt.Println("TLS Handshake done; error: ", err)},}ctx = httptrace.WithClientTrace(req.Context(), trace)req = req.WithContext(ctx)// 发送请求_, err := client.Do(req)if err != nil {fmt.Println("Request failed: ", err)return}fmt.Println("Request successful")
}

通过这个示例,我们可以观察到从 DNS 解析开始到 TLS 握手完成的整个过程。这为开发者提供了一个深入了解和优化网络请求性能的机会。

示例:追踪HTTP请求的生命周期

理解 HTTP 请求的每个阶段对于高效地监控和优化网络性能至关重要。通过 httptrace,开发者可以深入了解请求的发送、响应的接收以及连接的管理过程。下面的示例将展示如何通过配置多个事件钩子来获取请求过程中的详细信息。

设置完整的Trace

为了完全追踪一个 HTTP 请求的生命周期,我们需要设置 httptrace 中的多个钩子,以监控从 DNS 解析到请求完成的整个过程。以下是一个完整的示例:

package mainimport ("crypto/tls""net/http""net/http/httptrace""context""fmt"
)func main() {client := &http.Client{}req, _ := http.NewRequest("GET", "https://www.example.com", nil)// 初始化 ClientTracetrace := &httptrace.ClientTrace{DNSStart: func(info httptrace.DNSStartInfo) {fmt.Println("DNS Start: ", info.Host)},DNSDone: func(info httptrace.DNSDoneInfo) {fmt.Println("DNS Done: ", info.Addrs)},ConnectStart: func(network, addr string) {fmt.Println("Connect start: ", addr)},ConnectDone: func(network, addr string, err error) {if err != nil {fmt.Println("Connect failed: ", err)} else {fmt.Println("Connect done: ", addr)}},TLSHandshakeStart: func() {fmt.Println("TLS Handshake started")},TLSHandshakeDone: func(state tls.ConnectionState, err error) {if err != nil {fmt.Println("TLS Handshake failed: ", err)} else {fmt.Println("TLS Handshake successful")}},GotConn: func(info httptrace.GotConnInfo) {fmt.Println("Got Conn: ", info.Conn.RemoteAddr(), " - Reused:", info.Reused)},GotFirstResponseByte: func() {fmt.Println("First response byte received")},Got100Continue: func() {fmt.Println("100 Continue response received")},RequestCompleted: func() {fmt.Println("Request completed")},}ctx := httptrace.WithClientTrace(req.Context(), trace)req = req.WithContext(ctx)// 发送请求resp, err := client.Do(req)if err != nil {fmt.Println("Request failed: ", err)return}defer resp.Body.Close()fmt.Println("Response status: ", resp.Status)
}

这个例子涵盖了从 DNS 解析开始到接收到第一个响应字节,甚至是请求完成的每一个细节。通过这样的追踪,开发者不仅可以验证网络操作的成功与否,还可以详细了解请求的每个阶段所消耗的时间,这对于诊断网络延迟和连接问题非常有帮助。

现在我们将进入如何使用 httptrace 进行深入的网络请求分析,并通过一个实战示例展示如何利用这些信息来诊断网络延迟问题。


深入分析HTTP请求细节

使用 httptrace 提供的钩子,开发者可以获取到关于HTTP请求各阶段的详细数据,这些数据对于理解和改进网络性能至关重要。在本节中,我们将详细介绍如何利用这些数据进行深入的分析,并提供一个实际的例子来展示如何诊断网络延迟问题。

如何使用httptrace获取详细的连接信息

要获取HTTP请求过程中详细的连接信息,可以利用 httptrace 中的多个事件钩子。下面是如何实施的一个示例:

package mainimport ("crypto/tls""net/http""net/http/httptrace""context""fmt""time"
)func main() {client := &http.Client{}req, _ := http.NewRequest("GET", "https://www.example.com", nil)var start, connectStart, dnsStart, tlsStart time.Timetrace := &httptrace.ClientTrace{DNSStart: func(info httptrace.DNSStartInfo) {dnsStart = time.Now()fmt.Println("DNS Start")},DNSDone: func(info httptrace.DNSDoneInfo) {fmt.Printf("DNS Done: %v\n", time.Since(dnsStart))},ConnectStart: func(network, addr string) {if dnsStart.IsZero() {connectStart = time.Now() // 当直接连接时,记录时间}fmt.Println("Connect start")},ConnectDone: func(network, addr string, err error) {fmt.Printf("Connect done: %v\n", time.Since(connectStart))},TLSHandshakeStart: func() {tlsStart = time.Now()fmt.Println("TLS Handshake started")},TLSHandshakeDone: func(state tls.ConnectionState, err error) {fmt.Printf("TLS Handshake done: %v\n", time.Since(tlsStart))},}ctx := httptrace.WithClientTrace(req.Context(), trace)req = req.WithContext(ctx)start = time.Now()// 发送请求resp, err := client.Do(req)if err != nil {fmt.Println("Request failed: ", err)return}defer resp.Body.Close()fmt.Printf("Request completed: %v\n", time.Since(start))fmt.Println("Response status: ", resp.Status)
}

此代码段演示了如何测量从 DNS 解析开始到 TLS 握手完成的整个网络请求周期的时间。这对于诊断网络延迟和优化性能具有重要意义。

示例:利用httptrace诊断网络延迟问题

为了展示如何使用 httptrace 诊断网络延迟问题,我们将模拟一个场景,其中网络请求响应时间异常。通过记录和分析每个阶段的时间,开发者可以确定延迟的来源。

假设我们已经观察到某个服务的响应时间比预期的要长,使用上面的代码,我们可以具体测量 DNS 解析、TCP 连接和 TLS 握手各自所需的时间。如果发现特别长的 DNS 解析时间,可能需要查看 DNS 配置或更换 DNS 服务提供商。如果是连接或握手阶段过长,可能需要检查网络连接或服务器配置。

通过这种方式,httptrace 不仅帮助开发者监控网络状态,还提供了必要的信息来针对具体问题采取行动。

性能分析与优化

httptrace 包不仅能帮助开发者诊断网络问题,还能作为一个强大的工具用于性能优化。通过详细监控 HTTP 请求的各个阶段,开发者可以识别出性能瓶颈,并据此优化代码和网络配置。

httptrace在性能优化中的应用

在实际应用中,httptrace 能够提供关键的性能指标,如连接时间、DNS 解析时间和 TLS 握手时间。这些指标可以帮助开发者找出延迟的根本原因,并采取相应措施来减少延迟,提高应用的响应速度和可靠性。

例如,如果 httptrace 显示 TLS 握手时间过长,可能需要考虑使用更快的加密算法或优化服务器的 SSL/TLS 配置。如果连接时间长,可能需要考虑网络路由问题或增加更多的服务器以提供更好的地理覆盖。

示例:使用httptrace优化HTTP请求处理

让我们通过一个示例来展示如何使用 httptrace 来优化 HTTP 请求处理。在这个示例中,我们将通过调整连接池的配置来优化性能:

package mainimport ("crypto/tls""net/http""net/http/httptrace""context""fmt""time"
)func main() {client := &http.Client{Transport: &http.Transport{MaxIdleConns:        10,IdleConnTimeout:     30 * time.Second,TLSHandshakeTimeout: 10 * time.Second,ExpectContinueTimeout: 1 * time.Second,},}req, _ := http.NewRequest("GET", "https://www.example.com", nil)var start time.Timetrace := &httptrace.ClientTrace{GotConn: func(info httptrace.GotConnInfo) {fmt.Println("Got Conn: ", info.Conn.RemoteAddr(), " - Reused:", info.Reused)},PutIdleConn: func(err error) {if err != nil {fmt.Println("Error putting conn back to idle pool:", err)}},}ctx := httptrace.WithClientTrace(req.Context(), trace)req = req.WithContext(ctx)start = time.Now()// 发送请求resp, err := client.Do(req)if err != nil {fmt.Println("Request failed: ", err)return}defer resp.Body.Close()fmt.Printf("Request completed in %v\n", time.Since(start))fmt.Println("Response status: ", resp.Status)
}

在这个示例中,我们通过调整 http.Transport 的配置,优化了连接管理。例如,增加最大空闲连接数和调整空闲连接超时时间,可以显著提高频繁请求的性能。通过监控 GotConnPutIdleConn 钩子,我们可以看到连接是否被有效复用,以及连接回收是否存在问题。

通过这样的调整和监控,开发者可以实现对 HTTP 客户端行为的精细控制,从而优化应用的整体性能。

httptrace的高级技巧

当开发者熟悉了 httptrace 的基本功能后,可以进一步探索其更高级的使用方法,这些技巧可以帮助更精确地监控和优化HTTP网络请求。

自定义Trace以监控特定的网络事件

通过自定义 httptrace 的钩子,开发者可以监控特定的网络事件,从而更精细地控制和优化网络行为。下面的示例展示了如何自定义一个 Trace,以监控特定的网络连接和请求重定向事件:

package mainimport ("net/http""net/http/httptrace""context""fmt"
)func main() {client := &http.Client{}req, _ := http.NewRequest("GET", "https://www.example.com", nil)trace := &httptrace.ClientTrace{ConnectStart: func(network, addr string) {fmt.Println("Attempting to connect to:", addr)},ConnectDone: func(network, addr string, err error) {if err != nil {fmt.Println("Failed to connect:", err)} else {fmt.Println("Connected to:", addr)}},GotConn: func(info httptrace.GotConnInfo) {fmt.Println("Got connection:", info.Conn.RemoteAddr())},GotFirstResponseByte: func() {fmt.Println("Got first response byte")},}ctx := httptrace.WithClientTrace(req.Context(), trace)req = req.WithContext(ctx)// 发送请求resp, err := client.Do(req)if err != nil {fmt.Println("Request failed: ", err)return}defer resp.Body.Close()fmt.Println("Request successful with status:", resp.Status)
}

示例:集成httptrace与其他监控工具

httptrace 可以和其他监控工具如 Prometheus, Grafana 或者其他 APM (Application Performance Monitoring) 工具集成,以实现更全面的性能监控。下面是一个如何将 httptrace 事件数据推送到 Prometheus 的简化示例:

package mainimport ("net/http""net/http/httptrace""context""fmt""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp""time"
)var (dnsDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{Name:    "dns_duration_seconds",Help:    "DNS resolution duration in seconds.",Buckets: prometheus.LinearBuckets(0.01, 0.05, 10),}, []string{"event"})
)func init() {prometheus.MustRegister(dnsDuration)
}func main() {http.Handle("/metrics", promhttp.Handler())go http.ListenAndServe(":8080", nil)client := &http.Client{}req, _ := http.NewRequest("GET", "https://www.example.com", nil)var dnsStart time.Timetrace := &httptrace.ClientTrace{DNSStart: func(info httptrace.DNSStartInfo) {dnsStart = time.Now()},DNSDone: func(info httptrace.DNSDoneInfo) {dnsDuration.WithLabelValues("dns").Observe(time.Since(dnsStart).Seconds())fmt.Println("DNS Done")},}ctx := httptrace.WithClientTrace(req.Context(), trace)req = req.WithContext(ctx)// 发送请求_, err := client.Do(req)if err != nil {fmt.Println("Request failed:", err)return}fmt.Println("Request successful")
}

这个示例代码设置了一个 Prometheus 监控,用来追踪 DNS 解析时间,并通过 HTTP 服务暴露这些数据。开发者可以通过 Grafana 或其他监控仪表板来实时查看这些性能指标。

错误处理和调试

正确处理和调试网络请求中的错误是保证应用稳定性和性能的关键。httptrace 提供的细致事件钩子使得追踪和定位网络错误成为可能。本节将展示如何使用 httptrace 来检测和解决HTTP请求中的常见错误。

使用httptrace进行错误诊断和调试

利用 httptrace 的钩子,我们可以详细了解请求失败的具体阶段和原因,从而进行针对性的错误处理。以下是一个示例,展示了如何设置错误监测和处理:

package mainimport ("crypto/tls""net/http""net/http/httptrace""context""fmt"
)func main() {client := &http.Client{}req, _ := http.NewRequest("GET", "https://www.example.com", nil)trace := &httptrace.ClientTrace{ConnectStart: func(network, addr string) {fmt.Println("Attempting to connect to:", addr)},ConnectDone: func(network, addr string, err error) {if err != nil {fmt.Println("Connection failed:", err)return}fmt.Println("Connection established to:", addr)},TLSHandshakeStart: func() {fmt.Println("TLS Handshake started")},TLSHandshakeDone: func(state tls.ConnectionState, err error) {if err != nil {fmt.Println("TLS Handshake failed:", err)return}fmt.Println("TLS Handshake successful")},GotConn: func(info httptrace.GotConnInfo) {if !info.Reused {fmt.Println("New connection established")} else {fmt.Println("Connection reused")}},GotFirstResponseByte: func() {fmt.Println("First response byte received")},}ctx := httptrace.WithClientTrace(req.Context(), trace)req = req.WithContext(ctx)// 发送请求resp, err := client.Do(req)if err != nil {fmt.Println("Request failed:", err)return}defer resp.Body.Close()fmt.Println("Request successful with status:", resp.Status)
}

在这个示例中,我们详细追踪了从连接开始到第一个响应字节接收的过程,并在每个阶段打印了相关的状态信息。这种方法尤其有助于在开发过程中快速识别和解决网络连接和TLS握手问题。

示例:实战中的问题解决

进一步,我们可以通过 httptrace 来解决实战中的具体问题。例如,如果一个服务频繁遭遇连接超时,可以通过调整 http.Client 的超时设置,并使用 httptrace 来监测连接尝试和失败的详细情况,从而找到最佳的超时配置。

client := &http.Client{Timeout: 10 * time.Second,Transport: &http.Transport{TLSHandshakeTimeout: 5 * time.Second,},
}

通过设置具体的超时参数,并监测每次连接的持续时间,开发者可以更精确地掌握服务的性能,并进行相应的调整。

结论

在本文中,我们全面探讨了 Go 语言的 net/http/httptrace 包,展示了如何利用它进行深入的网络请求追踪和性能分析。通过具体的代码示例,我们演示了 httptrace 的多种应用,包括基础的网络事件监控、性能优化、错误处理和调试技巧。

主要优势

httptrace 提供了对 HTTP 请求周期中各个阶段的细致监控,包括:

  • DNS 解析
  • TCP 连接
  • TLS 握手
  • 请求发送和响应接收

这些功能使得 httptrace 成为开发者手中的一项强大工具,能够帮助他们:

  • 识别性能瓶颈:通过精确测量各阶段的时间,开发者可以识别并解决性能瓶颈。
  • 诊断网络问题httptrace 提供的详细信息有助于快速定位和解决网络相关的问题。
  • 优化应用性能:通过对网络操作的深入了解,开发者可以优化应用的网络交互,提高总体性能和用户体验。

实用性

通过本文的介绍和示例,开发者应能够有效地利用 httptrace 来增强他们的网络编程能力。无论是在开发阶段调试网络请求,还是在生产环境中优化性能,httptrace 都提供了必要的工具和信息。

在高度依赖网络通信的现代应用开发中,能够掌握如 httptrace 这样的工具,对于提高开发效率和应用性能来说至关重要。希望本文能够帮助您更好地理解和使用 httptrace,为您的项目带来实际的改进和优化。

相关文章:

掌握 Go 语言:使用 net/http/httptrace 包优化HTTP请求

掌握 Go 语言:使用 net/http/httptrace 包优化HTTP请求 介绍net/http/httptrace 包的基础概述适用场景 使用httptrace进行网络请求追踪配置httptrace的基本步骤示例:创建一个简单的HTTP客户端,使用httptrace监控连接 示例:追踪HTT…...

探秘Flask中的表单数据处理

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、Flask中的表单处理机制 三、Flask表单处理实战 四、处理表单数据的注意事项…...

java —— 包装类及拆箱、装箱

java 当中有 8 种基本类型对应其相应的包装类,分别如下: intIntegerbyteByteshortShortlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean 一、装箱 两种装箱方法: public static void main(String[] args) {Integer anew Inte…...

运算符重载(下)

目录 前置和后置重载前置的实现Date& Date::operator()代码 后置的实现Date Date::operator(int )代码 前置--和后置--重载前置--的实现Date& Date::operator--( )代码 后置--的实现Date Date::operator--(int )代码 流插入运算符重载流插入运算符重载的实现流提取运算…...

杭州服务器的性能如何?

挥洒激情,开启杭州服务器的无限可能! 互联网时代,服务器的性能就如同一艘航空母舰,承载着企业的发展梦想,指引着行业的发展方向。而对于杭州服务器,其性能究竟如何?让我来告诉您。 杭州服务器…...

linux centos nfs挂载两台服务器挂载统一磁盘目录权限问题

查看用户id id 用户名另一台为 修改uid和gid为相同id,添加附加组 usermod -u500 -Gwheel epms groupmod -g500 epms...

STL:string

文章目录 标准库中的string类string的构造string的赋值重载string的容量size(length)max_sizeresizereservecapacityclearemptyshink_to_fit string的元素访问operator[] 和 atfront 和 back string的迭代器 和 范围forstring的修改operatorappendpush_backassigninserterasere…...

贷款借钱平台 小额贷款系统开发小额贷款源码 贷款平台开发搭建

这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码51800 数据库替换application/database.php程序采用PHPMySQL,thinkphp框架代码开源,不加密后台效果:手机版效果 这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码…...

软设之算法的效率

算法的效率分为时间复杂度和空间复杂度。 空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小。说白了,就是空间换时间。 比如说计算从123……100的和。一个算法是i(1100)*…...

前端开发(2)--HTML常用的标签

100编程书屋_孔夫子旧书网 HTMl 的标签可以分为单个标签和成对标签。 单个标签&#xff1a;html4 规定单个标签要有一个 / 表示结尾&#xff0c; html5 则不用 <!--单个标签--> <meta> <!--成对标签 --> <div></div>以下是HTMl中常用的一些标签…...

任何图≌自己这一几何最起码常识推翻直线公理让R外标准实数一下子浮出水面

黄小宁 h定理&#xff1a;点集AB≌B的必要条件是A≌B。 证&#xff1a;若AB则A必可恒等变换地变为BA≌A&#xff0c;而恒等变换是保距变换。证毕。 如图所示R轴即x轴各元点x沿x轴正向不保距平移变为点y2x就使x轴沿本身拉伸&#xff08;放大&#xff09;变换为y2x轴不≌x轴&…...

js 纯前端实现数组分页、列表模糊查询、将数组转成formdata格式传给接口

后端返回所有的数据&#xff0c;由前端来实现分页展示、模糊查询&#xff0c;并将数组格式转成formdata格式给后端 1、数组转formdata let formData new FormData()for (let i 0; i < list.length; i) {let item list[i];for (let property in item) {formData.append(…...

elasticsearch有什么用

Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它被广泛用于构建实时的、可扩展的搜索和分析应用程序。以下是Elasticsearch的主要用途和功能&#xff1a;12 全文搜索&#xff1a;Elasticsearch提供强大的全文搜索功能&#xff0c;可以处理大量的文本数据&…...

iOS自动连接已知Wi-Fi功能的实现

首先需要在配置文件申请的时候将hotspot勾选上&#xff0c;之后还要在x-code里添加对应的配置&#xff0c;由于我们并没有用到获取设备周边Wi-Fi的功能&#xff0c;所以就没申请相关权限 相关连接Wi-Fi代码如下&#xff1a; #import <NetworkExtension/NetworkExtension.h&…...

编辑任何场景! 3DitScene:通过语言引导的解耦 Gaussian Splatting开源来袭!

文章&#xff1a;https://arxiv.org/pdf/2405.18424 项目&#xff1a;https://zqh0253.github.io/3DitScene/ huggingface:https://huggingface.co/spaces/qihang/3Dit-Scene 场景图像编辑在娱乐、摄影和广告设计中至关重要。现有方法仅专注于2D个体对象或3D全局场景编辑&…...

CCIG 2024:合合信息文档解析技术突破与应用前景

目录 背景当前大模型训练和应用面临的问题训练Token耗尽训练语料质量要求高LLM文档问答应用中文档解析不精准 合合信息的文档解析技术1. 具备多文档元素识别能力2. 具备版面分析能力3. 高性能的文档解析4. 高精准、高效率的文档解析文档多板式部分示例 文档解析典型技术难点元素…...

关于TeamSpeak3-网易音乐机器人的基础使用方法(胎教级教程)

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 序言&#xff1a;在自己的ts服务器上安装了网易音乐机器人&#xff0c;写这篇文章旨在教群友/网友如何使用机器人!&#x1f60b;&#x1f44d; 一、TS3Audi…...

看广告赚金币提现小游戏app开发源码

开发一个看广告赚金币并可以提现的小游戏APP&#xff0c;源码的搭建涉及到多个方面&#xff0c;包括前端界面设计、后端逻辑处理、数据库管理以及广告平台的对接等。以下是一些建议的步骤和考虑因素&#xff1a; 前端界面设计&#xff1a; 使用HTML5、CSS3和JavaScript等技术…...

【vue】@、@/、../和./的区别

&#xff1a;表示vue语法中v-on的简写&#xff1b;绑定事件的专用格式。当事件触发的时候&#xff0c;函数才会来调用&#xff1b; /&#xff1a;在build文件夹下webpack.base.conf.js找到&#xff0c;便能知道代表什么了; 这里指向src文件夹 . /&#xff1a;表示当前目录下&…...

imx93 uboot 构建

1. 信息来源 从 nxp 的英文网站中可以找到 imx93 的构建信息&#xff0c;当前的最新版本为&#xff1a;Linux 6.6.3_1.0.0 # 网址如下&#xff1a; https://www.nxp.com/design/design-center/software/embedded-software/i-mx-software/embedded-linux-for-i-mx-application…...

视觉SLAM十四讲:从理论到实践(Chapter7:视觉里程计1)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 一、目标 1.理解图像特征点的意义&#xff0c;并掌握在单幅图像中提取特征点及多幅图像中匹配特征点的方法。 2.理解对极几何的原理&#xff0c;利用对极几何的约束&…...

c++指针的*

1.*运算符 *运算符被称为间接值&#xff08;indirect value&#xff09;或者解除引用&#xff08;dereferencing&#xff09;运算符 将其应用于指针可以得到该地址处存储的值 由于 * 也有乘法的意思&#xff0c;c通过上下文来确定是乘法还是解除引用 2.如何声明和初始化指针 …...

快团团大团长帮卖团长团长如何获得物流查询码?

一、功能说明 团长可自行生成物流查询码&#xff0c;直接将码发给顾客&#xff0c;顾客扫码可查询自己订单的物流状态&#xff01; 用户扫码后&#xff0c;会出现用户在该团长处下单的所有快递订单。团员可查看该订单物流信息、进行退款申请&#xff0c;或直接联系团长。 二…...

MySQL(二)基本SQL语句以及基本函数应用

1、基本SQL语句 MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 - 函数应用在sql语句中 -- 临时表 select now() from dual;-- 数学函数 二进制 -- 返回x的绝对值 select a…...

fyne apptab布局

fyne apptab布局 AppTabs 容器允许用户在不同的内容面板之间切换。标签要么只是文本&#xff0c;要么是文本和一个图标。建议不要混合一些有图标的标签和一些没有图标的标签。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/container"//&…...

Python实现定时任务的方式

大家好&#xff0c;在当今数字化的时代&#xff0c;定时任务的需求在各种应用场景中频繁出现。无论是数据的定时更新、周期性的任务执行&#xff0c;还是特定时间点的操作触发&#xff0c;Python 都为我们提供了强大而灵活的手段来实现这些定时任务。当我们深入探索 Python 的世…...

微信小程序-网络数据请求(配置request合法域名)

1.小程序中网络数据请求的限制 出于安全方面的考虑&#xff0c;小程序官方对数据接口的请求做出了如下两个限制&#xff1a; &#xff08;1&#xff09;只能请求HTTPS类型的接口 &#xff08;2&#xff09;必须将接口的域名添加到信任列表中 如果要请求某个域名下的接口&am…...

栈和队列题目练习

本节小编选了两道题来加深对栈和队列的认识理解&#xff01; 有效的括号 方法1&#xff1a;直接用栈的结构&#xff08;动态数组&#xff09; 本题可以用栈这个结构来解答&#xff0c;将(,{,[ 左括号压入栈中&#xff0c;然后取出栈顶元素与右括号),},]匹配。不匹配的话&…...

【排列问题】

问题&#xff1a; 已知某序列有n个元素&#xff0c;请编写程序打印出包含该序列所有元素的所有排列。 输入要求&#xff1a; 输入第1行为整数n&#xff0c;表示该序列元素的个数&#xff1b;第2行为n个整数&#xff0c;表示需要排列的序列元素。 输出要求&#xff1a;输出若…...

token 无感刷新

什么是 token 无感刷新&#xff1f;为什么需要 token 无感刷新&#xff1f;让我们想象一下有这么个场景&#xff1a;你登录一个系统成功后&#xff0c;玩了 10 分钟&#xff0c;发现登录失效了&#xff0c;又要你重新登录&#xff0c;然后又过 10 分钟&#xff0c;又失效了&…...