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

golang面试题

目录

go版本新增功能

Go 1.11

Go 1.18

Go 1.5

go关键字 :

1. 用于声明的关键字

2. 控制流关键字

3. 包相关关键字

4. 并发相关关键字

5. 异常处理关键字

6. 接口和类型断言关键字

go数据类型: 

复合数据类型

引用数据类型

接口类型

GC垃圾回收机制

工作流程

采用的方法

触发时机

 深拷贝与浅拷贝

 函数和方法的区别:

 Go函数参数传递到底是值传递还是引用传递

为什么map遍历是无序的:

 slice扩容机制

 方法值类型接收者和指针类型接收者的区别

 go的互斥锁抢锁的两种模式(sync.Mutex)

正常模式

饥饿模式

 goroutine和线程的区别

1. 内存占用

2. 创建销毁开销

3. 调度

4. 通信

5. 并发规模

 goroutine泄露

原因

危害

解决办法

 GMP调度原理

基本概念

调度流程

1. 启动阶段

2. 创建 Goroutine

3. 调度执行

4. 阻塞和唤醒

5. 系统调用

调度优势

 什么是通道,它的底层是什么

通道是什么

通道底层结构

 生产者和消费者怎么关闭管道

基本规则

不同场景关闭方式

 如何检测通道关闭

 通道和锁的区别

设计理念

使用场景

并发控制

代码复杂度

性能表现

 数组和切片的区别

 定义和长度特性

内存分配

长度和容量

使用灵活性


go版本新增功能

Go 1.11 、Go 1.18、Go 1.5

Go 1.11

  • 核心亮点:正式推出了模块(Module)系统,这是 Go 语言依赖管理的重大变革。在此之前,Go 语言的依赖管理比较混乱,模块系统的引入解决了依赖管理的难题,使得 Go 项目的依赖管理更加简单、可靠和可复现。
  • 其他特性:支持 WebAssembly(Wasm),允许 Go 代码在浏览器和其他支持 Wasm 的环境中运行,拓宽了 Go 语言的应用场景

Go 1.18

  • 核心亮点:这一版本最大的亮点是引入泛型,这是 Go 语言发展历程中的一个重大里程碑。泛型允许开发者编写与具体类型无关的代码,极大提高了代码复用性,减少了代码冗余。例如,开发者可以编写一个通用的排序函数,用于对不同类型的切片进行排序,而无需为每种类型都编写一个特定的排序函数。
    // 泛型函数:返回两个同类型值中的最大值
    func Max[T int | float64](a, b T) T {if a > b {return a}return b
    }
  • 其他特性:还引入了模糊测试(Fuzzing)功能,帮助开发者更有效地发现代码中的潜在漏洞;工作区模式(Workspace Mode)则方便了多模块项目的管理;切片扩容机制也得到了优化,提升了内存使用效率和性能。

Go 1.5

  • 核心亮点:实现了自举(Self - Bootstrapping),即 Go 编译器完全用 Go 语言重写,摆脱了对 C 语言的依赖。这不仅简化了 Go 语言的编译过程,也让 Go 语言的开发和维护更加独立和灵活。
  • 其他特性:引入了全新的垃圾回收器(GC),大幅降低了垃圾回收时的停顿时间,提高了程序的响应性能和吞吐量。同时,Go 运行时(runtime)的调度器也得到了改进,优化了 goroutine 的调度算法,提高了并发性能。

go关键字 

1. 用于声明的关键字
  • var:用于声明变量,如 var num int = 10
  • const:用于声明常量,如 const Pi = 3.14
  • type:用于声明自定义类型,如 type Person struct { Name string; Age int }
  • func:用于声明函数,如 func add(a, b int) int { return a + b }
2. 控制流关键字
  • ifelseelse if:用于条件判断。
  • for:用于循环操作,Go 语言中只有 for 一种循环结构,但可实现多种循环形式。
  • switchcasedefault:用于多条件分支判断。
  • break:用于跳出循环或 switch 语句。
  • continue:用于跳过当前循环的剩余部分,直接进入下一次循环。
  • goto:用于无条件跳转到指定的标签处,不过在实际编程中应谨慎使用,以免导致代码可读性变差。
3. 包相关关键字
  • package:用于声明当前文件所属的包,每个 Go 文件都必须以 package 声明开头。
  • import:用于导入其他包,以便使用该包中导出的函数、变量等。
4. 并发相关关键字
  • chan:用于声明通道(channel),通道是 Go 语言中用于在 goroutine 之间进行通信和同步的重要工具。
  • select:用于处理多个通道的并发操作,类似于 switch 语句,但用于通道的读写操作。
5. 异常处理关键字
  • defer:用于延迟函数的执行,无论包含 defer 语句的函数是正常返回还是发生异常,defer 后的函数都会在该函数返回前执行。
  • panic:用于触发一个运行时错误,程序会停止正常的执行流程,开始回溯调用栈并执行 defer 函数,直到程序崩溃。
  • recover:用于从 panic 中恢复,通常在 defer 函数中使用。
6. 接口和类型断言关键字
  • interface:用于声明接口类型。
  • struct:用于声明结构体类型。
  • map:用于声明映射类型。
  • fallthrough:在 switch 语句中使用,用于强制执行下一个 case 分支,而不进行条件判断。

go数据类型

  • 布尔型bool
  • 数值型
    • 整数intint8int16int32int64uintuint8uint16uint32uint64uintptr
    • 浮点数float32float64
    • 复数complex64complex128
    • 字节byte
    • 符文rune
  • 字符串型string

复合数据类型

  • 数组[n]Tn 为数组长度,T 为元素类型)
  • 结构体struct{...}

引用数据类型

  • 切片[]TT 为元素类型)
  • 映射map[K]VK 为键类型,V 为值类型)
  • 通道chan TT 为通道传递的数据类型)

接口类型

  • 接口interface{...}

GC垃圾回收机制

工作流程

  • 标记阶段:想象 GC 是一个拿着 “标记笔” 的人,从一些固定的地方(像全局变量、正在运行的函数里的变量等)开始找东西。找到一个能用的东西(对象)就给它做个标记,然后顺着这个东西里面的线索(引用)继续找下一个,直到把所有能找到的东西都标记好。
  • 清除阶段:标记完后,GC 会再走一遍所有的地方,看看哪些东西没有被标记,这些没标记的就是没人用的 “垃圾”,GC 就会把它们清理掉,让这些被占用的空间可以被重新使用。

采用的方法

  • 三色标记法:GC 把所有东西分成白色、灰色和黑色。刚开始所有东西都是白色,不知道有没有用。然后从一些确定有用的地方开始找,找到的白色东西就变成灰色,放到一个 “待办清单” 里。接着 GC 会从 “待办清单” 里拿出灰色的东西,把它引用的白色东西也变成灰色,然后把自己变成黑色,表示已经检查过了。最后剩下的白色东西就是没用的 “垃圾”。
  • 分代回收:GC 把内存里的东西分成年轻的和年老的。新产生的东西一般放在年轻组,因为新东西很可能很快就没用了,所以会经常检查年轻组,把没用的清理掉。有些东西一直没被清理,就会被放到年老组,年老组检查的次数会少一些。这样可以提高清理效率。
  • 并发回收:GC 不会一直让程序停下来等它清理垃圾,而是会在程序运行的时候,找机会一起做清理工作。就像一个人一边做自己的事情,一边利用空闲时间打扫卫生,这样不会耽误太多正常做事的时间。

触发时机

  • 定时触发:GC 有个 “闹钟”,每隔一段时间就会响,响了之后 GC 就会开始工作,检查有没有垃圾要清理。
  • 内存分配触发:当程序要分配新的内存空间,如果发现已经用掉的内存太多了,达到了一个规定的数量,就会马上让 GC 来清理垃圾,腾出空间

 深拷贝与浅拷贝

  • 浅拷贝:浅拷贝只复制对象的一层属性。对于基本数据类型(如整数、字符串、布尔值等),会直接复制其值;而对于引用数据类型(如对象、数组),复制的是该引用数据类型的内存地址,而不是对象本身。这意味着浅拷贝后,新对象和原对象会共享引用数据类型的内部对象,修改其中一个对象的引用类型属性,另一个对象也会受到影响。
  • 深拷贝:深拷贝会递归地复制对象的所有层级属性。它会创建一个完全独立的新对象,新对象和原对象在内存中是完全分离的,拥有各自独立的属性值。对于引用数据类型,深拷贝会深入到对象内部,将其所有嵌套的对象也复制一份,因此对新对象的任何修改都不会影响原对象,反之亦然

 函数和方法的区别

  函数是独立的代码单元,不与特定类型绑定,直接通过函数名调用以完成通用任务;而方法是与特定类型关联的函数,需通过该类型的实例调用,用于操作该类型实例并处理其相关逻辑

 Go函数参数传递到底是值传递还是引用传递

  值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数

  Go 语言中有一些数据类型,如切片(slice)、映射(map)、通道(channel)等,当它们作为参数传递时,看起来好像是引用传递,但实际上仍然是值传递。这些类型本身是引用类型,它们的值包含了一个指向底层数据结构的指针,当作为参数传递时,传递的是这个指针的副本

为什么map遍历是无序的:

  Go 语言的设计者有意让 map 遍历时无序,这主要是为了避免开发者在代码里依赖 map 元素的顺序。因为在不同版本的 Go 编译器或者运行环境下,map 内部的实现细节可能会发生变化,如果代码依赖了 map 元素的顺序,就可能导致程序行为不稳定。

map 底层是使用哈希表实现的,当你向 map 里插入元素时,元素会依据哈希函数的计算结果被放置到不同的桶(bucket)中。在遍历 map 时,Go 语言并不会按照元素插入的顺序或者键的顺序来访问,而是随机选择一个起始位置,然后按照内部的哈希表结构依次访问各个桶中的元素。并且,每次遍历 map 时,起始位置都是随机的,这就使得每次遍历的顺序都可能不同

 slice扩容机制

 array:指向底层数组的指针

   len:切片的长度,表示切片当前包含的元素个数        

   cap:切片的容量,表示切片底层数组的长度

  扩容的触发条件:

  当向切片中添加元素时,如果切片的长度 len 等于其容量 cap,此时再添加元素就会触发扩容操作。常见的触发场景是使用 append 函数向切片中追加元素

go1.18之前:

  • 如果新的元素数量(即原切片长度加上要追加的元素数量)大于原切片容量的 2 倍,则直接将容量扩容为新元素数量。
  • 如果原切片容量小于 1024,则将容量翻倍。
  • 如果原切片容量大于等于 1024,则每次增加原容量的 1/4,直到容量足够为止

go1.18之后:

  • 如果新的元素数量大于原切片容量的 2 倍,则直接将容量扩容为新元素数量。
  • 否则,若原切片长度小于 256,则将容量翻倍。
  • 若原切片长度大于等于 256,则按照公式 newcap = oldcap + (oldcap + 3*256) / 4 进行扩容,直到容量足够为止

 方法值类型接收者和指针类型接收者的区别

方法值类型接收者传递对象副本,方法内修改不影响原对象,调用时值和指针类型对象通用,适合无需修改接收者或对象较小场景;指针类型接收者传递对象地址,方法内修改影响原对象,虽值和指针类型对象通常都能调用但语义上指针更直接,适用于需修改接收者或对象较大场景

 go的互斥锁抢锁的两种模式(sync.Mutex)

正常模式

  • 竞争规则:多个 goroutine 竞争锁时,新请求锁的 goroutine 与被唤醒等待锁的 goroutine 一起竞争。由于新请求锁的 goroutine 正在 CPU 上运行,在竞争中更具优势,能优先获得锁。
  • 性能特点:吞吐量较高,因为减少了 goroutine 进入和退出等待队列的上下文切换开销,但在高并发场景下,可能导致部分等待中的 goroutine 长时间获取不到锁,出现 “饥饿” 现象。

饥饿模式

  • 触发条件:当一个 goroutine 等待锁的时间超过 1 毫秒,互斥锁会从正常模式切换到饥饿模式。
  • 竞争规则:锁的所有权直接交给等待队列中最早等待的 goroutine,新请求锁的 goroutine 不会尝试获取锁,而是直接加入等待队列尾部。
  • 性能特点:保证了每个等待锁的 goroutine 最终都能获取到锁,避免了 “饥饿” 问题,但会降低系统整体吞吐量,因为新请求锁的 goroutine 无法立即获取锁,增加了上下文切换次数。

当等待队列中没有等待的 goroutine 或者最后一个等待的 goroutine 等待时间小于 1 毫秒时,互斥锁会从饥饿模式切换回正常模式

 goroutine和线程的区别

1. 内存占用

  • 线程:栈空间初始固定且大,一般几兆,易造成内存浪费。
  • goroutine:栈空间动态分配,初始小(约 2KB),按需伸缩,节省内存。

2. 创建销毁开销

  • 线程:涉及内核操作,开销大。
  • goroutine:由 Go 运行时管理,开销极小。

3. 调度

  • 线程:由操作系统内核抢占式调度,上下文切换开销大。
  • goroutine:Go 运行时调度,用户态切换,开销小。

4. 通信

  • 线程:多靠共享内存,需同步机制,易有安全问题。
  • goroutine:用通道通信,避免数据竞争,更安全简单。

5. 并发规模

  • 线程:数量受限,几百到几千。
  • goroutine:可轻松创建数万个甚至更多

 goroutine泄露

原因

  • 无限循环:Goroutine 里无退出条件的循环,持续运行不停止。
  • 通道阻塞:发送数据到已满通道且无接收操作,或从空且未关闭通道接收数据。
  • 锁未释放:加锁后没解锁,使其他等锁的 Goroutine 阻塞。

危害

  • 耗尽内存和 CPU 资源。
  • 增加调度负担,降低程序性能。
  • 严重时导致程序崩溃。

解决办法

  • 给循环设退出条件,可用通道控制。
  • 合理处理通道收发,避免阻塞。
  • 确保锁正确加锁和解锁

 GMP调度原理

GMP 是 Go 语言运行时(runtime)实现的一种调度模型,用于高效地管理和调度 goroutine,其中 G 代表 goroutine,M 代表操作系统线程,P 代表处理器(逻辑处理器)。以下详细介绍 GMP 调度原理。

基本概念

  • G(Goroutine):Go 语言中轻量级的执行单元,由 Go 运行时管理,初始栈空间小且可动态伸缩,创建和销毁开销低。
  • M(Machine):对应一个操作系统线程,是执行计算的实际载体,负责执行 G。
  • P(Processor):处理器,它提供了执行 G 所需的上下文环境,每个 P 都有一个本地的运行队列,用于存放待执行的 G。

调度流程

1. 启动阶段
  • 程序启动时,Go 运行时会创建一定数量的 M 和 P,M 的数量通常由操作系统的线程数和 Go 程序的配置决定,P 的数量默认等于 CPU 的核心数,可以通过 GOMAXPROCS 环境变量或 runtime.GOMAXPROCS 函数进行调整。
2. 创建 Goroutine
  • 当使用 go 关键字创建一个新的 goroutine 时,这个新的 G 会被放入当前 P 的本地运行队列中。如果本地运行队列已满,G 会被放入全局运行队列中。
3. 调度执行
  • 本地队列调度:M 会从关联的 P 的本地运行队列中取出一个 G 并执行。当一个 M 执行完一个 G 后,会继续从本地队列中获取下一个 G 执行。
  • 全局队列调度:如果 P 的本地运行队列为空,M 会尝试从全局运行队列中获取 G。为了保证公平性,全局队列中的 G 会被均摊到各个 P 的本地队列中。
  • 偷取调度:如果全局运行队列也为空,M 会随机选择一个其他的 P,并从其本地队列中 “偷取” 一半的 G 到自己关联的 P 的本地队列中执行,这种机制保证了各个 P 的负载均衡。
4. 阻塞和唤醒
  • 阻塞:当一个 G 发生阻塞操作(如进行 I/O 操作、加锁等)时,M 会将当前 G 挂起,然后从本地队列或全局队列中选择另一个 G 继续执行。如果本地队列和全局队列都为空,M 会进入休眠状态。
  • 唤醒:当阻塞的 G 操作完成后,它会被唤醒,并被放入某个 P 的本地队列中等待再次执行。
5. 系统调用
  • 当 G 进行系统调用时,M 会和 P 分离,带着进行系统调用的 G 一起进入系统调用状态。如果此时还有其他可运行的 G 在 P 的本地队列中,会有新的 M 被调度来和这个 P 绑定,继续执行队列中的 G。当系统调用完成后,进行系统调用的 G 会尝试重新找一个空闲的 P 继续执行,如果没有空闲的 P,这个 G 会被放入全局队列中。

调度优势

  • 高效并发:通过轻量级的 goroutine 和 M:N 的调度模型,避免了频繁的内核态和用户态切换,减少了上下文切换的开销,提高了并发性能。
  • 负载均衡:偷取调度机制保证了各个 P 的负载均衡,充分利用了多核 CPU 的计算能力。
  • 灵活调度:能够根据 goroutine 的状态和系统资源的使用情况,动态地调整调度策略,提高了系统的整体性能和资源利用率

什么是通道,它的底层是什么

通道是什么

通道(channel)是 Go 语言用于 goroutine 间通信和同步的工具。就像一个传送带,一端的 goroutine 可以把数据放上去(发送数据),另一端的 goroutine 能从上面取走数据(接收数据),保障数据安全有序传递,避免数据竞争问题。

通道底层结构

通道底层是个结构体,关键部分及作用如下:

  • 缓冲区:类似传送带的承载区域,有大小限制。无缓冲通道就像没有承载区域的传送带,数据得立刻被取走;有缓冲通道则能暂存一定数量的数据。
  • 队列:有两个队列,一个存等待发送数据的 goroutine,另一个存等待接收数据的 goroutine。当通道条件不满足(如满了或空了),goroutine 会进入对应队列等待。
  • :好比传送带的安全开关,保证同一时间只有一个 goroutine 能操作通道,避免混乱。
  • 状态标记:记录通道是否关闭等状态信息

 生产者和消费者怎么关闭管道

基本规则

Go 里通常由生产者关闭管道,因为它知道何时不再产生数据,消费者能通过管道关闭信号得知数据传输结束。

不同场景关闭方式

  1. 单生产者单消费者:生产者完成数据发送后,用 close(chan) 关闭管道。消费者用 for...range 接收数据,管道关闭且数据取完,循环自动结束。例如面包师傅做完面包就关店门,顾客看到店门关且没面包就不再等。
  2. 需外部控制时:创建信号通道,生产者用 select 监听。收到关闭信号就关闭数据管道。如面包师傅收到停电通知就停止做面包并关店。
  3. 多生产者单 / 多消费者:用 sync.WaitGroup 跟踪生产者。所有生产者完成后,通过一个 goroutine 关闭管道。像多个送报小组都送完报,统一锁报箱

 如何检测通道关闭

在 Go 里检测通道关闭有三种常用办法:

  1. for...range 循环:用 for num := range ch 接收数据,通道关闭且数据收完,循环自动结束,很适合持续从通道取数据的场景。
  2. 多值接收:使用 v, ok := <-ch ,ok 为 true 表示正常收到数据,为 false 说明通道已关且无数据。
  3. select 语句:在 select 里结合多值接收,case v, ok := <-ch ,依据 ok 值判断通道是否关闭

 通道和锁的区别

 设计理念

  • 通道:以通信方式共享内存,通过传递数据协调并发。
  • 锁:共享内存来通信,用加解锁控制对共享资源的访问。

  使用场景

  • 通道:适合数据传递、多协程协作和同步场景。
  • 锁:用于保护共享资源,避免多协程同时读写引发冲突。

并发控制 

  • 通道:自动处理阻塞和同步,协程通过通道收发数据。
  • 锁:需手动控制加锁和解锁,易出现死锁问题。

代码复杂度 

  • 通道:代码简洁,逻辑清晰,提高可读性。
  • 锁:复杂场景下需精细管理,增加代码维护难度。

性能表现 

  • 通道:高并发时避免锁竞争,但有一定通信开销。
  • 锁:操作轻量,高并发竞争激烈时性能下降

数组和切片的区别

 定义和长度特性

  • 数组:定义时必须明确指定长度,且该长度固定,不可更改。数组长度属于其类型的一部分,不同长度的数组属于不同类型。
  • 切片:是对数组的抽象,长度可在运行时动态改变。它本身不存储数据,而是指向一个底层数组。

内存分配

  • 数组:定义时会分配连续的内存空间来存储所有元素,内存大小在编译时就已确定。作为函数参数传递时,会复制整个数组,可能造成较大内存开销。
  • 切片:是轻量级数据结构,由指向底层数组的指针、切片长度和容量构成。内存分配主要取决于底层数组。作为函数参数传递时,传递的是切片结构体本身,不复制底层数组,开销小。

长度和容量

  • 数组:只有长度概念,即元素数量,没有容量概念,因为长度固定。
  • 切片:有长度和容量两个属性。长度指当前元素数量,容量是底层数组从切片起始位置开始的最大元素数量。向切片追加元素,长度超容量时会自动扩容,通常重新分配更大底层数组并复制原元素。

使用灵活性

  • 数组:因长度固定,使用不够灵活,若要存储不同数量元素,可能需重新定义数组。
  • 切片:动态长度特性使其使用更灵活,可方便进行元素追加、删除和修改操作。

相关文章:

golang面试题

目录 go版本新增功能 Go 1.11 Go 1.18 Go 1.5 go关键字 &#xff1a; 1. 用于声明的关键字 2. 控制流关键字 3. 包相关关键字 4. 并发相关关键字 5. 异常处理关键字 6. 接口和类型断言关键字 go数据类型&#xff1a; 复合数据类型 引用数据类型 接口类型 GC垃…...

基于UKF-IMM无迹卡尔曼滤波与交互式多模型的轨迹跟踪算法matlab仿真,对比EKF-IMM和UKF

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于UKF-IMM无迹卡尔曼滤波与交互式多模型的轨迹跟踪算法matlab仿真,对比EKF-IMM和UKF。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 .…...

Install Python

目录 1.Install Python 1.安装Python 3 2.在Windows上安装Python 3.在Mac上安装Python 4.在Linux上安装Python 5.运行Python 2.Python解释器 1.CPython 2.IPython 3.PyPy 4.Jython 5.IronPython 6.小结 1.Install Python 因为Python是跨平台的&#xff0c;它可以…...

云计算部署模式全面解析

目录 引言公有云私有云混合云三种部署模式的对比选择建议未来趋势结语 1. 引言 随着云计算技术的快速发展,企业在选择云部署模式时面临着多种选择。本文将深入探讨云计算的三种主要部署模式:公有云、私有云和混合云,帮助读者全面了解它们的特点、优势及适用场景。 © iv…...

tomcat核心组件及原理概述

目录 1. tomcat概述 1.1 概念 1.2 官网地址 2. 基本使用 2.1下载 3. 整体架构 3.1 核心组件 3.2 从web.xml配置和模块对应角度 3.3 如何处理请求 4. 配置JVM参数 5. 附录 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一个开源、免费、轻量级的Web服务器。 Tomca…...

GIS教程:全国数码商城系统

文章目录 注册高德地图API普通网页中测试地图加载地图添加标记地图配置点标记 Marker添加弹框创建vue项目并添加高德地图创建项目加载高德地图项目首页布局封装axios和配置代理服务器获取城市热门信息获取城市区县信息获取区县商城信息获取指定城市区县的经纬度坐标将地图缩放到…...

Level DB --- table.format

table.format是Level DB中table序列化、反序列化重要的辅助类。它用来定义序列化、反序列化的核心结构体和操作实现。 BlockHandle table.format中的BlockHandle类主要用来记录当前block在总的序列化中的offset位置&#xff0c;以及当前block的size&#xff0c;这里面的Block…...

《编写可读代码的艺术》读书笔记

1. 写在前面 借着春节放假的几天&#xff0c; 读了下《编写可读代码的艺术》这本书&#xff0c; 这本书不是很长&#xff0c;主要关注代码的一些编写细节&#xff0c;比如方法命名&#xff0c;函数命名&#xff0c;语句组织&#xff0c;任务分解等&#xff0c; 旨在让写的代码…...

(9)下:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同。小例子的实验

&#xff08;4&#xff09;本实验代码的蓝本&#xff0c;是伊圣雨老师里的课本里的代码&#xff0c;略加改动而来的。 以下是 服务器端的代码&#xff1a; 每当收到客户端的报文时&#xff0c;就测试一下对应的 epoll 事件里的事件标志&#xff0c;不读取报文内容&#xff0c;…...

MySQL基础-多表查询

多表查询-多表关系 多表查询-概述 例如执行下行sql语句就会出现笛卡尔积&#xff1a; select *from emp,dept; --消除笛卡尔积 select * from emp,dept where emp.dept_id dept.id; 多表查询-查询分类 多表查询-连接查询-内连接 --内连接演示 --1.查询每一个员工的姓名,及关…...

RK3568 opencv播放视频

文章目录 一、opencv相关视频播放类1. `cv::VideoCapture` 类主要构造方法:主要方法:2. 视频播放基本流程代码示例:3. 获取和设置视频属性4. 结合 FFmpeg 使用5. OpenCV 视频播放的局限性6. 结合 Qt 实现更高级的视频播放总结二、QT中的代码实现一、opencv相关视频播放类 在…...

C++中的类型转换

文章目录 一、概述二、隐式类型转换&#xff08;Implicit Conversion&#xff09;三、显式类型转换&#xff08;Explicit Conversion&#xff09;四、C 风格类型转换 一、概述 C 提供了多种类型转换&#xff08;Type Conversion&#xff09;方式&#xff0c;以便在不同类型的数…...

day7手机拍照装备

对焦对不上&#xff1a;1、光太暗&#xff1b;2、离太近&#xff1b;3、颜色太单一没有区分点 滤镜可以后期P 渐变灰滤镜&#xff1a;均衡色彩&#xff0c;暗的地方亮一些&#xff0c;亮的地方暗一些 中灰滤镜&#xff1a;减少光差 手机支架&#xff1a;最基本70cm即可 手…...

Joplin 插件在Vscode中无法显示图片

1.问题 在vscode里面装好joplin插件之后&#xff0c;无法显示图片内容。 粘贴的图片可以再vscode中显示&#xff0c;无法再joplin客户端显示 2.解决方法 这种情况是因为和vscode自带的MD编辑器的预览模式有冲突&#xff0c;或者没用通过专用方式上传图片。 方法一&#xff…...

ReentrantReadWriteLock源码分析

文章目录 概述一、状态位设计二、读锁三、锁降级机制四、写锁总结 概述 ReentrantReadWriteLock&#xff08;读写锁&#xff09;是对于ReentranLock&#xff08;可重入锁&#xff09;的一种改进&#xff0c;在可重入锁的基础上&#xff0c;进行了读写分离。适用于读多写少的场景…...

ChatGPT-4o和ChatGPT-4o mini的差异点

在人工智能领域&#xff0c;OpenAI再次引领创新潮流&#xff0c;近日正式发布了其最新模型——ChatGPT-4o及其经济实惠的小型版本ChatGPT-4o Mini。这两款模型虽同属于ChatGPT系列&#xff0c;但在性能、应用场景及成本上展现出显著的差异。本文将通过图文并茂的方式&#xff0…...

小程序设计和开发:什么是竞品分析,如何进行竞品分析

一、竞品分析的定义 竞品分析是指对竞争对手的产品进行深入研究和比较&#xff0c;以了解市场动态、发现自身产品的优势和不足&#xff0c;并为产品的设计、开发和营销策略提供参考依据。在小程序设计和开发中&#xff0c;竞品分析可以帮助开发者了解同类型小程序的功能、用户体…...

计算机网络之计算机网络的分类

计算机网络可以根据不同的角度进行分类&#xff0c;以下是几种常见的分类方式&#xff1a; 1. 按照规模和范围&#xff1a; 局域网&#xff08;LAN&#xff0c;Local Area Network&#xff09;&#xff1a;覆盖较小范围&#xff08;例如一个建筑物或校园&#xff09;&#xf…...

什么是门控循环单元?

一、概念 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Cho等人在2014年提出。GRU是LSTM的简化版本&#xff0c;通过减少门的数量和简化结构&#xff0c;保留了LSTM的长时间依赖…...

ESP32-c3实现获取土壤湿度(ADC模拟量)

1硬件实物图 2引脚定义 3使用说明 4实例代码 // 定义土壤湿度传感器连接的模拟输入引脚 const int soilMoisturePin 2; // 假设连接到GPIO2void setup() {// 初始化串口通信Serial.begin(115200); }void loop() {// 读取土壤湿度传感器的模拟值int sensorValue analogRead…...

获取snmp oid的小方法1(随手记)

snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值&#xff0c;找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…...

【C++篇】哈希表

目录 一&#xff0c;哈希概念 1.1&#xff0c;直接定址法 1.2&#xff0c;哈希冲突 1.3&#xff0c;负载因子 二&#xff0c;哈希函数 2.1&#xff0c;除法散列法 /除留余数法 2.2&#xff0c;乘法散列法 2.3&#xff0c;全域散列法 三&#xff0c;处理哈希冲突 3.1&…...

Nginx开发01:基础配置

一、下载和启动 1.下载、使用命令行启动&#xff1a;Web开发&#xff1a;web服务器-Nginx的基础介绍&#xff08;含AI文稿&#xff09;_nginx作为web服务器,可以承担哪些基本任务-CSDN博客 注意&#xff1a;我配置的端口是81 2.测试连接是否正常 访问Welcome to nginx! 如果…...

mysqldump+-binlog增量备份

注意&#xff1a;二进制文件删除必须使用help purge 不可用rm -f 会崩 一、概念 增量备份&#xff1a;仅备份上次备份以后变化的数据 差异备份&#xff1a;仅备份上次完全备份以后变化的数据 完全备份&#xff1a;顾名思义&#xff0c;将数据完全备份 其中&#xff0c;…...

hive:数据导入,数据导出,加载数据到Hive,复制表结构

hive不建议用insert,因为Hive是建立在Hadoop之上的数据仓库工具&#xff0c;主要用于批处理和大数据分析&#xff0c;而不是为OLTP&#xff08;在线事务处理&#xff09;操作设计的。INSERT操作会非常慢 数据导入 命令行界面:建一个文件 查询数据>>复制>>粘贴到新…...

【工欲善其事】利用 DeepSeek 实现复杂 Git 操作:从原项目剥离出子版本树并同步到新的代码库中

文章目录 利用 DeepSeek 实现复杂 Git 操作1 背景介绍2 需求描述3 思路分析4 实现过程4.1 第一次需求确认4.2 第二次需求确认4.3 第三次需求确认4.4 V3 模型&#xff1a;中间结果的处理4.5 方案验证&#xff0c;首战告捷 5 总结复盘 利用 DeepSeek 实现复杂 Git 操作 1 背景介绍…...

mac 手工安装OpenSSL 3.4.0

如果你希望继续安装 openssl-3.4.0 而不是降级到 3.1.1&#xff0c;可以尝试以下解决方案。根据你提供的错误信息&#xff0c;问题可能出在测试阶段&#xff08;make test&#xff09;&#xff0c;我们可以尝试跳过测试或修复测试失败的原因。 --- ### **解决方案&#xff1a…...

构建一个数据分析Agent:提升分析效率的实践

在上一篇文章中,我们讨论了如何构建一个智能客服Agent。今天,我想分享另一个实际项目:如何构建一个数据分析Agent。这个项目源于我们一个金融客户的真实需求 - 提升数据分析效率,加快决策速度。 从分析师的痛点说起 记得和分析师团队交流时的场景&#xff1a; 小张&#xff…...

【SRC排名】安全应急响应中心SRC上榜记录

2023年 新氧第三 https://security.soyoung.com/top 合合第四 https://security.intsig.com/index.php?m&chall&aindex 2024年 好未来第一 https://src.100tal.com/index.php?m&chall&aindex&#xff08;官网是总榜&#xff0c;年榜只有海报&#xff09;…...

截止到2025年2月1日,Linux的Wayland还有哪些问题是需要解决的?

截至2025年2月1日,Wayland需要解决的核心问题可按权重从高到低排序如下: 1. 屏幕共享与远程桌面的完整支持(权重:★★★★★) 问题:企业场景(如 腾讯会议)、开发者远程调试依赖稳定的屏幕共享功能。当前Wayland依赖PipeWire和XWayland,存在权限管理复杂、多显示器选择…...

TCP编程

1.socket函数 int socket(int domain, int type, int protocol); 头文件&#xff1a;include<sys/types.h>&#xff0c;include<sys/socket.h> 参数 int domain AF_INET: IPv4 Internet protocols AF_INET6: IPv6 Internet protocols AF_UNIX, AF_LOCAL : Local…...

Java泛型深度解析(JDK23)

第一章 泛型革命 1.1 类型安全的进化史 前泛型时代的类型转换隐患 代码的血泪史&#xff08;Java 1.4版示例&#xff09;&#xff1a; List rawList new ArrayList(); rawList.add("Java"); rawList.add(Integer.valueOf(42)); // 编译通过// 灾难在运行时爆发…...

【JavaEE进阶】图书管理系统 - 壹

目录 &#x1f332;序言 &#x1f334;前端代码的引入 &#x1f38b;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f343;后端服务器代码实现 &#x1f6a9;登录接口 &#x1f6a9;图书列表接口 &#x1f384;前端代码实现 &#x1f6a9;登录页面 &#x1f6a9;…...

搜索旋转排序数组(二分查找)

测试链接&#xff1a;https://leetcode.cn/problems/search-in-rotated-sorted-array/https://leetcode.cn/problems/search-in-rotated-sorted-array/https://leetcode.cn/problems/search-in-rotated-sorted-array/ 问题描述 假设我们有一个旋转排序的数组&#xff0c;这个…...

STM32 TIM定时器配置

TIM简介 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff…...

AI开发之 ——Anaconda 介绍

Anaconda 是什么&#xff1f; 在这里插入图片描述 一句话&#xff1a;Anaconda 是Python 库和环境便捷管理的平台。 Anaconda 是数据科学和 AI 领域的工具&#xff0c;通过集成常用库和工具&#xff0c;简化了环境管理和包安装&#xff0c;特别适合初学者和需要快速上手的开…...

Uber损失(Huber Loss):从均方误差到绝对误差的完美过渡

前言 在机器学习的世界里,损失函数就像是你在迷宫中的导航系统,它决定了你到底能否顺利找到出口,而出口的大小就代表着模型的表现。而在这么多的“导航系统”中,Huber损失(你可以叫它“Uber损失”,我觉得这名字挺有意思的,能不能打车到一个更好的模型呢?)凭借其独特的…...

【Arxiv 大模型最新进展】TOOLGEN:探索Agent工具调用新范式

【Arxiv 大模型最新进展】TOOLGEN&#xff1a;探索Agent工具调用新范式 文章目录 【Arxiv 大模型最新进展】TOOLGEN&#xff1a;探索Agent工具调用新范式研究框图方法详解 作者&#xff1a;Renxi Wang, Xudong Han 等 单位&#xff1a;LibrAI, Mohamed bin Zayed University o…...

41【文件名的编码规则】

我们在学习的过程中&#xff0c;写出数据或读取数据时需要考虑编码类型 火山采用&#xff1a;UTF-16 易语言采用&#xff1a;GBK php采用&#xff1a;UTF-8 那么我们写出的文件名应该是何种编码的&#xff1f;比如火山程序向本地写出一个“测试.txt”&#xff0c;理论上这个“测…...

Linux命令入门

Linux命令入门 ls命令 ls命令的作用是列出目录下的内容&#xff0c;语法细节如下: 1s[-a -l -h] [Linux路径] -a -l -h是可选的选项 Linux路径是此命令可选的参数 当不使用选项和参数,直接使用ls命令本体,表示:以平铺形式,列出当前工作目录下的内容 ls命令的选项 -a -a选项&a…...

如何用函数去计算x年x月x日是(C#)

如何用函数去计算x年x月x日是? 由于现在人工智能的普及,我们往往会用计算机去算,或者去记录事情 1.计算某一年某一个月有多少天 2.计算某年某月某日是周几 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threadin…...

29.Word:公司本财年的年度报告【13】

目录 NO1.2.3.4 NO5.6.7​ NO8.9.10​ NO1.2.3.4 另存为F12&#xff1a;考生文件夹&#xff1a;Word.docx选中绿色标记的标题文本→样式对话框→单击右键→点击样式对话框→单击右键→修改→所有脚本→颜色/字体/名称→边框&#xff1a;0.5磅、黑色、单线条&#xff1a;点…...

Flutter常用Widget小部件

小部件Widget是一个类&#xff0c;按照继承方式&#xff0c;分为无状态的StatelessWidget和有状态的StatefulWidget。 这里先创建一个简单的无状态的Text小部件。 Text文本Widget 文件&#xff1a;lib/app/app.dart。 import package:flutter/material.dart;class App exte…...

高可用 Keepalived 服务部署流程

一、配置文件 vim /etc/keepalived/keepalived.confGLOBAL CONFIGURATION --- 全局配置部分VRRPD CONFIGURATION --- VRRP协议配置部分LVS CONFIGURATION --- LVS服务管理配置部分[rootlb01 ~]# cat /etc/keepalived/keepalived.…...

网站结构优化:加速搜索引擎收录的关键

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/9.html 网站结构优化对于加速搜索引擎收录至关重要。以下是一些关键策略&#xff0c;旨在通过优化网站结构来提高搜索引擎的抓取效率和收录速度&#xff1a; 一、合理规划网站架构 采用扁…...

【深度学习】softmax回归的从零开始实现

softmax回归的从零开始实现 (就像我们从零开始实现线性回归一样&#xff0c;)我们认为softmax回归也是重要的基础&#xff0c;因此(应该知道实现softmax回归的细节)。 本节我们将使用Fashion-MNIST数据集&#xff0c;并设置数据迭代器的批量大小为256。 import torch from IP…...

AMS仿真方法

1. 准备好verilog文件。并且准备一份.vc文件&#xff0c;将所有的verilog file的路径全部写在里面。 2. 将verilog顶层导入到virtuoso中&#xff1a; 注意.v只要引入顶层即可。不需要全部引入。实际上顶层里面只要包含端口即可&#xff0c;即便是空的也没事。 引入时会报warni…...

多模态论文笔记——ViViT

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》&#xff0c;2021由google 提出用于视频处理的视觉 Transformer 模型&#xff0c;在视频多模态领域有…...

Flink2支持提交StreamGraph到Flink集群

最近研究Flink源码的时候&#xff0c;发现Flink已经支持提交StreamGraph到集群了&#xff0c;替换掉了原来的提交JobGraph。 新增ExecutionPlan接口&#xff0c;将JobGraph和StreamGraph作为实现。 Flink集群Dispatcher也进行了修改&#xff0c;从JobGraph改成了接口Executio…...

机器学习优化算法:从梯度下降到Adam及其变种

机器学习优化算法&#xff1a;从梯度下降到Adam及其变种 引言 最近deepseek的爆火已然说明&#xff0c;在机器学习领域&#xff0c;优化算法是模型训练的核心驱动力。无论是简单的线性回归还是复杂的深度神经网络&#xff0c;优化算法的选择直接影响模型的收敛速度、泛化性能…...