五、shell脚本--函数与脚本结构:搭积木,让脚本更有条理
随着我们的脚本越来越长、越来越复杂,直接把所有命令堆在一起会变得难以阅读和维护。这时候,函数 (Function) 就派上大用场了!
函数就像一个可以重复使用的代码块,你可以给它起个名字,然后在脚本的任何地方通过名字来调用它执行。这有点像我们生活中的“工具”或者“食谱”:
- 避免重复: 如果有一段代码需要反复使用,把它写成函数,就不用每次都复制粘贴了,干净利落✨。
- 提高可读性: 把特定的功能封装在函数里,主脚本的逻辑就会更清晰,一眼就能看出它在干什么。
- 方便维护: 如果某个功能需要修改,只需要改动对应的函数内部代码就行了,牵一发而动全身的风险大大降低🔧。
一、 函数的定义与调用:创建和使用你的“工具”
1.定义函数的语法
在 Shell 脚本里定义函数主要有两种方式,它们基本是等价的:
方式一 (带 function
关键字):
function 函数名 {# 函数内部的命令...命令1命令2# ...
}
方式二 (更常用,类似 C 语言):
函数名() {# 函数内部的命令...命令1命令2# ...
}
注意: 函数名后面的圆括号 ()
和花括号 {}
是必须的。花括号 {}
里面就是函数要执行的代码体。函数体里的命令并不会在定义时立刻执行。
示例:定义一个简单的问候函数
#!/bin/bash# 使用方式二定义函数
print_hello() {echo "你好,欢迎使用 Shell 函数!"
}
2.调用函数
定义好函数之后,想要执行它里面的代码,只需要在脚本中像调用普通命令一样,直接写函数名就行了。
示例:调用上面定义的函数
#!/bin/bash# 先定义函数
print_hello() {echo "你好,欢迎使用 Shell 函数!"
}# 然后调用它
echo "准备调用函数..."
print_hello # 直接写函数名来调用
echo "函数调用完毕。"
运行这个脚本,你就会看到 你好,欢迎使用 Shell 函数!
这句话被打印出来。
3.函数参数的传递与使用:给“工具”加点料 🔧🔩
函数不仅能执行固定操作,还能接收外部传来的数据,这些数据就叫做参数 (Parameters)。函数内部获取参数的方式和脚本获取命令行参数完全一样:
$1
: 函数接收到的第一个参数。$2
: 函数接收到的第二个参数。- … 以此类推 …
$#
: 传递给函数的参数总个数。$*
: 所有参数组成的单一字符串。$@
: 所有参数组成的独立字符串列表 (推荐用"$@"
来处理)。
调用函数时传递参数: 直接在函数名后面跟上用空格隔开的参数值就行了。
示例:定义并调用一个带参数的问候函数
#!/bin/bash# 定义一个接收名字的函数
greet_user() {# $1 代表传进来的第一个参数 (名字)local user_name=$1 # 把参数存到局部变量里是个好习惯echo "你好, $user_name!很高兴见到你。👋"echo "这次调用一共传入了 $# 个参数。"
}# 调用函数,并传递参数
greet_user "张三" # 把 "张三" 作为 $1 传给函数
greet_user "李四" "王五" # 把 "李四" 作为 $1, "王五" 作为 $2 传进去
4.函数的返回值:告诉外面“我干得怎么样” 🤔✅❌
函数执行完后,怎么告诉调用它的地方“任务完成得如何”或者“结果是什么”呢?Shell 函数主要通过两种方式返回信息:
4.1.退出状态码 (Exit Status): 使用 return
命令 (0-255)
-
作用: 主要用来表示函数执行的成功或失败状态,就像普通命令的退出码一样。
-
命令:
return N
,其中N
是一个0 到 255 之间的整数。 -
约定:
return 0
通常表示成功 ✅,非零值 (1-255) 表示失败或某种错误状态 ❌。 -
如何获取: 在函数调用之后,立刻检查特殊变量
$?
,它的值就是return
命令指定的那个数字 N。如果不使用return
,$?
的值是函数体中最后一条命令的退出状态码。 -
注意:
return
主要用于传递状态信息,不适合用来传递复杂的计算结果或长字符串。示例:检查文件是否存在的函数
#!/bin/bash
# 定义函数,检查文件是否存在
check_file_exists() {local filename=$1if [ -f "$filename" ]; thenecho "调试信息:文件 '$filename' 存在。"return 0 # 文件存在,返回 0 (成功)elseecho "调试信息:文件 '$filename' 不存在。"return 1 # 文件不存在,返回 1 (失败)fi
}# 调用函数并检查返回值 $?
target_file="/etc/passwd"
check_file_exists "$target_file"
status=$? # 立刻保存 $? 的值!echo "检查 $target_file 的退出状态码是: $status"
if [ $status -eq 0 ]; thenecho "检查结果:文件确实存在。"
elseecho "检查结果:文件不存在或不是普通文件。"
fi# 再试一个不存在的文件
check_file_exists "/no/such/file"
status=$?
echo "检查 /no/such/file 的退出状态码是: $status"
# ... 后续判断同上 ...
4.2.标准输出 (stdout): 使用 echo
或其他打印命令 (传递数据)
- 作用: 这是函数向外部传递计算结果、字符串或其他数据的最常用方式。
- 方法: 在函数内部,使用
echo
(或其他会输出到屏幕的命令) 打印你想“返回”的数据。 - 如何获取: 在调用函数的地方,使用命令替换
$(...)
(或者老式的反引号`...`
) 来捕获函数的标准输出,并将其赋值给一个变量。
示例:一个返回问候语字符串的函数
#!/bin/bash
# 定义函数,它会"返回"一个拼接好的字符串
generate_greeting() {local name=$1local time_period="早上" # 简化处理,总是早上好# 注意:这里用 echo 输出结果echo "$time_period 好, $name!"
}# 调用函数并捕获其输出
user="王女士"
# 使用 $(...) 来获取函数的输出
greeting_message=$(generate_greeting "$user")# 现在 $greeting_message 变量里就存着函数的输出了
echo "从函数获取到的问候语是: $greeting_message"
总结 返回值 vs 输出:
- 想表示成功/失败状态?用
return N
,然后检查$?
。 - 想传递数据/结果 (字符串、数字等)?在函数里用
echo
输出,在外面用result=$(函数名 参数)
捕获。 - 别混淆:
return 100
主要是设$?=100
表示一种状态,而echo 100
是把字符串 “100” 输出到屏幕(可以被捕获)。
二、脚本结构与模块化:搭积木,让代码更整洁
把代码写进函数是提高脚本质量的第一步。更进一步,我们可以思考如何组织这些函数,让整个脚本结构更清晰,甚至让一些通用的函数能在多个脚本之间共享。
1.将常用功能封装为函数
想象一下,你在写一个比较大的脚本,里面可能反复需要打印分隔线、记录日志、检查用户输入等。把这些重复出现或逻辑独立的功能各自封装成一个函数,好处多多:
- 代码更简洁: 主流程代码会变短,只剩下调用函数的名字,逻辑一目了然。
- 复用更容易: 定义一次,到处调用。
- 维护更方便: 如果分隔线样式要改,只需要改
print_separator
函数就行了。
示例:使用函数打印分隔线
#!/bin/bash# 定义一个打印分隔线的函数
print_separator() {echo "----------------------------------------"
}# --- 主程序逻辑开始 ---
echo "任务一:处理用户数据"
# ... 执行任务一的代码 ...
echo "用户数据处理完毕。"# 调用函数打印分隔线
print_separatorecho "任务二:生成报告"
# ... 执行任务二的代码 ...
echo "报告生成完成。"# 再次调用函数打印分隔线
print_separatorecho "所有任务结束。"
看,通过调用 print_separator
,我们避免了重复写 echo "------..."
,代码是不是清爽多了?
2.脚本的模块化与可重用性 🧩➡️📦
当你的函数库越来越丰富,有些函数(比如日志记录、通用的数学计算、字符串处理等)可能在很多不同的脚本里都会用到。这时,我们可以把这些通用的函数单独存放在一个或多个文件里(比如叫做 my_utils.sh
),然后在需要它们的脚本中使用 source
命令(或者一个点 .
)把这些函数加载进来。
source
命令 (或.
): 它的作用是在当前 Shell 环境中执行指定文件里的命令。如果那个文件里定义了函数,那么执行source
之后,这些函数在当前脚本里就可用了!
概念示例 (不实际运行,仅作演示):
假设你有一个 utils.sh
文件,内容是:
# 文件名: utils.sh
# 一些通用的工具函数log_message() {local level=$1local message=$2echo "[$(date +'%Y-%m-%d %H:%M:%S')] [$level] $message" >> /var/log/my_app.log
}add_numbers() {echo $(($1 + $2))
}
然后,在你的主脚本 main.sh
里,你可以这样做:
#!/bin/bash
# 文件名: main.sh# 使用 source 命令加载 utils.sh 里的函数定义
source ./utils.sh
# 或者用点 . (注意点和文件名之间有空格)
# . ./utils.sh# 现在可以直接使用 utils.sh 里定义的函数了
log_message "INFO" "主脚本开始执行..."num1=10
num2=20
sum=$(add_numbers $num1 $num2) # 调用来自 utils.sh 的函数
echo "$num1 + $num2 = $sum"log_message "INFO" "主脚本执行完毕。"
通过这种方式,log_message
和 add_numbers
这些通用功能就实现了模块化,可以被多个脚本重用,大大提高了代码的组织性和可维护性。这就是脚本结构优化的重要一步!
三、练习题 🧠✍️
题目一:函数定义与调用
❓ 定义一个名为 show_date
的函数,它不需要参数,执行时打印当前的日期和时间 (可以使用 date
命令)。然后在脚本中调用这个函数。
题目二:函数参数
❓ 定义一个名为 multiply
的函数,接收两个数字作为参数 ($1
和 $2
)。函数内部计算这两个数字的乘积,并使用 echo
打印结果,例如 “Result: N”。然后调用这个函数传递参数 5 和 6。
题目三:函数返回值 (退出状态)
❓ 定义一个函数 is_positive
,接收一个数字作为参数。如果数字大于 0,函数使用 return 0
;否则,使用 return 1
。调用该函数传递 -3
,并根据 $?
的值打印 “数字是正数” 或 “数字不是正数”。
题目四:函数返回值 (捕获输出)
❓ 定义一个函数 get_system_info
,该函数使用 echo
输出字符串 “系统类型: $(uname -s)”。在脚本中调用该函数,并将函数的输出捕获到一个名为 sys_info
的变量中,最后打印这个变量。
题目五:函数的好处
❓ 简单说出使用函数来组织 Shell 脚本代码的主要好处有哪些?(至少说两点)
题目六:模块化概念
❓ 如果你想把一些常用的函数(比如日志函数、检查函数)放到一个单独的文件 common_funcs.sh
里,然后在你的主脚本 my_script.sh
中使用这些函数,你应该在 my_script.sh
的开头使用什么命令来加载 common_funcs.sh
?
四、参考答案 ✅💡
答案一:
#!/bin/bash
# 定义函数
show_date() {echo "当前日期和时间是: $(date)"
}# 调用函数
echo "准备显示日期..."
show_date
echo "日期显示完毕。"
答案二:
#!/bin/bash
# 定义函数
multiply() {local num1=$1local num2=$2local result=$((num1 * num2))echo "计算结果: $result" # 使用 echo 输出结果
}# 调用函数并传递参数
echo "计算 5 * 6 ..."
multiply 5 6 # 输出 "计算结果: 30"
答案三:
#!/bin/bash
# 定义函数
is_positive() {local number=$1if [ $number -gt 0 ]; thenreturn 0 # 正数,返回 0 (成功)elsereturn 1 # 非正数,返回 1 (失败)fi
}# 调用函数并检查退出状态 $?
check_num=-3
echo "检查数字 $check_num 是否为正数..."
is_positive $check_num
status=$? # 立刻获取返回值if [ $status -eq 0 ]; thenecho "结果: 数字是正数。"
elseecho "结果: 数字不是正数。" # 因为传入 -3,应该输出这个
fi
答案四:
#!/bin/bash
# 定义函数
get_system_info() {# 使用 echo 输出信息echo "系统类型: $(uname -s)"
}# 调用函数并捕获输出到变量 sys_info
echo "正在获取系统信息..."
sys_info=$(get_system_info) # 使用命令替换 $(...)# 打印捕获到的信息
echo "获取到的信息是: $sys_info"
答案五:
使用函数的主要好处包括:
- 代码复用 (Reusability): 避免重复编写相同的代码块。
- 提高可读性 (Readability): 主逻辑更清晰,代码结构化。
- 简化维护 (Maintainability): 修改功能只需改动函数内部。
- 模块化 (Modularity): 可以将相关功能组织在一起,甚至放到单独文件。
答案六:
应该在 my_script.sh
的开头使用 source common_funcs.sh
命令,或者用它的简写形式 . common_funcs.sh
(注意点.
和文件名之间有空格)。
相关文章:
五、shell脚本--函数与脚本结构:搭积木,让脚本更有条理
随着我们的脚本越来越长、越来越复杂,直接把所有命令堆在一起会变得难以阅读和维护。这时候,函数 (Function) 就派上大用场了! 函数就像一个可以重复使用的代码块,你可以给它起个名字,然后在脚本的任何地方通过名字来…...
单调栈与单调队列(c艹)、可视化Qt?
单调栈和单调队列的区别在于 ChatGLM 单调栈和单调队列都是数据结构中用于处理序列问题的工具,它们在处理问题时具有不同的特性和应用场景。以下是单调栈和单调队列的主要区别: 定义: 单调栈:是一种特殊的栈,其中的元…...
哈夫曼树和哈夫曼编码
哈夫曼编码一般用来对字符串进行编码格式的表示。其中要克服的最大问题,莫过于就是一串由0或者1组成的编码,你无法区分哪些01组成的编码部分是属于哪些字符的,因此哈夫曼编码的出现解决了这个问题。 在介绍哈夫曼编码之前,先介绍…...
基于 AI 的人像修复与编辑技术:CompleteMe 系统的研究与应用
概述 加利福尼亚大学默塞德分校与 Adobe 的新合作在人像补全领域取得了突破性进展——人像补全是一项备受关注的任务,旨在“揭示”人像中被遮挡或隐藏的部分,可用于虚拟试穿、动画制作和照片编辑等场景。 除了修复损坏的图像或根据用户意愿更改图像外&a…...
spring 使用FactoryBean注入bean
spring 使用FactoryBean注入bean 1、介绍 通常是ApplicationContext,就是IOC容器,ApplicationContext是BeanFactory的实现类,是spring最核心的接口。用getBean来加载bean。BeanFactory相当于是IOC的基础类。而FactoryBean是另一个东西&a…...
AI 编程日报 · 2025 年 5 月 04 日|GitHub Copilot Agent 模式发布,Ultralytics 优化训练效率
1、OpenAI 确认 GPT-4o“谄媚”个性更新已完全回滚 OpenAI 官方已确认,先前推送的一项旨在改进 GPT-4o 模型个性的更新已被完全撤销。该更新最初目标是提升模型的智能与个性,使其交互更直观有效,但实际效果却导致模型表现出过度“谄媚”和“…...
C++ STL简介:构建高效程序的基石
0. 引言 在现代软件开发领域,C语言凭借其强大的性能和灵活性占据着重要地位。而C标准模板库(Standard Template Library,简称STL)作为C标准库的核心组件,更是开发者手中不可或缺的利器。它犹如一座知识宝库࿰…...
大模型(LLMs)RAG 版面分析——文本分块面
大模型(LLMs)RAG 版面分析——文本分块面 一、为什么需要对文本分块? 二、能不能介绍一下常见的文本分块方法? 2.1 一般的文本分块方法 2.2 正则拆分的文本分块方法 2.3 Spacy Text Splitter 方法 2.4 基于 langchain 的 Cha…...
系统思考:核心价值与竞争力
最近,设计师的小伙伴跟我提到,行业内竞争越来越激烈,大家都开始拼命降价。但从系统思考的角度来看,我想说一句话:“人多的地方,不要去。” 为什么这么说?在竞争愈发激烈的环境中,我…...
【RocketMQ Broker 相关源码】- broker 启动源码(2)
文章目录 1. 前言2. 创建 DefaultMessageStore3. DefaultMessageStore#load3.1 CommitLog#load3.2 loadConsumeQueue 加载 ConsumeQueue 文件3.3 创建 StoreCheckpoint3.4 indexService.load 加载 IndexFile 文件3.5 recover 文件恢复3.6 延时消息服务加载 4. registerProcesso…...
mysql中int(1) 和 int(10) 有什么区别?
困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解…...
jetson orin nano super AI模型部署之路(八)tensorrt C++ api介绍
我们基于tensorrt-cpp-api这个仓库介绍。这个仓库的代码是一个非常不错的tensorrt的cpp api实现,可基于此开发自己的项目。 我们从src/main.cpp开始按顺序说明。 一、首先是声明我们创建tensorrt model的参数。 // Specify our GPU inference configuration optio…...
渗透测试中扫描成熟CMS目录的意义与技术实践
在渗透测试领域,面对一个成熟且“看似安全”的CMS(如WordPress、Drupal),许多初级测试者常陷入误区:认为核心代码经过严格审计的CMS无需深入排查。然而,目录扫描(Directory Bruteforcing&#x…...
数字信号处理学习笔记--Chapter 1 离散时间信号与系统
1 离散时间信号与系统 包含以下内容: (1)离散时间信号--序列 (2)离散时间系统 (3)常系数线性差分方程 (4)连续时间信号的抽样 2 离散时间信号--序列 为了便于计算机对信号…...
LeetCode 热题 100 994. 腐烂的橘子
LeetCode 热题 100 | 994. 腐烂的橘子 大家好,今天我们来解决一道经典的算法题——腐烂的橘子。这道题在LeetCode上被标记为中等难度,要求我们计算网格中所有新鲜橘子腐烂所需的最小分钟数,或者返回不可能的情况。下面我将详细讲解解题思路&…...
软考-软件设计师中级备考 11、计算机网络
1、计算机网络的分类 按分布范围分类 局域网(LAN):覆盖范围通常在几百米到几千米以内,一般用于连接一个建筑物内或一个园区内的计算机设备,如学校的校园网、企业的办公楼网络等。其特点是传输速率高、延迟低、误码率低…...
NHANES指标推荐:LC9
文章题目:Association between lifes crucial 9 and kidney stones: a population-based study DOI:10.3389/fmed.2025.1558628 中文标题:生命的关键 9 与肾结石之间的关联:一项基于人群的研究 发表杂志:Front Med 影响…...
使用 Azure DevSecOps 和 AIOps 构建可扩展且安全的多区域金融科技 SaaS 平台
引言 金融科技行业有一个显著特点:客户期望能够随时随地即时访问其财务数据,并且对宕机零容忍。即使是短暂的中断也会损害用户的信心和忠诚度。与此同时,对数据泄露的担忧已将安全提升到整个行业的首要地位。 在本文中,我们将探…...
原子单位制换算表
速度 0.12.1880.24.3760.36.5640.48.7520.510.940.613.1280.715.3160.817.5040.919.692121.881.532.82243.762.554.7...
【C++重载操作符与转换】下标操作符
目录 一、下标操作符重载基础 1.1 什么是下标操作符重载 1.2 默认行为与需求 1.3 基本语法 二、下标操作符的核心实现策略 2.1 基础实现:一维数组模拟 2.2 多维数组实现:矩阵类示例 三、下标操作符的高级用法 3.1 自定义索引类型:字…...
文章记单词 | 第62篇(六级)
一,单词释义 noon [nuːn] n. 中午,正午clothes [kləʊz] n. 衣服,衣物reward [rɪˈwɔːd] n. 报酬,奖赏;vt. 奖励,奖赏newly [ˈnjuːli] adv. 最近,新近;以新的方式premier [ˈ…...
《CUDA:解构GPU计算的暴力美学与工程哲学》
《CUDA:解构GPU计算的暴力美学与工程哲学》 CUDA 的诞生,宛如在 GPU 发展史上划下了一道分水岭。它不仅赋予了 GPU 走出图形处理的 “舒适区”,投身通用计算的 “新战场” 的能力,更是一场对计算资源分配与利用逻辑的彻底重构。在这场技术革命中,CUDA 以它犀利的架构设…...
Linux ACPI - ACPI系统描述表架构(2)
ACPI系统描述表架构 1.概要 ACPI defines a hardware register interface that an ACPI-compatible OS uses to control core power management features of a machine, as described in ACPI Hardware Specification ACPI also provides an abstract interface for controlli…...
实时在线状态
以下是一个完整的 OnlineUsers 类实现,包含线程安全的在线用户管理功能: import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors;/*** 在线用户管理器(线程安全)* 功能&#…...
《算法导论(第4版)》阅读笔记:p6-p6
《算法导论(第4版)》学习第 4 天,p6-p6 总结,总计 1 页。 一、技术总结 无。 二、英语总结(生词:1) 1. disposal (1)dispose: dis-(“aprt”) ponere(“to put, place”) vt. dispose literally means “to put apart(to separate sth…...
录播课制作技术指南
1.技术版本选择策略 优先采用长期支持版本作为课程开发基础,此类版本在企业级应用中普及度高且稳定性强。技术选型直接影响课程生命周期,稳定的底层框架可降低后续维护成本,避免因技术迭代导致教学内容快速过时。建议定期查看技术社区官方公告…...
【2025软考高级架构师】——知识脑图总结
摘要 本文是一份关于 2025 年软考高级架构师的知识脑图总结。整体涵盖系统工程与信息系统基础、软件工程、项目管理等众多板块,每个板块又细分诸多知识点,如系统工程部分提及系统工程方法、信息系统生命周期等内容,旨在为备考人员提供系统全…...
Allegro23.1新功能之如何设置高压爬电间距规则操作指导
Allegro23.1新功能之如何设置高压爬电间距规则操作指导 Allegro23.1升级到了23.1之后,新增了一个设置高压爬电间距的规则 如下图,不满足爬电间距要求,以DRC的形式报出来了...
**电商推荐系统设计思路**
互联网大厂Java面试实录:马小帅的生死时速 第一轮提问 面试官(严肃地):马小帅,请你先简单介绍一下你过往的项目经验,特别是你在项目中使用的技术栈。 马小帅(紧张地搓手)ÿ…...
BC19 反向输出一个四位数
题目:BC19 反向输出一个四位数 描述 将一个四位数,反向输出。(有前导零的时候保留前导零) 输入描述: 一行,输入一个整数n(1000 < n < 9999)。 输出描述: 针对每组…...
【前端】【面试】在 Vue-React 的迁移重构工作中,从状态管理角度来看,Vuex 迁移到 Redux 最大的挑战是什么,你是怎么应对的?
在从 Vue(Vuex)迁移到 React(Redux)时,状态管理无疑是重构中最具挑战性的部分之一。两者虽本质上都实现了全局状态集中式管理,但在思想、结构与实现方式上存在显著差异。 Vuex 到 Redux 状态管理迁移的挑战…...
ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(一)
消息队列简介 在当今的分布式系统架构中,消息队列(Message Queue,MQ)扮演着举足轻重的角色,已然成为构建高可用、高性能系统不可或缺的组件。消息队列本质上是一种异步通信的中间件,它允许不同的应用程序或…...
OPENGLPG第九版学习 -视口变换、裁减、剪切与反馈
文章目录 5.1 观察视图5.1.1 视图模型—相机模型OpenGL的整个处理过程中所用到的坐标系统:视锥体视锥体的剪切 5.1.2 视图模型--正交视图模型 5.2 用户变换5.2.1 矩阵乘法的回顾5.2.2 齐次坐标5.2.3 线性变换与矩阵SRT透视投影正交投影 5.2.4 法线变换逐像素计算法向…...
大连理工大学选修课——图形学:第一章 图形学概述
第一章 图形学概述 计算机图形学及其研究内容 计算机图形学:用数学算法将二维或三维图形转化为计算机显示器的格栅形式的科学。 图形 计算机图形学的研究对象为图形广义来说,能在人的视觉系统形成视觉印象的客观对象都可称为图形。 既包括了各种几何…...
雅思听力--75个重点单词/词组
文章目录 1. in + 一段时间2. struggle with + doing sth.3. due to + n. / doing sth.4. all kinds of + n.5. supply6. get sb. down7. sth. be a hit8. ups and downs1. in + 一段时间 “in ten minutes”表示“10分钟内”,“in + 一段时间”表示“在一段时间之内”。 You…...
dubbo 参数校验-ValidationFilter
org.apache.dubbo.rpc.Filter 核心功能 拦截RPC调用流程 Filter是Dubbo框架中实现拦截逻辑的核心接口,作用于服务消费者和提供者的作业链路,支持在方法调用前后插入自定义逻辑。如参数校验、异常处理、日志记录等。扩展性机制 Dubbo通过SPI扩展机制动态…...
Fine Structure-Aware Sampling(AAAI 2024)论文笔记和启发
文章目录 本文解决的问题本文提出的方法以及启发 本文解决的问题 传统的基于Pifu的人体三维重建一般通过采样来进行学习。一般选择的采样方法是空间采样,具体是在surface的表面随机位移进行样本的生成。这里的采样是同时要在XYZ三个方向上进行。所以这导致了一个问…...
股票单因子的检验方法有哪些?
股票单因子的检验方法主要包括以下四类方法及相关指标: 一、统计指标检验 IC值分析法 定义:IC值(信息系数)衡量因子值与股票未来收益的相关性,包括两种计算方式: Normal IC:基于Pearson相关系数…...
Android第三次面试总结之activity和线程池篇(补充)
一、线程池高频面试题 1. 为什么 Android 中推荐使用线程池而非手动创建线程?(字节跳动 / 腾讯真题) 核心考点:线程池的优势、资源管理、性能优化答案要点: 复用线程:避免重复创建 / 销毁线程的开销&…...
【Trae+LucidCoder】三分钟编写专业Dashboard页面
AI辅助编码作为一项革命性技术,正在改变开发者的工作方式。本文将深入探讨如何利用Trae的AI Coding功能构建专业的Dashboard页面,同时向您推荐一个极具价值的工具——Lucids.top,它能够将页面截图转换为AI IDE的prompt,从而生成精…...
CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布,带来全新特性与优化
NVIDIA 近日发布了 CUDA Toolkit 12.9,为开发者提供了一系列新功能和改进,旨在进一步提升 GPU 加速应用的性能和开发效率。CUDA Toolkit 是创建高性能 GPU 加速应用的关键开发环境,广泛应用于从嵌入式系统到超级计算机的各种计算平台。 新特…...
chrome 浏览器怎么不自动提示是否翻译网站
每次访问外国语网页都会弹出这个对话框,很是麻烦,每次都得手动关闭一下。 不让他弹出来方法: 设置》语言》首选语言》添加语言,搜索英语添加上 如果需要使用翻译,就点击三个点,然后选择翻译...
编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要
2025年4月22日,Embarcadero发布了针对RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月补丁。此更新旨在提升这些产品的质量,特别关注于Delphi编译器、C 64位现代工具链、RAD Studio 64位IDE及其调试器、VCL库和其他RAD Studio特性。强烈建议所有使…...
Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试
始终报错 . 补充链接 tinfo 库时报错软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本 没有可用软件包 tinfo-devel。 无须任何处理 make LDLIBS“-lncurses"报错编译时报错make LDLIBS”-lncurses" ? /opt/rh/devtoolset-11/roo…...
驱动开发硬核特训 · Day 27(上篇):Linux 内核子系统的特性全解析
在过去数日的练习中,我们已经深入了解了字符设备驱动、设备模型与总线驱动模型、regulator 电源子系统、I2C 驱动模型、of_platform_populate 自动注册机制等关键模块。今天进入 Day 27,我们将正式梳理 Linux 内核子系统的核心特性与通用结构,…...
【学习笔记】深度学习:典型应用
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接…...
万字详解ADC药物Payload
抗体药物偶联物(ADC)是一种有前景的癌症治疗方式,能够选择性地将有效载荷(Payload)细胞毒性分子递送至肿瘤,降低副作用的严重程度。通常ADC由3个关键成分组成:抗体,连接子和有效载荷…...
算法笔记.求约数
代码实现: #include<iostream> using namespace std; #include<vector> void check(int x) {vector<int> v;for(int i 1;i< x/i;i){if(x%i 0) {cout << i<<" ";v.push_back(i);}}for(int i v.size()-1;i>0;i--){…...
Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows]
Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows] 需要有游戏正版基础本体,安装路径不能带有中文,或其它非常规拉丁字符; DLC 版本 至最新全部 DLC 后续可能无法及时更新文章,具体最新版本见下载文件说明 DLC 解锁列表&…...
启发式算法-遗传算法
遗传算法是一种受达尔文生物进化论和孟德尔遗传学说启发的启发式优化算法,通过模拟生物进化过程,在复杂搜索空间中寻找最优解或近似最优解。遗传算法的核心是将问题的解编码为染色体,每个染色体代表一个候选解,通过模拟生物进化中…...