所有问题

汇总常见技术疑问、解决思路和实践经验。

问题答案 12026年5月26日 05:26

Golang 中如何处理 JSON 编码和解码?

在 Go 语言中,处理 JSON 编码和解码主要依赖于 标准库。这个库提供了一些关键的函数和类型来处理 JSON 数据。以下是如何使用这个库进行 JSON 编码和解码的基本步骤:JSON 编码(Marshalling)JSON 编码是指将 Go 语言中的数据结构转换为 JSON 格式的字符串。你可以使用 函数来实现这一点。例子:在这个例子中,我们定义了一个 结构体,并使用 将一个 实例转换成 JSON 字符串。这里 这样的结构体标签用来指定 JSON 键的名称。JSON 解码(Unmarshalling)JSON 解码是指将 JSON 格式的字符串转换回 Go 语言的数据结构。你可以使用 函数来实现这一点。例子:在这个例子中,我们使用 将 JSON 字符串解码成 结构体的实例。注意, 需要一个字节切片和一个指向目标结构体的指针。处理错误在进行编码和解码时,如果输入数据格式不正确或不符合目标结构, 和 都会返回错误。处理这些错误是很重要的,以确保数据正确性和程序的健壮性。总结Go 语言的 库提供了简单而强大的工具,用于处理 JSON 数据的编码和解码。通过结构体标签可以很容易地自定义 JSON 键的名称,使用 和 可以轻松地在 Go 结构体和 JSON 格式之间转换数据。
问题答案 12026年5月26日 05:26

如何在VSCode中创建多个游标

在Visual Studio Code 中创建多个游标可以让你同时在多个位置编辑文本,这对于快速编辑非常有用。以下是几种创建多个游标的方法:1. 使用鼠标和快捷键Alt+点击: 在你需要的每个位置点击鼠标左键的同时按住 键,这样可以在每个点击的位置创建一个新的游标。2. 使用键盘快捷键Ctrl+Alt+向下箭头 或 Ctrl+Alt+向上箭头: 这个快捷键会在当前光标的上方或下方添加一个新的光标。你可以重复按这个组合键来在多个位置添加多个光标。3. 选择相似的文本Ctrl+D: 这个快捷键用于选择文档中下一个与当前选择相同的词或者文本。每按一次,就会增加一个新的光标,选择下一个相同的词或文本。4. 选择所有相似的文本Ctrl+Shift+L: 如果你已经选择了一个词或文本,使用这个快捷键会选择文档中所有相同的词或文本,并在每一个位置创建光标。示例应用场景假设你正在编写一段代码,你需要在多个函数中添加相同的日志语句。你可以选择函数的开始括号 ,然后使用 Ctrl+D 多次选择下一个相同的括号。然后,使用 键和 键移动这些光标到适当位置,接着就可以同时在所有选中的函数中添加日志语句了。使用多个游标可以显著提高编辑效率,特别是在进行重复性较高的编辑任务时。
问题答案 12026年5月26日 05:26

如何在Go中使用变量的打印类型?

在Go语言中,打印变量的类型可以使用包中的函数。可以返回一个对象,表示该变量的类型。通常与包结合使用来输出类型信息。下面是一个具体的例子:在这个例子中,我们定义了四种不同类型的变量:整数、浮点数、字符串和布尔值。通过函数,我们可以获取到每个变量的类型,并通过打印出来。这种方法在调试时特别有用,特别是当你需要确认变量类型或者在处理接口和反射时。运行上面的代码将输出:每个输出明确地显示了相应变量的类型。这种技术在开发中非常实用,特别是在处理复杂的数据结构和接口时,能够快速地识别和确认数据类型。
问题答案 12026年5月26日 05:26

如何在 nestjs 中设置 class-validator 的自定义错误消息?

在NestJS中使用类验证器()设置自定义错误消息时,可以通过传递选项对象来自定义验证器的错误消息。这里是一个具体的例子,展示如何实现此功能:首先,确保您的项目已经安装了和这两个库。如果没有安装,可以通过以下命令安装:然后,在您的 DTO(数据传输对象)中,您需要定义一个枚举类型和使用这个枚举类型的字段,如下所示:在上面的代码中,我们定义了一个名为的枚举,它包含三个可能的角色。在类中,字段被注解为。在装饰器中,我们传递了一个配置对象,其中属性被设置为自定义的错误消息。是一个特殊的占位符,它在错误消息中会被替换为装饰器接收的枚举的允许值。当尝试创建一个实例且字段的值不在枚举中时,将会抛出一个验证错误,错误消息将是我们自定义的消息。这种方式提供了一种灵活的方法来反馈更具体的错误信息,帮助开发者和最终用户更好地理解数据验证失败的具体原因。
问题答案 12026年5月26日 05:26

在VSCode中如何定义多个任务?

在 Visual Studio Code(VSCode)中定义多个任务可以有效地帮助开发者管理和执行多种编译、构建或运行项目的操作。这些任务配置在 文件中。下面我将详细解释如何在 VSCode 中定义多个任务,并提供具体的例子。第一步:打开或创建 文件如果你的项目中还没有 文件,可以通过 -> -> 来创建一个默认模板。选择一个模板,比如 来创建一个基本的 文件。第二步:配置多个任务在 中,你可以通过添加多个任务对象到 数组中来定义多个任务。每个任务对象通常包括以下几个关键属性:: 任务的名称,执行任务时显示的文本。: 任务类型,通常是 或 。: 要运行的命令。: 命令的参数数组。: 任务分组,可以是 或 ,这有助于组织相关任务。例子:定义编译和测试任务假设你有一个 C++ 项目,你可以定义一个编译任务和一个测试任务如下:第三步:执行任务任务定义后,你可以通过以下步骤执行它们:打开命令面板(使用快捷键 或 )。输入 。选择一个任务来执行。结论通过这种方式,VSCode 的 文件提供了一种灵活而强大的方式来定义和管理项目中的多个任务。这有助于简化开发流程,特别是在处理较大或复杂的项目时。
问题答案 12026年5月26日 05:26

如何结合websockets和http来创建一个保持数据最新的REST API?

使用WebSockets和HTTP组合创建保持数据最新的REST API的方法在构建一个实时功能的REST API时,结合使用WebSockets和HTTP是一个非常有效的策略。以下是一个详细的步骤和策略,通过一个例子来展示如何实现这一目标。步骤 1: 设计基本的REST API首先,我们需要设计一个标准的REST API,用以处理客户端的CRUD操作(创建,读取,更新,删除)。这可以通过任何后端技术实现,比如使用Node.js和Express:步骤 2: 引入WebSockets为了使数据保持实时更新,我们采用WebSockets来推送更新到所有已连接的客户端。这里我们可以使用像Socket.io这样的库来简化WebSocket的管理:步骤 3: 同步HTTP和WebSocket通信当通过HTTP接口更新数据时,我们需要使用WebSocket向所有客户端广播这些更改。这确保了每个客户端的数据都是最新的:步骤 4: 客户端的处理客户端需要处理通过WebSocket接收到的数据更新。使用JavaScript的话,可以这样实现:示例:股票价格更新系统假设我们正在开发一个股票价格实时更新系统。后端使用REST API接受新的股票价格输入,并通过WebSocket广播这些更新。每当有新的价格通过HTTP POST提交时,所有订阅了WebSocket服务的客户端都会收到最新的股票价格数组,从而可以实时更新他们的显示界面。这种组合使用HTTP和WebSockets的方法,不仅保证了数据的实时性,也保持了系统架构的清晰和高效。
问题答案 12026年5月26日 05:26

Memset 比 C中的for循环更高效吗?

在C语言中, 和使用 循环来设置内存块的值都是常见的做法。但是, 通常比手写的 循环更高效,原因如下:优化实现: 是标准库中的函数,通常由编译器开发者优化实现。例如,它可能使用特殊的CPU指令,如 SIMD 指令(单指令多数据),这样可以同时设置多个字节,显著提高了性能。减少函数开销:当你使用 循环手动设置内存时,你可能需要多次调用循环体内的代码,这些都增加了CPU执行的负担。而 作为一个函数,经过优化后,可以直接操作较大的内存块,减少了函数调用和循环迭代的开销。代码简洁: 使代码更加简洁和易于理解。使用 可以直接表达"设置一块内存区域为特定值"的意图,而不需要编写额外的循环代码。实际例子假设我们想要设置一个大型数组的所有元素为0。我们可以使用 循环:同样的操作,使用 只需要一行代码:在上述例子中,使用 不仅代码更简洁,而且由于 内部可能使用了更高效的内存操作指令,因此运行速度也可能更快。总结来说,当你需要初始化或者设置较大的数据块时, 通常是更优的选择,因为它具有更好的性能和更高的代码效率。当然,对于简单的或小规模的数据初始化,两者的性能差异可能不是非常明显。
问题答案 12026年5月26日 05:26

如何在Yew web_sys 方法中获取 window.ethereum ?

在使用 库与 Rust 语言来与 Web APIs 进行交互时,要获取 需要使用 提供的 对象以及处理 JavaScript 对象的方法。 是由以太坊的浏览器扩展如 MetaMask 提供的,用于使网页应用能够请求用户的以太坊账号访问权限、发送交易等。步骤 1: 添加依赖首先,确保在 中包含了 的依赖,并启用相应的特性:步骤 2: 使用 Web-sys 访问 Window 对象在 Rust 代码中,你首先需要获取当前的 对象:步骤 3: 获取因为 对象是 JavaScript 中的一个全局对象,它可能不存在(比如用户没有安装 MetaMask)。Rust 和 WebAssembly 预设并不直接支持这种动态属性,因此我们需要使用 和 :例子假设你想要检查用户是否已经安装了 MetaMask 并连接到你的网页应用,你可以在获取到 对象后调用其 API 方法。比如,请求账户访问:这段代码首先使用 来获取 对象,然后通过 函数请求用户的以太坊账户,这是与用户进行交互的一种方式。这里用到了异步处理,因为请求账户访问是一种异步操作。
问题答案 12026年5月26日 05:26

NestJS 和 TypeORM 如何正确处理事务?

在使用NestJs框架和TypeORM进行数据库事务处理时,正确的方法是利用TypeORM的或来控制事务的范围和持久性。下面我会详细介绍这两种方法并附上示例代码。使用 控制事务提供了一个方法,它接受一个执行所有数据库操作的回调函数。此回调函数的参数是一个新的实例(被称为transactional entity manager),它与当前事务相关联。通过这个特定的执行的所有操作都会在同一个事务中进行。示例代码:使用 控制事务提供了更细粒度的控制,包括手动开始和结束事务,以及回滚事务。这在需要更复杂的事务控制逻辑时非常有用。示例代码:总结以上两种方法都是处理NestJs和TypeORM中事务的有效方式。选择哪一种方式主要取决于具体的应用场景和需求。的方法适合大多数情况,特别是当事务逻辑相对简单时;而提供了更高的灵活性和控制力,适合复杂的事务管理。在开发过程中,选择正确的事务管理策略可以帮助保证数据的一致性和完整性,避免可能因多个操作导致的数据问题。
问题答案 12026年5月26日 05:26

Cypress 如何检查背景图是否已加载?

在使用 Cypress 进行端到端测试时,检查背景图像是否已正确加载是一个常见的需求。有多种方法可以实现这一功能,下面我会详细介绍其中一种比较通用的方法。方法:使用 CSS 属性和 JavaScript 验证步骤 1:定位元素并获取 CSS 属性首先,我们需要定位到有背景图像的 HTML 元素,并获取它的 CSS 属性。在 Cypress 中,我们可以使用 来选取元素,然后用 来检查特定的 CSS 属性。步骤 2:提取 URL 并验证图像加载通过上一步获取的 URL,我们可以使用 JavaScript 的 对象来验证图像是否成功加载。这可以通过创建一个新的 Image 对象,将其 属性设置为我们从 CSS 属性中提取的 URL,并监听 和 事件来实现。例子假设我们有一个元素,比如一个 div,它的类名是 ,并且它有一个背景图像。我们想要验证这个背景图是否已经加载。代码将如下所示:这段代码首先确认有 属性,并且属性中包含了 URL。接着,它提取 URL 并使用 对象来检查图像是否能够加载。如果加载成功,Promise 将会解决,测试将会通过。如果无法加载图像,Promise 将会被拒绝,Cypress 测试将会失败。这样的方法提供了一种强大而灵活的方式来验证背景图像的加载状态,确保用户界面按照预期显示。
问题答案 12026年5月26日 05:26

如何在Next-Auth中使用Axios拦截器

在使用Next.js开发应用时,Next-Auth提供了一种简便的方式来处理身份验证。而Axios是一个流行的HTTP客户端,其拦截器功能允许我们在请求发送前后对其进行处理,这对于处理身份验证令牌特别有用。使用Axios拦截器处理Next-Auth令牌的步骤1. 安装必要的依赖首先,确保你的项目中已经安装了和。2. 配置Next-Auth确保在你的Next.js项目中已经正确设置了Next-Auth。通常,这包括在中配置各种选项,例如提供者、数据库等。3. 创建Axios实例并配置拦截器在你的项目中,创建一个统一的Axios实例,并在请求拦截器中添加Token。这里的关键是从Next-Auth的Session中获取Token,并将其附加到每个请求的Authorization头中。4. 使用Axios实例进行API请求现在,每次使用这个Axios实例发送请求时,它都会自动添加Authentication头(如果用户已经登录并且Session中存在Token)。5. 处理Token过期或错误你还可以在响应拦截器中添加逻辑来处理Token过期或其他API错误。结论通过这种方式,使用Axios拦截器在Next-Auth环境中管理HTTP请求变得简单而高效。它不仅帮助保持代码的干净整洁,还能有效管理用户的认证状态,特别是在与API交互时自动处理Token添加和过期。
问题答案 12026年5月26日 05:26

VSCode 如何阻止代码总是重新打开以前的文件或文件夹?

当Visual Studio Code (VS Code) 自动重新打开之前的文件或文件夹时,这通常是因为它默认设置为在启动时恢复上一次会话的工作状态。如果您希望阻止这种行为,您可以通过修改VS Code的设置来实现。具体步骤如下:打开设置:您可以通过点击左下角的齿轮图标,然后选择“设置”,或者通过按下 (Windows/Linux)或 (Mac)快速打开设置界面。修改打开文件的行为:在设置搜索栏中输入 ,这将过滤出相关的设置选项。您会看到一个名为 “Window: Restore Windows”的设置,这个设置控制着VS Code在重新启动时是如何恢复窗口的。默认情况下,它可能设置为 ,即恢复所有窗口。您可以改变这个设置为 ,这样在启动VS Code时,它将不会打开任何以前的文件或文件夹。保存并重启VS Code:修改设置后,确保保存您的更改(通常VS Code会自动保存设置的更改)。重新启动VS Code以确保新的设置生效。通过以上步骤,您应该能够阻止VS Code在每次启动时自动打开之前的文件或文件夹。这可以帮助您每次都以一个干净的工作环境开始,特别是当您在多个项目之间切换,或者不希望自动加载上次会话的内容时非常有用。
问题答案 12026年5月26日 05:26

如何在Go中创建和使用自定义包?

在Go语言中,包(Package)是多个Go源代码的集合,它们一起提供特定的功能,类似于其他语言中的库或模块。创建和使用自定义包的过程如下:1. 创建自定义包步骤一:创建包目录首先,你需要在你的Go工作区(workspace)内的目录下,创建一个新的目录来存放你的包。例如,如果你想创建一个名为的字符串处理包,你可以创建如下目录结构:步骤二:编写包代码在文件中,你可以定义你的函数、结构体等。首先要声明包的名称,它应与目录名称相同:2. 使用自定义包步骤一:在你的项目中导入包在其他Go文件中,你可以通过导入包的路径来使用包。假设你的Go工作区的路径设置正确,并且你的项目文件位于同一工作区内,你可以这样导入和使用包:注意,导入路径可以根据你的项目结构和GOPATH的设置有所不同。步骤二:编译并运行你的程序确保你的GOPATH设置正确,然后在你的主程序目录中运行和命令来编译和运行你的应用程序。你将看到输出结果为。3. 分享和重用包创建好自定义包后,你可以通过版本控制系统如Git进行管理,并将其托管在GitHub等平台上。通过这种方式,其他开发者可以通过命令来安装和使用你的包。例如,如果你的包托管在GitHub上:这样,其他开发者就可以在他们的项目中导入和使用你的包了。通过遵循上述步骤,你可以简单地在Go中创建自定义包,并分享给其他开发者使用,从而提高代码的复用性和项目的模块化程度。
问题答案 12026年5月26日 05:26

VSCode 如何为行尾添加分号?

在 Visual Studio Code 中,行尾自动添加分号主要有两种方法:一是通过配置编辑器的设置,二是使用扩展插件来实现。方法一:配置编辑器的设置打开设置:你可以通过点击左下角的齿轮图标,选择“设置”,或者直接按 快捷键打开设置界面。修改设置:在搜索栏中输入 ,找到“在保存时格式化”的选项,确保它被勾选。接下来,在搜索栏中输入 ,找到“默认格式化程序”并选择“Prettier - Code formatter”(需要事先安装Prettier插件)。确保你的项目中或全局的 文件配置了 ,这样可以在每行末尾添加分号。保存文件:每次保存文件时,如果你的设置和格式化程序配置正确,它会自动在行尾添加分号。方法二:使用扩展插件安装扩展:在 Visual Studio Code 中,打开扩展视图(可以点击侧边栏的方块图标或使用快捷键 )。搜索 “Prettier - Code formatter” 并安装。Prettier 是一个流行的代码格式化工具,它支持多种语言并允许定制化设置,包括自动在行尾添加分号。配置 Prettier:创建或修改项目根目录下的 文件,加入以下配置:这样设置后,Prettier 在格式化代码时会自动在语句末尾添加分号。使用快捷键格式化代码:你可以通过按 (或在命令面板中搜索“Format Document”并选择)来格式化当前文档。确保当前文件的格式化程序设置为 Prettier。通过上述两种方法,你可以很容易地在 Visual Studio Code 中配置和使用代码格式化工具,以自动在行尾添加分号,从而保持代码的整洁和一致性。
问题答案 12026年5月26日 05:26

Jest 如何模拟上下文提供程序中的单个状态变量?

在使用 Jest 进行单元测试时,如果我们的组件依赖于上下文提供的状态变量,我们需要确保在测试环境中有效地模拟这些状态变量。这里,我将用一个具体的例子来说明如何模拟 React 上下文中的单个状态变量。假设我们有一个名为 的上下文,它提供了一个名为 的状态变量和一个修改该变量的函数 。我们的目标是在不改变全局状态的情况下,为测试目的模拟这个 变量。步骤 1: 创建上下文首先,我们创建一个 。步骤 2: 编写组件假设我们有一个简单的组件,它依赖于 。步骤 3: 模拟上下文进行测试当我们需要测试这个 组件时,我们可以使用 Jest 和 来模拟 。在这个测试中,我们通过 来截获 调用,并确保它返回我们预设的 。这样,无论 钩子内部怎样调用 ,它都会接收到我们为测试目的而设定的 值。这种方法的优点是我们可以精确控制上下文中的值,而且不需要实际渲染提供者组件,使得测试更快并且隔离于其它状态变化。这对于单元测试来说非常适用。
问题答案 12026年5月26日 05:26

C语言指针打印:`% p ` 格式化符与空指针输出

在C语言中,使用格式化符号来打印指针是标准做法,这是用来输出指针变量的地址。根据C语言标准(例如ISO/IEC 9899),当使用函数与格式化符号打印指针时,应传递一个类型的指针。关于空指针(通常是用定义),标准规定使用打印时应传递一个类型的指针。尽管代表的是一个无效的地址,使用来打印它是定义良好的行为。通常情况下,打印指针会输出类似于或这样的结果,这取决于具体的实现和平台。例如,下面的代码段演示了如何在C程序中安全地打印一个空指针:在这个例子中,是一个初始化为的空指针。使用来打印时,我们可以预期输出结果为或,这完全取决于编译器和运行平台的实现。总结来说,使用来打印空指针在C语言中是定义良好且合法的行为,不会导致未定义行为。但是,开发者应确保在打印时传递正确的类型(),以避免潜在的类型不匹配问题。
问题答案 12026年5月26日 05:26

如何允许<input type=“ file ”>只接受图片文件?

要限制 元素只接受图像文件,可以通过设置 属性来指定接受的文件类型。 属性可以接受一个或多个由逗号分隔的文件类型描述符。例如,如果您想只允许用户上传图像文件,您可以将 属性设置为接受常见的图像文件格式,如下所示:在这个例子中, 属性设置了三种图像格式:- PNG 格式- JPEG 格式- GIF 格式当用户点击这个输入字段以选择文件时,文件对话框将会过滤并只显示这些特定的图像文件类型,从而使用户更容易选择正确类型的文件,减少错误上传非图像文件的机会。您也可以使用通配符 来允许所有类型的图像文件:这种设置允许用户上传任何类型的图像文件,而不限于特定的几种格式。这可能更方便,但如果您想确保只接受特定的图像格式,前一个方法更加合适和严格。
问题答案 12026年5月26日 05:26

如何在vue.js应用的生产环境中禁用源代码映射?

在Vue.js中,源代码映射(sourcemaps)主要用于开发环境,以帮助开发者调试代码。但在生产环境中,出于安全和性能的考虑,通常需要禁用源代码映射。下面是如何在Vue.js应用程序的生产环境中禁用源代码映射的步骤:修改 文件:首先,确保你的项目根目录下有一个 配置文件。如果没有,你需要创建一个。**设置 选项为 **:在 文件中,可以通过设置 选项为 来禁用生产环境的源代码映射。这样做将阻止Vue CLI在构建生产版本时生成 文件。重新构建应用:修改配置后,需要重新构建你的应用。可以通过运行以下命令来完成:或者如果你是使用 :这个命令会根据 中的配置生成生产环境的代码。通过这些步骤,你的Vue.js应用的生产版本就不会包含源代码映射文件,这可以帮助隐藏源代码的结构和细节,增加应用的安全性,并可能略微提升加载性能。示例场景:假设我在为一个在线银行应用工作,我们非常重视应用的安全性和加载速度。在一个迭代中,我们注意到生产环境的应用包含了源代码映射,这可能帮助潜在的攻击者分析我们的代码结构。为了解决这个问题,我按照上述步骤禁用了源代码映射,并通过CI/CD流水线自动化地重新部署了应用。这个改动有效地减少了安全风险并提升了应用的加载速度。
问题答案 12026年5月26日 05:26

Kotlin 如何对查询参数进行url编码

在Kotlin中,对查询参数进行URL编码是一个常见的需求,特别是在处理Web API请求时。URL编码确保URL是合法的,可以正确地通过互联网传输。在Kotlin中,我们可以使用Java的标准库来进行编码。下面是一个具体的例子:在这个例子中:我们先导入了和。定义了一个函数,它接受一个字符串参数,并返回编码后的字符串。这里使用了方法,它需要两个参数:要编码的字符串和字符集。在函数中,我们创建了一个原始的查询参数,然后调用函数对其进行编码,最后打印原始和编码后的参数。这样,你就可以确保传递到Web API的参数是安全和有效的,避免了因特殊字符导致的问题。
问题答案 12026年5月26日 05:26

如何使用浏览器开发者工具检查 webkit 输入占位符

当我们需要检查 的样式时,可以通过浏览器内置的开发者工具进行操作。以下是具体的步骤: 首先,使用浏览器打开包含有占位符文本(placeholder)的输入框(通常是 或 标签)的网页。接着,右键点击需要检查的输入框,并选择“检查”(Inspect)或者使用快捷键(如在Chrome中通常是 或 )打开开发者工具。在开发者工具的元素(Elements)面板中,定位到相对应的输入框的HTML代码,确保它已经被选中。在样式(Styles)侧边栏,你通常可以看到元素的CSS样式。但是由于 是一个伪元素,它的样式可能不会直接展现出来。要检查 的样式,我们需要在样式侧边栏中手动添加一个新的伪元素选择器。比如,如果你的输入框有一个类名为 ,那么你可以添加如下样式规则来检查:添加后,如果输入框有相应的 样式,它们将会出现在样式侧边栏中,你就可以检查和修改这些样式。例如,你可以更改文字的颜色、字体大小、字体样式等。如果你需要看到实时的变化,可以在开发者工具中直接编辑这些样式规则,并观察输入框中的占位符文本样式如何变化。举例来说,如果我想要检查一个类名为 的输入框的占位符样式,并且想将其颜色改为灰色,我可以这样操作:右键点击对应的输入框,选择“检查”打开开发者工具。在Elements面板中找到 这一行。在Styles侧边栏中,点击"+ New Style Rule"按钮。在新的样式规则中输入 。接着添加 这一CSS属性。随即可以看到输入框中占位符的文字颜色变为了灰色。通过这种方式,开发人员可以很方便地调试和定制占位符的样式,以满足设计的需求。这对于保证网页在不同浏览器中的一致性和提升用户体验来说非常重要。