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

Go面试题学习

1.并发安全性

Go语言中的并发安全性是什么?如何确保并发安全性?

并发安全性是指在并发编程中,多个goroutine对共享资源的访问不会导致数据竞争和不确定的结果。

使用互斥锁(Mutex):通过使用互斥锁来保护共享资源的访问,一次只允许一个goroutine访问共享资源,从而避免竞争条件。
使用原子操作(Atomic Operations):对于简单的读写操作,可以使用原子操作来保证操作的原子性,避免竞争条件。
使用通道(Channel):通过使用通道来进行goroutine之间的通信和同步,避免共享资源的直接访问。
使用同步机制:使用同步机制如等待组(WaitGroup)、条件变量(Cond)等来协调多个goroutine的执行顺序和状态。

2.defer

Go语言中的defer关键字有什么作用?请给出一个使用defer的示例。

defer关键字用于延迟函数的执行,即在函数退出前执行某个操作。defer通常用于释放资源、关闭文件、解锁互斥锁等清理操作,以确保在函数执行完毕后进行处理。也可以使用defer语句结合time包实现函数执行时间的统计。

package mainimport ("fmt""os"
)func main() {file, err := os.Open("file.txt")if err != nil {fmt.Println(err)return}defer func() {err := file.Close()if err != nil {fmt.Println(err)}}()}

在上述代码中,我们使用defer关键字延迟了文件的关闭操作,确保在函数执行完毕后关闭文件。这样可以避免忘记关闭文件而导致资源泄漏。

3.指针

Go语言中的指针有什么作用?请给出一个使用指针的示例。

指针是一种变量,存储了另一个变量的内存地址。通过指针,我们可以直接访问和修改变量的值,而不是对变量进行拷贝。

package mainimport ("fmt"
)func swap(a, b *int) {temp := *a*a = *b*b = temp
}func main() {x := 10y := 20fmt.Println(x, y)swap(&x, &y)fmt.Println(x, y)
}

定义了一个swap函数,接收两个指针作为参数,并通过指针交换了两个变量的值。在主函数中,我们通过取地址操作符&获取变量的指针,并将指针传递给swap函数。通过使用指针,实现了变量值的交换。

4.map

Go语言中的map是什么?请给出一个使用map的示例。

map是一种无序的键值对集合,也称为字典。map中的键必须是唯一的,而值可以重复。map提供了快速的查找和插入操作,适用于需要根据键快速检索值的场景

package mainimport ("fmt"
)func main() {grades := make(map[string]int)grades["joyous"] = 90grades["tom"] = 80grades["lily"] = 85joyousGrades := grades["joyous"]tomGrades := grades["tom"]lilyGrades := grades["lily"]fmt.Println(joyousGrades)fmt.Println(tomGrades)fmt.Println(lilyGrades)
}

使用make函数创建了一个map,键的类型为string,值的类型为int。然后,通过键来添加学生的成绩信息,并通过键来获取学生的成绩。通过使用map,可以根据学生的姓名快速查找对应的成绩。

5.map的有序遍历

map是无序的,每次迭代map的顺序可能不同。如果需要按特定顺序遍历map,应该怎么做呢?

在Go语言中,map是无序的,每次迭代map的顺序可能不同。如果需要按特定顺序遍历map,可以采用以下步骤:
创建一个切片来保存map的键。
遍历map,将键存储到切片中。
对切片进行排序。
根据排序后的键顺序,遍历map并访问对应的值。

package mainimport ("fmt""sort"
)func main() {m := map[string]int{"c": 4,"b": 3,"a": 2,}keys := make([]string, 0, len(m))for k := range m {keys = append(keys, k)}sort.Strings(keys)for _, k := range keys {fmt.Println(k, m[k])}
}

创建了一个map m,其中包含了键值对。然后,创建了一个切片 keys,并遍历map将键存储到切片中。接下来,对切片进行排序,使用sort.Strings函数对切片进行升序排序。最后,根据排序后的键顺序遍历map,并访问对应的值。使用sort.Sort(sort.Reverse(sort.StringSlice(keys)))进行降序排序。

6.切片和数组

Go语言中的slice和数组有什么区别?请给出一个使用slice的示例。

在Go语言中,数组和切片(slice)都是用于存储一组相同类型的元素。它们的区别在于长度的固定性和灵活性。数组的长度是固定的,而切片的长度是可变的。

package mainimport ("fmt"
)func main() {number := []int{1, 2, 3, 4, 5, 6}number = append(number, 7)number = append(number, 8, 9)fmt.Println(number)
}

使用[]int语法创建了一个切片numbers,并初始化了一些整数。然后,使用append函数向切片中添加元素。通过使用切片,可以动态地添加和删除元素,而不需要事先指定切片的长度。切片是基于数组的一种封装,它提供了更便捷的操作和灵活性。切片的底层是一个指向数组的指针,它包含了切片的长度和容量信息

7.切片移除元素

怎么移除切片中的数据?

要移除切片中的数据,可以使用切片的切片操作或使用内置的append函数来实现。以下是两种常见的方法:

1. 使用切片的切片操作:

利用切片的切片操作,可以通过指定要移除的元素的索引位置来删除切片中的数据。

例如,要移除切片中的第三个元素,可以使用切片的切片操作将切片分为两部分,并将第三个元素从中间移除。

package mainimport ("fmt"
)func main() {number := []int{1, 2, 3, 4, 5, 6}index := 2number = append(number[:index], number[index+1:]...)fmt.Println(number)
}

使用切片的切片操作将切片分为两部分:numbers[:indexToRemove]表示从开头到要移除的元素之前的部分,numbers[indexToRemove+1:]表示从要移除的元素之后到末尾的部分。然后,使用append函数将这两部分重新连接起来,从而实现了移除元素的操作

2. 使用append函数

:使用append函数,将要移除的元素之前和之后的部分重新组合成一个新的切片。这种方法更适用于不知道要移除的元素的索引位置的情况。

package mainimport ("fmt"
)func main() {number := []int{1, 2, 3, 4, 5, 6}index := 5for i := 0; i < len(number); i++ {if number[i] == index {number = append(number[:i], number[i+1:]...)break}}fmt.Println(number)
}

使用for循环遍历切片,找到要移除的元素的索引位置。一旦找到匹配的元素,使用append函数将要移除的元素之前和之后的部分重新连接起来,从而实现了移除元素的操作。

8.panic和recover

Go语言中的panic和recover有什么作用?请给出一个使用panic和recover的示例。

panic和recover是Go语言中用于处理异常的机制。当程序遇到无法处理的错误时,可以使用panic引发一个异常,中断程序的正常执行。而recover用于捕获并处理panic引发的异常,使程序能够继续执行。

package mainimport ("fmt"
)func divide(a, b int) int {defer func() {if err := recover(); err != nil {fmt.Println(err)}}()if b == 0 {panic("异常处理")}return a / b
}func main() {result := divide(10, 0)fmt.Println(result)
}

定义了一个divide函数,用于执行除法运算。在函数中,我们使用panic关键字引发一个异常,当除数为零时,会引发一个"异常处理"的异常。然后,使用defer和recover来捕获并处理这个异常,打印出错误信息。通过使用recover,可以避免程序因为异常而崩溃,而是继续执行后续的代码。

9.互斥锁

什么是互斥锁(Mutex)?在Go语言中如何使用互斥锁来保护共享资源?

互斥锁是一种并发编程中常用的同步机制,用于保护共享资源的访问。
在Go语言中,可以使用sync包中的Mutex类型来实现互斥锁。通过调用Lock方法来获取锁,保护共享资源的访问,然后在使用完共享资源后调用Unlock方法释放锁。

package mainimport ("fmt""sync"
)var (mutex  sync.Mutexcounts int
)func increment() {mutex.Lock()counts++mutex.Unlock()
}func main() {var wang sync.WaitGroupfor i := 0; i < 100; i++ {wang.Add(1)go func() {defer wang.Done()increment()}()}wang.Wait()fmt.Println(counts)
}

定义了一个全局变量counter和一个sync.Mutex类型的互斥锁mutex。在increment函数中,我们使用mutex.Lock()获取锁,对counter进行递增操作,然后使用mutex.Unlock()释放锁。通过使用互斥锁,确保了对counter的并发访问的安全性。

10.自旋

解释一下并发编程中的自旋状态?

自旋状态是并发编程中的一种状态,指的是线程或进程在等待某个条件满足时,不会进入休眠或阻塞状态,而是通过不断地检查条件是否满足来进行忙等待。
在自旋状态下,线程会反复执行一个忙等待的循环,直到条件满足或达到一定的等待时间。 这种方式可以减少线程切换的开销,提高并发性能。然而,自旋状态也可能导致CPU资源的浪费,因为线程会持续占用CPU时间片,即使条件尚未满足。
自旋状态通常用于以下情况:
在多处理器系统中,等待某个共享资源的释放,以避免线程切换的开销。
在短暂的等待时间内,期望条件能够快速满足,从而避免进入阻塞状态的开销。
需要注意的是,自旋状态的使用应该谨慎,并且需要根据具体的场景和条件进行评估。如果自旋时间过长或条件不太可能很快满足,那么使用自旋状态可能会浪费大量的CPU资源。在这种情况下,更适合使用阻塞或休眠等待的方式。
总之,自旋状态是一种在等待条件满足时不进入休眠或阻塞状态的并发编程技术。它可以减少线程切换的开销,但需要权衡CPU资源的使用和等待时间的长短。

11.原子操作和锁

原子操作和锁的区别是什么?

原子操作和锁是并发编程中常用的两种同步机制,它们的区别如下:
1、作用范围:
原子操作(Atomic Operations):原子操作是一种基本的操作,可以在单个指令级别上执行,保证操作的原子性。原子操作通常用于对共享变量进行读取、写入或修改等操作,以确保操作的完整性。
锁(Lock):锁是一种更高级别的同步机制,用于保护临界区(Critical Section)的访问。锁可以用于限制对共享资源的并发访问,以确保线程安全。
2、使用方式:
原子操作:原子操作是通过硬件指令或特定的原子操作函数来实现的,可以直接应用于变量或内存位置,而无需额外的代码。
锁:锁是通过编程语言提供的锁机制来实现的,需要显式地使用锁的相关方法或语句来保护临界区的访问。
3、粒度:
原子操作:原子操作通常是针对单个变量或内存位置的操作,可以在非常细粒度的层面上实现同步。
锁:锁通常是针对一段代码或一组操作的访问进行同步,可以控制更大粒度的临界区。
4、性能开销:
原子操作:原子操作通常具有较低的性能开销,因为它们是在硬件级别上实现的,无需额外的同步机制。
锁:锁通常具有较高的性能开销,因为它们需要进行上下文切换和线程同步等操作。

综上所述,原子操作和锁是两种不同的同步机制,用于处理并发编程中的同步问题。原子操作适用于对单个变量的读写操作,具有较低的性能开销。而锁适用于对一段代码或一组操作的访问进行同步,具有更高的性能开销。选择使用原子操作还是锁取决于具体的场景和需求。
需要注意的是,原子操作通常用于对共享变量进行简单的读写操作,而锁更适用于对临界区的访问进行复杂的操作和保护。在设计并发程序时,需要根据具体的需求和性能要求来选择合适的同步机制。

12.Goroutine

Go语言中的goroutine是什么?请给出一个使用goroutine的示例。

goroutine是Go语言中轻量级的并发执行单元,可以同时执行多个goroutine,而不需要显式地管理线程的生命周期。goroutine由Go运行时(runtime)进行调度,可以在并发编程中实现并行执行。

package mainimport ("fmt""sync"
)func fiboacci(n int, wg *sync.WaitGroup) {defer wg.Done()x, y := 0, 1for i := 0; i < n; i++ {fmt.Printf("%d ", x)x, y = y, x+y}
}func main() {var wang sync.WaitGroupwang.Add(2)go fiboacci(10, &wang)go fiboacci(5, &wang)wang.Wait()
}

使用go关键字启动了两个goroutine,分别计算斐波那契数列的前10个和前5个数字。通过使用goroutine,可以并行地执行这两个计算任务,而不需要显式地创建和管理线程。

13.通道

Go语言中的通道(channel)是什么?请给出一个使用通道的示例。

通道是用于在goroutine之间进行通信和同步的机制。通道提供了一种安全的、阻塞的方式来发送和接收数据。通过通道,可以实现多个goroutine之间的数据传递和同步。

package mainimport ("fmt"
)func sums(a, b int, c chan int) {result := a + bc <- result
}func main() {c := make(chan int)go sums(10, 30, c)result := <-cfmt.Println(result)
}

定义了一个sum函数,用于计算两个数的和,并将结果发送到通道c中。在main函数中,创建了一个整型通道c,然后启动一个goroutine来执行sum函数,并将结果发送到通道中。最后,通过从通道中接收结果,获取计算的和并打印出来。

通过使用通道,实现了goroutine之间的数据传递和同步。在示例中,通道c用于将计算结果从goroutine发送到主goroutine,实现了数据的传递和同步。

14.select

Go语言中的select语句是什么?请给出一个使用select语句的示例。

select语句是Go语言中用于处理通道操作的一种机制。它可以同时监听多个通道的读写操作,并在其中任意一个通道就绪时执行相应的操作。

package mainimport ("fmt"
)func main() {ch1 := make(chan int)ch2 := make(chan int)go func() {ch1 <- 100}()go func() {ch2 <- 60}()select {case num := <-ch1:fmt.Println("ch1: ", num)case num := <-ch2:fmt.Println("ch2: ", num)}}

创建了两个整型通道ch1和ch2。然后,启动了两个goroutine,分别向通道ch1和ch2发送数据。在主goroutine中,使用select语句监听这两个通道的读操作,并在其中任意一个通道就绪时执行相应的操作。在示例中,从就绪的通道中接收数据,并打印出来。

通过使用select语句,我们可以实现对多个通道的并发操作,并根据就绪的通道执行相应的操作。这在处理并发任务时非常有用。

15.协程和通道

Go语言如何通过goroutine和channel实现并发的?请给出一个并发编程的示例。

Go语言通过goroutine和channel实现并发。goroutine是一种轻量级的线程,可以同时执行多个goroutine,而不需要显式地管理线程的生命周期。

package mainimport ("fmt"
)func fibonacci(n int, c chan int) {x, y := 0, 1for i := 0; i < n; i++ {c <- xx, y = y, x+y}close(c)
}func main() {c := make(chan int)go fibonacci(10, c)for num := range c {fmt.Println(num)}}

使用goroutine启动了一个计算斐波那契数列的函数,并通过channel进行通信。主函数从channel中接收计算结果并打印。通过goroutine和channel的结合,实现了并发计算斐波那契数列的功能。

16.runtime

Go语言中的runtime包是用来做什么的?请给出一个使用runtime包的示例。

runtime包是Go语言的运行时系统,提供了与底层系统交互和控制的功能。它包含了与内存管理、垃圾回收、协程调度等相关的函数和变量。

package mainimport ("fmt""runtime"
)func main() {num := runtime.NumGoroutine()fmt.Println(num)
}

17.垃圾回收

Go语言中的垃圾回收是如何工作的?请给出一个使用垃圾回收的示例。

Go语言中的垃圾回收器(Garbage Collector)是自动管理内存的机制,用于回收不再使用的内存。垃圾回收器会自动检测不再使用的对象,并释放其占用的内存空间。

package mainimport ("fmt""runtime""time"
)func createObj() {for i := 0; i < 100; i++ {_ = make([]byte, 1024)}
}func main() {createObj()time.Sleep(time.Second) //等待垃圾回收器执行 	 	var starts runtime.MemStatsruntime.ReadMemStats(&starts)fmt.Println(starts.Alloc)
}

通过循环创建了大量的临时对象。然后,使用time.Sleep函数等待垃圾回收器执行。最后,使用runtime.ReadMemStats函数读取内存统计信息,并打印出已分配的内存大小。

通过使用垃圾回收器,我们可以自动管理内存,避免手动释放不再使用的对象。垃圾回收器会在适当的时机自动回收不再使用的内存,从而提高程序的性能和可靠性。

相关文章:

Go面试题学习

1.并发安全性 Go语言中的并发安全性是什么&#xff1f;如何确保并发安全性&#xff1f; 并发安全性是指在并发编程中&#xff0c;多个goroutine对共享资源的访问不会导致数据竞争和不确定的结果。 使用互斥锁&#xff08;Mutex&#xff09;&#xff1a;通过使用互斥锁来保护…...

SQL效率-查询条件需避免使用函数处理索引字段

一个sql效率的问题 问题 假设created_at 是date类型、是索引&#xff0c;那么以下2种方式有没效率差异&#xff1a; WHERE TO_CHAR(created_at, ‘YYYY-MM-DD’) ‘2020-02-01’WHERE created_at TO_DATE(‘2020-02-01’ , ‘YYYY-MM-DD’) DBA回复 有的&#xff0c;第一…...

【Spring 篇】Spring:轻松驾驭 Java 世界的利器

在 Java 开发领域&#xff0c;Spring 框架无疑是一颗璀璨的明星&#xff0c;它不仅提供了全面的企业级特性&#xff0c;还为开发者提供了简便而强大的开发方式。本文将深入探讨 Spring 框架的简介、配置和快速入门&#xff0c;带你轻松驾驭 Java 世界的利器。 Spring 简介 Sp…...

八个LOGO素材网站推荐分享

即时设计资源广场 在UI界面设计中&#xff0c;为了找到合适的图标icon&#xff0c;你有没有尝试过翻遍整个网络&#xff0c;找到自己想要的&#xff0c;却无法下载或收费使用&#xff1f;最后&#xff0c;只收集图标icon材料需要半天时间。专业设计师使用的图标icon设计材料“…...

React格式化规范

React并没有特定的格式要求&#xff0c;它允许开发者根据自己的喜好和项目需求来选择代码的格式化风格。然而&#xff0c;在React社区中有一些常见的约定和最佳实践&#xff0c;以下是一些常用的格式化规范和建议&#xff1a; 缩进&#xff1a;使用2个或4个空格来进行缩进&…...

如何利用Conda管理多种虚拟环境与Jupyter Notebook内核切换

写在开头 在数据科学与机器学习领域,项目之间可能存在不同的依赖关系和版本要求。为了有效管理这些差异,使用虚拟环境成为一种标准实践。本文将介绍如何利用Conda这一强大的环境管理工具,结合Jupyter Notebook,使得在不同项目之间灵活切换变得轻而易举。 2. Conda简介 2…...

博客摘录「 什么是QPS、TPS、吞吐量?- 高并发名词概念」2024年1月5日

1.什么是高并发&#xff1f; 高并发&#xff08;High Concurrency&#xff09;。通常是指系统在短时间内的大量操作。 高并发相关的常见指标有&#xff1a;QPS、TPS、吞吐量、并发数等。 2.QPS&#xff08;Query Per Second&#xff09; QPS每秒查询率&#xff0c;是指系统…...

PTA——逆序的三位数

程序每次读入一个正3位数&#xff0c;然后输出按位逆序的数字。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如输入700&#xff0c;输出应该是7。 输入格式&#xff1a; 每个测试是一个3位的正整数。 输出格式&#xff1a; 输出按位逆序…...

ChatGPT怎么帮我上班的

1.解放生产力 1&#xff09;标准格式&#xff0c;完美输出。GPT对于公文等具有一定标准格式的文件&#xff0c;可以进行完美仿写&#xff0c;随随便便以假乱真那都是小菜一碟&#xff0c;这对于经常要开展规范成文的人来说&#xff0c;简直就是个福音&#xff0c;只要前期调教…...

WPF 漂亮长方体、正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、正方体的方法源代码

这段XAML代码在WPF中实现了一个类似长方体视觉效果的图形 声明式绘制&#xff1a;通过Path、PathGeometry和PathFigure等元素组合&#xff0c;能够以声明方式精确描述长方体每个面的位置和形状&#xff0c;无需编写复杂的绘图逻辑&#xff0c;清晰直观。 层次结构与ZIndex控制…...

Nginx(十三) 配置文件详解 - 反向代理(超详细)

本篇文章主要讲ngx_http_proxy_module和ngx_stream_proxy_module模块下各指令的使用方法。 1. 代理请求 proxy_pass 1.1 proxy_pass 代理请求 Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except 设置代理服务器的协议和地址以…...

谷歌浏览器启用实时字幕功能

在 Chrome 中使用“实时字幕”功能 - Google Chrome帮助 在 Chrome 中使用“实时字幕”功能 从计算机上的 Chrome 浏览器中&#xff0c;您可以使用“实时字幕”功能自动为视频、播客、游戏、直播、视频通话或其他音频媒体生成字幕。音频和字幕均在本地处理&#xff0c;并会保…...

php接口优化 使用curl_multi_init批量请求

PHP使用CURL同时抓取多个URL地址 抓取多个URL地址是Web开发中常见的需求&#xff0c;使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址&#xff0c;并提供具体的代码案例和注释。 curl库介绍 curl是一个常用的开源网络传输工具&…...

联邦拜占庭共识算法的工作流程

1 前言 联邦拜占庭共识算法&#xff08;Federated Byzantine Agreement&#xff0c;简称FBA&#xff09;是一种解决分布式系统中拜占庭问题的共识算法&#xff0c;是拜占庭容错共识算法里的其中一种&#xff0c;主要应用于区块链技术中。这种算法允许系统内部的各种节点自由进…...

国家开放大学形成性考核 统一考试 学习资料参考

试卷代号&#xff1a;11119 机械CAD/CAM 参考试题 一、单项选择题&#xff08;从所给的四个选项中&#xff0c;找出你认为是正确的答案&#xff0c;将其编号填入括号内。每小题3分&#xff0c;共45分&#xff09; 1.下述CAD/CAM过程的概念中&#xff0c;属于CAM范畴的是&am…...

2401C++,实现文件服务器和聊天室

文件服务器 使用yalantinglibs,几行代码开发静态文件服务器 最近的workshop上的一个任务,就是实现一个文件服务器,只要设置下载目录之后,就可下载目录里面的文件. 看看用yalantinglibs怎么实现一个静态文件服务器的吧. coro_http::coro_http_server server(1, 9001); server.…...

【ESP-NOW 入门(ESP32 with Arduino IDE)】

ESP-NOW 入门(ESP32 with Arduino IDE) 1. 前言2. Arduino集成开发环境3. ESP-NOW 简介3.1 ESP-NOW 支持以下功能:3.2 ESP-NOW 技术还存在以下局限性:4. ESP-NOW 单向通信4.1 一个 ESP32 开发板向另一个 ESP32 开发板发送数据4.2 一个“主”ESP32 向多个 ESP32“slave”发送…...

PHP序列化总结2--常见的魔术方法

魔术方法的概念 PHP的魔术方法是一种特殊的方法&#xff0c;用于覆盖PHP的默认操作。它们以双下划线&#xff08;__&#xff09;开头&#xff0c;后面跟着一些特定的字符串&#xff0c;如__construct()、__destruct()、__get()等。这些魔术方法在对象执行特定操作时被自动调用…...

Docker 入门 ------容器互通以及Dockerfile

1. 端口映射以及容器互联 Docker 除了通过网络访问&#xff0c;还提供了两种很方便的功能来满足服务访问的基本需求&#xff1a; 允许映射容器内应用的服务端口到本地宿主主机互联机制实现多个容器间通过容器名来快速访问 1.1 容器映射实现访问容器 1.1.1 从外部访问容器应…...

AI绘图模型不会写字的难题解决了

介绍 大家好&#xff0c;最近有个开源项目比较有意思&#xff0c;解决了图像中不支持带有中文的问题。 https://github.com/tyxsspa/AnyText。 为什么不能带有中文&#xff1f; 数据集局限 Stable Diffusion的训练数据集以英文数据为主&#xff0c;没有大量包含其他语言文本的…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...