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

go函数详解

1.简介

函数是组织好的、可重复使用的,用于执行指定任务的代码块,为了完成某一个功能的程序指令的集合,称为函数。go语言中支持:函数、匿名函数和闭包。

2.函数的定义

func 函数名 (形参列表) (返回值列表){

函数体 

return 返回值列表

}

其中:

  • 函数名:由字母、数字、下划线组成。但函数名第一个字母不能是数字。在同一个包内,函数名也不能重名。
  • 形参列表:参数由参数变量和参数变量的类型组成,做个参数之前是用逗号分割。
  • 返回值:返回值由返回之变量和其类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用逗号分隔。
  • 函数体:实现指定功能的代码块。

3.基本用法 

3.1函数的基本用法

函数的参数和返回值都是可选的,例如我们可以实现一个即不需要参数也不需要返回值的函数:

func sayHello() {fmt.Println("sayhello")
}

3.2求两个数的和

func sumFn(a int, b int) int {return a + b
}

 调用:

func main() {sum := sumFn(10, 13)fmt.Println(sum)
}

 注意:调用的函数有返回值时,可以不接受其返回值。

3.3函数简写(求两个数的差)

函数的参数中如果相邻变量的类型相同,则可以省略类型,例如下面代码中,subFn函数有两个参数,这两个参数的类型相同,因此可以省略a的类型,因为b后面有类型说明,a参数也是该类型。

func subFn(a, b int) int {return a - b
}

3.4可变参数 

可变参数是指函数的参数数量是不固定,go语言中的可变参数通过在参数后面加...来标识的。

注意:可变参数通常要作为函数的最后一个参数。可变参数是一个切片。

func changFn(a int, x ...int) int {fmt.Printf("%v--%T\n", x, x)var sum = afor _, v := range x {sum += v}return sum
}

调用

func main() {changSum := changFn(1, 2, 3, 4, 5, 6)fmt.Println(changSum)
}

结果:

[2 3 4 5 6]--[]int
21

3.5函数返回值 

go语言中通过return关键字向外输出返回值。上面代码已经体验函数单个返回值的用法了。

go语言中的函数还支持多返回值,函数如果有多个返回值时必须用()将所有的返回值包裹起来。

func moreFn(a, b int) (int, int) {sum := a + bsub := a - breturn sum, sub
}
func main() {	 msum, msub := moreFn(20, 13)fmt.Println(msum, msub)
}

 还支持返回值命名,函数定义时可以给返回值命名,并在函数体中直接使用这些变量,最后通过return关键字返回。例如:

func moreFn2(a, b int) (sum, sub int) {sum = a + bsub = a - breturn
}
func main() {msum, msub := moreFn2(20, 17)fmt.Println(msum, msub)
}

4.函数变量作用域 

全局变量:全局变量是定义在函数外部的变量,它在程序整个运行周期内都有效。全局作用域。

局部变量:局部变量是在函数内部定义的变量,函数内定义的变量无法在函数外部使用。局部变量。

注意:如果全局变量和局部变量重名了,优先访问局部变量。

var a = "全局变量"func run() {var b="局部变量"fmt.Println("run--a=", a)fmt.Println("run--b=",b)}
func main() {run()fmt.Println("main--a=", a)//i是局部变量,只能在for内部使用for i := 0; i < 10; i++ {fmt.Println(i)}
}

5.练习

5.1封装整数类型的切片排序方法

要求:选择排序,从小到大。

func sortIntAsc(slice []int) []int {for i := 0; i < len(slice); i++ {for j := i + 1; j < len(slice); j++ {if slice[i] > slice[j] {slice[i], slice[j] = slice[j], slice[i]}}}return slice
}
func main() {sliceA := []int{23, 1, 5, 67, 13, 22}fmt.Println(sortIntAsc(sliceA))fmt.Println(sliceA)
}

结果:因为切片是引用类型的数据,所以两次结果是一致的。

[1 5 13 22 23 67]
[1 5 13 22 23 67]

5.2要求把map按照key的顺序进行打印

例如:

var m1 map[string]string
m1 = make(map[string]string)
m1["username"] = "张三"
m1["age"] = "18"
m1["height"] = "1.8"
m1["sex"] = "男"

打印结果:age=>18height=>1.8sex=>男username=>张三

func sortMap(m map[string]string) string {var slice []stringfor key, _ := range m {slice = append(slice, key)}sort.Strings(slice)var str stringfor _, s := range slice {str += fmt.Sprintf("%v=>%v", s, m[s])}return str
}
func main() {var m1 map[string]stringm1 = make(map[string]string)m1["username"] = "张三"m1["age"] = "18"m1["height"] = "1.8"m1["sex"] = "男"str := sortMap(m1)fmt.Println(str)
}

6.函数类型与变量

定义函数类型:我们可以使用type关键字来定义一个函数类型,具体格式如下

type 类型名称 func(参数类型,参数类型。。。) 返回值类型

例如

type  calculation func(int,int) int

上面语句定义了一个calculation类型,它是一种函数类型,这种函数类型接受两个int类型的参数并且返回一个int类型的返回值。

package mainimport "fmt"// 定义函数类型
type calculation func(int, int) intfunc add(a, b int) int {return a + b
}
func sub(a, b int) int {return a - b
}
func main() {var c calculationc = addfmt.Printf("%T\n", c)fmt.Println(c(2, 4))f := subfmt.Printf("%T\n", f)fmt.Println(f(10, 2))
}

结果:

main.calculation
6
func(int, int) int
8

 由上面结果可知,add和sub函数都满足接收两个int类型的参数并且都返回一个int类型的值,所以可以把赋值给calculation类型的变量。

7.把函数作为参数

package mainimport "fmt"// 定义函数类型
type calculation func(int, int) intfunc add(a, b int) int {return a + b
}
func sub(a, b int) int {return a - b
}
func fn1(a, b int, do calculation) int {return do(a, b)
}
func fn2(a, b int, do func(int, int) int) int {return do(a, b)
}
func main() {fmt.Println(fn1(1, 2, add))fmt.Println(fn2(12, 2, sub))
}

结果:

3
10

8.把函数当作返回值

package mainimport "fmt"// 定义函数类型
type calculation func(int, int) intfunc add(a, b int) int {return a + b
}
func sub(a, b int) int {return a - b
}
func cal(s string) calculation {switch s {case "+":return addcase "-":return subcase "*":return func(i int, i2 int) int {return i * i2}default:return nil}
}
func main() {sum := cal("+")fmt.Println(sum(1, 2))fmt.Println(cal("-")(12, 10))fmt.Println(cal("*")(3, 10))
}

结果:

3
2
30

9.匿名函数

函数当然还可以作为返回值,但是在Go语言中函数内部不能再像之前那样定义函数了,只 能定义匿名函数。匿名函数就是没有函数名的函数,匿名函数的定义格式如下:

func(参数)(返回值){ 函数体 }

匿名函数因为没有函数名,所以没办法像普通函数那样调用,所以匿名函数需要保存到某个 变量或者作为立即执行函数:

package mainimport "fmt"func main() {func() {fmt.Println("hello word")}()//将匿名函数保存到变量add := func(x, y int) {fmt.Println(x + y)}add(10, 20) //通过变量调用匿名函数//自执行函数:匿名函数定义完加()直接执行func(x, y int) {fmt.Println(x + y)}(10, 20)}

结果:

hello word
30
30

10.闭包

10.1简介

闭包:
1.闭包是指有权访问另一个函数作用域中的函数。
2.创建闭包的常见的方式就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。

注意:由于闭包里作用域返回的局部变量资源不会立即销毁回收,搜易可能会占用更多的内存,过度使用闭包会导致性能下降,建议在非常有必要的时候才使用闭包。

全局变量特点:
    1.常驻内存
    2.全局污染
局部变量的特点:
    1.不常住内存
    2.不污染全局
闭包:
    1.可以让一个变量常驻内存
    2.可以提让一个变量不污染全局

闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部 连接起来的桥梁。或者说是函数和其引用环境的组合体。首先我们来看一个例子:

package mainimport "fmt"
//写法:闭包的写法 函数里面桥套一个函数 最后返回里面的函数
func adder() func(int) int {var x intreturn func(y int) int {x += yreturn x}
}
func main() {var f = adder()fmt.Println(f(10)) //10fmt.Println(f(20)) //30fmt.Println(f(30)) //60f1 := adder()fmt.Println(f1(40)) //40fmt.Println(f1(50)) //90
}

结果:

10
30
60
40
90

由结果可知:变量f是一个函数并且它引用了其外部作用域中的x变量,此时f就是一个闭包。在f的生 命周期内,变量x也一直有效。

11.defer语句

go语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行。在函数中,经常会用到释放一些资源,比如数据库链接和文件的读写等。

注意:当go执行到一个defer时,不会立即执行defer后的语句,而将defer后的语句压入到一个栈中,然后执行函数下一个语句。当函数执行完毕后,在从栈中按照先入后出的方式出栈,执行。

案例一

package mainimport "fmt"func sum(a, b int) int {defer fmt.Println("a=", a)defer fmt.Println("b=", b)res := a + bfmt.Println("res=", res)return res
}
func main() {fmt.Println(sum(10, 20))
}

结果:由结果可以看出先被defer定义的语句后执行,符合逆序执行的策略。

res= 30
b= 20
a= 10
30

案例二:注意:在defer将语句放入到栈时,也将相关的值拷贝同时入栈。

package mainimport "fmt"func sum(a, b int) int {defer fmt.Println("use defer--a=", a)defer fmt.Println("use defer--b=", b)a++b++fmt.Println("not defer--a=", a)fmt.Println("not defer--b=", b)res := a + bfmt.Println("res=", res)return res
}
func main() {fmt.Println(sum(10, 20))
}

结果:

not defer--a= 11
not defer--b= 21
res= 32
use defer--b= 20
use defer--a= 10
32

案例三:注意defer注册要延迟执行的函数时该函数所有的参数都要确定其值。

package mainimport "fmt"func calc(index string, a, b int) int {ret := a + bfmt.Println(index, a, b, ret)return ret
}
/*注册顺序:defer calc("AA", x, calc("A", x, y))defer calc("BB", x, calc("B", x, y))执行顺序:defer calc("AA", x, calc("A", x, y))defer calc("BB", x, calc("B", x, y))
*/
func main() {x := 1y := 2//在defer将语句放入到栈时,也将相关的值拷贝同时入栈。//defer注册要延迟执行的函数时该函数所有的参数都要确定其值。/*所以执行时 x=1  y=2calc("A", x, y)也要确定其值,所以要首先执行calc("A", 1, 2)=3   结果:A 1 2 3calc("AA", 1, 3)=4整体执行顺序1.x=1 y=2 a:=calc("A", x, y)2.x=10 y=2 b:=calc("B", x, y)3.x=10 y=2 calc("BB", x, b)4.x=1 y=2 calc("AA", x, a)*/defer calc("AA", x, calc("A", x, y))x = 10//x=10  y=2defer calc("BB", x, calc("B", x, y))y = 20
}

 结果:

A 1 2 3
B 10 2 12
BB 10 12 22
AA 1 3 4

12.内置函数panic/recover

Go语言中目前(Go1.12)是没有异常机制,但是使用panic/recover模式来处理错误。panic 可以在任何地方引发,但recover只有在defer调用的函数中有效。

示例:

package mainimport "fmt"func fn3(a []int) {fmt.Println(a[10])
}
func main() {fn3([]int{1, 2, 3})fmt.Println("main")
}

结果:下标越界了,不能执行下面代码。如果想要继续执行下面的代码,可以抛出异常处理。

panic: runtime error: index out of range [10] with length 3goroutine 1 [running]:
main.fn3(...)D:/goproject/demo2/demo/func8/main.go:7
main.main()D:/goproject/demo2/demo/func8/main.go:10 +0x1d

 解决方案:程序运行期间引发了panic导致程序崩溃,异常退出了。这个时候我们就可以通过 recover将程序恢复回来,继续往后执行。

package mainimport "fmt"func fn3(a []int) {defer func() {err := recover()if err != nil {fmt.Println(err)}}()fmt.Println(a[10])
}
func main() {fn3([]int{1, 2, 3})fmt.Println("main")
}

结果:

runtime error: index out of range [10] with length 3
main

自定义异常处理:

package mainimport ("errors""fmt"
)func readFile(fileName string) error {if fileName == "main.go" {return nil}return errors.New("读取文件错误")
}
func fn3() {defer func() {err := recover()if err != nil {fmt.Println("抛出异常给管理员发送邮件")}}()var err = readFile("xxx.go")if err != nil {panic(err)}fmt.Println("继续执行")
}
func main() {fn3()
}

结果:

抛出异常给管理员发送邮件

注意:

1. recover()必须搭配defer使用。

2. defer一定要在可能引发panic的语句之前定义。

相关文章:

go函数详解

1.简介 函数是组织好的、可重复使用的&#xff0c;用于执行指定任务的代码块&#xff0c;为了完成某一个功能的程序指令的集合&#xff0c;称为函数。go语言中支持&#xff1a;函数、匿名函数和闭包。 2.函数的定义 func 函数名 (形参列表) (返回值列表){ 函数体 return …...

MVCC实现原理

一、引言 在现代数据库管理系统中&#xff0c;数据的一致性和并发性是两个至关重要的特性。传统的锁机制虽然有效&#xff0c;但也存在着性能瓶颈&#xff0c;特别是在高并发环境下&#xff0c;锁的争用会导致系统响应时间变慢&#xff0c;甚至引发死锁等问题。为了克服这些挑…...

通过Golang的container/list实现LRU缓存算法

文章目录 力扣&#xff1a;146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2. 插入元素3. 删除元素4. 遍历链表5. 获取链表长度使用场景注意事项 源代码阅读 在 Go 语言中&#xff0c;container/list 包提供了一个双向链表的实现。链表是一种常见的数据结构&#…...

网络编程7天学java

* 网络编程&#xff1a;两台或两台以上的主机构成一个网络 * IP地址&#xff1a;标志网络中的一个通信实体的地址 * 端口号&#xff1a;区分不同应用程序 * 网络通信协议&#xff1a;ISO参考模型&#xff08;7层&#xff09;&#xff0c;TCP/IP协议&#xff08;4层&#xff09;…...

在 IntelliJ IDEA 中配置 Git

1. 确保已安装 Git 在配置之前&#xff0c;确保你的系统已经安装了 Git。 检查是否已安装 Git&#xff1a; bash 复制 git --version 如果未安装&#xff0c;请前往 Git 官网 下载并安装。 2. 在 IntelliJ IDEA 中配置 Git 打开 IntelliJ IDEA。 进入设置&#xff1a; Windo…...

【Godot4.4】Rect2总结

概述 Rect2是2D场景中比较重要的一种数据类型。 Rect2的本质含义是2D场景的轴对齐包围盒&#xff0c;而不是可以自由变换的矩形。 Rect2提供了一些方法&#xff0c;可以方便的判断Rect2之间是否重叠、包含等&#xff0c;并可以获得重叠的区域。也可以获得两个Rect2的包围盒。…...

git使用命令总结

文章目录 Git 复制创建提交步骤Git 全局设置:创建 git 仓库:已有仓库? 遇到问题解决办法&#xff1a;问题一先git pull一下&#xff0c;具体流程为以下几步&#xff1a; 详细步骤 Git 复制 git clone -b RobotModelSetting/develop https://gitlab.123/PROJECT/123.git创建提…...

Unity DOTS从入门到精通之 C# Job System

文章目录 前言安装 DOTS 包C# 任务系统Mono 环境DOTS 环境运行作业NativeContainer 前言 作为 DOTS 教程&#xff0c;我们将创建一个旋转立方体的简单程序&#xff0c;并将传统的 Unity 设计转换为 DOTS 设计。 Unity 2022.3.52f1Entities 1.3.10 安装 DOTS 包 要安装 DOTS…...

linux下的网络抓包(tcpdump)介绍

linux下的网络抓包[tcpdump]介绍 前言tcpdump1. 安装 tcpdump2. 基本抓包命令3. 过滤器使用4. 保存捕获的数据包 异常指标1. 连接建立与断开相关指标异常 SYN 包异常 FIN 或 RST 包 2. 流量相关指标异常流量峰值异常源或目的 IP 流量 3. 端口相关指标异常端口使用端口扫描 4. 数…...

深入理解 Linux 中的 -h 选项:让命令输出更“人性化”

在 Linux 系统中&#xff0c;命令行工具是系统管理员和普通用户最常用的交互方式之一。然而&#xff0c;命令行输出往往充满了技术性术语和数字&#xff0c;对于初学者或非技术用户来说可能显得晦涩难懂。幸运的是&#xff0c;许多 Linux 命令都提供了一个非常实用的选项&#…...

selenium的鼠标操作

1、鼠标操作 鼠标时间对应的方法在那个类中&#xff1f; ​ ActionChains类,实例化 鼠标对象 1、context_click(element) # 右击 2、double_click(element) #双击 3、double_and_drop(source, target) # 拖拽 4、move_to_element(element) # 悬停 【重点】 5、perform() …...

STM32——GPIO介绍

GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…...

Word 小黑第15套

对应大猫16 修改样式集 导航 -查找 第一章标题不显示 再选中文字 点击标题一 修改标题格式 格式 -段落 -换行和分页 勾选与下段同页 添加脚注 &#xff08;脚注默认位于底部 &#xff09;在脚注插入文档属性&#xff1a; -插入 -文档部件 -域 类别选择文档信息&#xff0c;域…...

linux自启动服务

在Linux环境中&#xff0c;systemd是一个系统和服务管理器&#xff0c;它为每个服务使用.service文件进行配置。systemctl是用于控制系统服务的主要工具。本文将详细介绍如何使用systemctl来管理vsftpd服务&#xff0c;以及如何设置服务自启动。 使用Systemd设置自启动服务 创…...

react使用拖拽,缩放组件,采用react-rnd解决 -完整版

屏幕录制2025-03-10 10.16.06 以下代码仅提供左侧可视化区域 右侧数据根据你们的存储数据来 大家直接看Rnd标签设置的属性即可&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; /*** 用户拖拽水印的最终位置信息*/ export interface ProductWatermarkValue {wat…...

通过 ElasticSearch的Python API和`curl` 命令获取Elasticsearch 所有索引名称

导言 在大数据管理和实时搜索场景中&#xff0c;Elasticsearch 是一款不可或缺的工具。无论是开发调试、数据维护&#xff0c;还是系统监控&#xff0c;快速列出所有索引名称都是一个高频需求。本文将手把手教你如何通过 Python 客户端连接 Elasticsearch&#xff0c;并用两种方…...

Flutter:StatelessWidget vs StatefulWidget 深度解析

目录 1. 引言 2. StatelessWidget&#xff08;无状态组件&#xff09; 2.1 定义与特点 2.2 代码示例 3. StatefulWidget&#xff08;有状态组件&#xff09; 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…...

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…...

蓝桥杯省赛真题C++B组2024-握手问题

一、题目 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次)。但有 7 个人&#xff0c;这 7 人彼此之间没有进行握手(但这…...

项目实操分享:一个基于 Flask 的音乐生成系统,能够根据用户指定的参数自动生成 MIDI 音乐并转换为音频文件

在线体验音乐创作&#xff1a;AI Music Creator - AI Music Creator 体验者账号密码admin/admin123 系统架构 1.1 核心组件 MusicGenerator 类 负责音乐生成的核心逻辑 包含 MIDI 生成和音频转换功能 管理音乐参数和音轨生成 FluidSynth 集成 用于 MIDI 到音频的转换 …...

Java开发者如何接入并使用DeepSeek

目录 一、准备工作 二、添加DeepSeek SDK依赖 三、初始化DeepSeek客户端 四、数据上传与查询 五、数据处理与分析 六、实际应用案例 七、总结 【博主推荐】&#xff1a;最近发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;风格风趣幽默&#xff…...

多方安全计算(MPC)电子拍卖系统

目录 一、前言二、多方安全计算(MPC)与电子拍卖系统概述2.1 多方安全计算(MPC)的基本概念2.2 电子拍卖系统背景与需求三、MPC电子拍卖系统设计原理3.1 系统总体架构3.2 电子拍卖中的安全协议3.3 数学与算法证明四、数据加解密模块设计五、GPU加速与系统性能优化六、GUI设计与系…...

【数据库系统概论】第十一章 并发控制

第十一章 并发控制 11.1 并发控制概述&#xff08;1&#xff09;丢失修改&#xff08;2&#xff09;不可重复读&#xff08;3&#xff09;读“脏”数据 11.2 封锁11.2.1 封锁的概念11.2.2 基本封锁类型&#xff08;1&#xff09;排它锁/X锁/写锁&#xff08;2&#xff09;共享锁…...

C语言_数据结构总结4:不带头结点的单链表

纯C语言代码&#xff0c;不涉及C 0. 结点结构 typedef int ElemType; typedef struct LNode { ElemType data; //数据域 struct LNode* next; //指针域 }LNode, * LinkList; 1. 初始化 不带头结点的初始化&#xff0c;即只需将头指针初始化为NULL即可 void Init…...

用CSS画一条0.5px的线

上次面试前端被问到了这个问题&#xff0c;感觉有点懵懵的&#xff0c;我就回答了一个scaleY(0.5),这个是真的没想到&#xff0c;希望有需要的朋友可以去看看。随便记住一种就行。 1.第一种方式&#xff1a;通过缩放1px的线条实现视觉上的0.5px效果&#xff0c;兼容性较好。 …...

知识库全链路交互逻辑

阶段顺序 URL输入 → 网络连接 → 前端请求 → 后端处理 → 数据库交互 → 数据返回 → 前端渲染 → 连接关闭 阶段1&#xff1a;用户输入URL 用户行为&#xff1a;在浏览器地址栏输入 https://knowledge.com/search?keyword金融趋势 ​浏览器动作&#xff1a; “浏览器解析U…...

BambuStudio学习笔记:Model

# Model.hpp 核心模型结构说明## 文件概述 该头文件定义了3D打印数据处理的核心数据结构&#xff0c;包含模型对象、体积、实例、材料等关键类。主要功能包括&#xff1a; - 三维模型数据存储与管理 - 模型变换操作&#xff08;平移/旋转/缩放&#xff09; - 打印参数配置 - 多…...

Spring (八)AOP-切面编程的使用

目录 实现步骤&#xff1a; 1 导入AOP依赖 2 编写切面Aspect 3 编写通知方法 4 指定切入点表达式 5 测试AOP动态织入 图示&#xff1a; 一 实现步骤&#xff1a; 1 导入AOP依赖 <!-- Spring Boot AOP依赖 --><dependency><groupId>org.springframewor…...

【Go每日一练】构建一个简单的用户信息管理系统

&#x1f47b;创作者&#xff1a;丶重明 &#x1f47b;创作时间&#xff1a;2025年3月7日 &#x1f47b;擅长领域&#xff1a;运维 目录 1.&#x1f636;‍&#x1f32b;️题目&#xff1a;简单的用户信息管理系统2.&#x1f636;‍&#x1f32b;️代码开发3.&#x1f636;‍&a…...

PathRAG:通过图剪枝的方法优化Graph-based RAG的性能方法浅析

PathRAG 也是一种新型 Graph-based RAG 方法&#xff0c;通过检索索引图中的关键关系路径&#xff0c;减少噪声并优化 LLM 提示。其核心创新在于基于流的剪枝算法和路径为基础的提示策略&#xff0c;特别适用于捕捉复杂数据集中的关系。&#xff08;其实可以看做相比GraphRAG假…...

ElementUI 级联选择器el-cascader启用选择任意一级选项,选中后关闭下拉框

1、启用选择任意一级选项 在 el-cascader 标签上加上配置项&#xff1a; :props"{ checkStrictly: true }"例如&#xff1a; <el-cascaderref"selectedArrRef"v-model"selectedArr":options"optionsList":props"{ checkStri…...

【软件逆向】QQ 连连看小游戏去广告与一键消除实现

目录 一、背景介绍 二、去广告实现 2.1 分析广告加载流程 2.2 逆向分析广告加载逻辑 2.3 去广告方案 三、一键消除外挂实现 3.1 分析游戏逻辑 3.2 编写外挂插件 3.3 注入外挂&#xff1a; 四、一键消除效果展示 五、额外扩展 一、背景介绍 QQ 连连看是一款经典的休闲…...

vue el-select 省市区三级联动 vue + element-ui使用第三方插件实现省市区三级联动

vue el-select 省市区三级联动 vue使用第三方插件实现省市区三级联动 网上找了好多教程,都是使用el-cascader级联选择器的省市区选择器,但是几乎没有三个单独的el-select的进行关联的三级省市联动组件效果 第一步:先安装省市区element-ui的插件 npm install element-china-a…...

【GPT入门】第8课 大语言模型的自洽性

【GPT入门】第8课 大语言模型的自洽性 1.自洽性概念2.代码&#xff08;观察执行结果&#xff09;3.自洽性核心思想 1.自洽性概念 大模型的自洽性&#xff08;self - consistency&#xff09;是指在推理阶段&#xff0c;大模型通过生成多个答案并选择出现频率最高的那个&#x…...

工程化与框架系列(28)--前端国际化实现

前端国际化实现 &#x1f30d; 引言 前端国际化&#xff08;i18n&#xff09;是现代Web应用中的重要组成部分&#xff0c;它能够让应用支持多语言和多地区的用户使用。本文将深入探讨前端国际化的实现方案和最佳实践&#xff0c;包括文本翻译、日期时间格式化、货币处理等方面…...

【阿里云】操作系统控制台操作体验与性能评测全解析

引言 在现代的云计算环境中&#xff0c;操作系统控制台是进行系统管理和运维的重要工具。它不仅帮助用户高效地管理云端资源&#xff0c;还提供了智能助手、系统诊断、性能观测等功能&#xff0c;能够提升操作系统的使用效率&#xff0c;增强用户的操作体验。本文简要介绍了操…...

面试之《IntersectionObserver的使用》

IntersectionObserver 是一个 Web API&#xff0c;用于异步观察目标元素与其祖先元素或顶级文档视口&#xff08;viewport&#xff09;交叉状态的变化。这在很多场景下非常有用&#xff0c;比如懒加载图片、实现无限滚动加载更多内容等。下面详细介绍它的使用方法。 基本原理 …...

在 Spring Boot 2.7.x 中引入 Kafka-0.9 的实践

文章目录 在 Spring Boot 2.7.x 中引入 Kafka-0.9 的实践一、下载 Kafka-0.9二、启动 Zookeeper 和 Kafka三、创建 Spring Boot 项目四、引入 kafka 依赖五、移除 Kafka 自动配置六、编写 Kafka 生产者6.1 Kafka配置类6.2 生产者监听类 七、编写Controller发送Kafka八、验证消费…...

【MACOS】用户数据过多

进入下面的路径下找到.Spotlight-V100文件夹 /System/Volumes/Data修改选线 通过终端权限不够 在finder中进行查看然后解锁 然后添加权限 使用代码查看存储数据。 diskutil apfs list...

鸿蒙系统中的持续部署

鸿蒙操作系统&#xff0c;作为一款面向未来的分布式操作系统&#xff0c;旨在为不同的设备提供统一的操作系统平台。它支持多种终端设备&#xff0c;包括但不限于智能手机、平板电脑、智能穿戴设备和物联网&#xff08;IoT&#xff09;设备等&#xff0c;并且能够实现跨平台的无…...

centos linux安装mysql8 重置密码 远程连接

1. 下载并安装 MySQL Yum 仓库 从 MySQL 官方网站下载并安装 Yum 仓库配置文件。 # 下载MySQL 8.0的Yum仓库包 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm # 安装Yum仓库包 sudo rpm -ivh mysql80-community-release-el7-5.noarch.rpm2. 启…...

几种常见的虚拟环境工具(Virtualenv、Conda、System Interpreter、Pipenv、Poetry)的区别和特点总结

在 PyCharm 中创建虚拟环境是一个非常直接的过程&#xff0c;可以帮助你管理项目依赖&#xff0c;确保不同项目之间的依赖不会冲突。 通过 PyCharm 创建虚拟环境 打开 PyCharm 并选择或创建一个项目。 打开项目设置&#xff1a; 在 Windows/Linux 上&#xff0c;可以通过点击…...

VScode:运行程序停止后,频繁出现终端进程被终止

VScode里面powershell被迫关闭 bug场景排查原因解决办法 bug场景 系统&#xff1a;Windows IDE&#xff1a;Visual Studio Code 停止运行程序后&#xff0c;按向上箭头想要执行上一步命令&#xff0c;忽然终端页面强行关闭&#xff0c;并报错如下&#xff1a; 终端进程 &quo…...

PHP框架加载不上.env文件中的变量

以lumen5.5框架为例&#xff0c;根目录中bootstrap文件夹下的app.php文件中 (new Dotenv\Dotenv(__DIR__./../))->load(); 是读取所有.env中的文件的&#xff0c;这个是正常的&#xff0c;但是在代码中的任何位置或者在config目录下的databases.php里&#xff0c;代码如…...

Linux:基本指令与内涵理解

1.文件操作指令 1.1 ls ls指令用于查看指定层级文件夹下的文件或文件夹 基本格式&#xff1a;ls (选项) (查看层级&#xff09; 其中选项处不写就默认是显示文件名&#xff0c;查看层级默认是当前层级 选项1&#xff1a; -l 作用&#xff1a;将查找文件的详细信息显示出来 我们…...

C++设计模式-抽象工厂模式:从原理、适用场景、使用方法,常见问题和解决方案深度解析

一、模式基本概念 1.1 定义与核心思想 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是创建型设计模式的集大成者&#xff0c;它通过提供统一的接口来创建多个相互关联或依赖的对象族&#xff0c;而无需指定具体类。其核心思想体现在两个维度&#xff1a; …...

LINUX系统安装+添加共享目录

一、前言 Windows或mac系统中创建Linux工作环境是基于VMware和SL(Scientific Linux)&#xff0c;下面分别安装二者。 二、VMware软件安装及注册 1、双击VMware安装包 2、点击下一步 3、 勾选接受许可&#xff0c;并点击下一步 4、更改路径&#xff08;建议更改为容易找到的路…...

《UE5_C++多人TPS完整教程》学习笔记34 ——《P35 网络角色(Network Role)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P35 网络角色&#xff08;Network Role&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephe…...

成为git砖家(9): rebase进阶: 拆分commit为多个

问题描述 当一次性 git add 了多个修改点&#xff0c; 并且快速的执行了 git commit 后&#xff0c; 你觉得有点懊恼&#xff1a; 明明可以独立为两次或多次 commit&#xff0c; 揉在一块导致历史记录不太清晰。 比如我在 nn1 这个练手项目中&#xff0c; 最近一次 commit&am…...

pytorch retain_grad vs requires_grad

requires_grad大家都挺熟悉的&#xff0c;因此穿插在retain_grad的例子里进行捎带讲解就行。下面看一个代码片段&#xff1a; import torch# 创建一个标量 tensor&#xff0c;并开启梯度计算 x torch.tensor(2.0, requires_gradTrue)# 中间计算&#xff1a;y 依赖于 x&#x…...