当前位置: 首页 > 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;没有大量包含其他语言文本的…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...