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

SQLiteC/C++接口详细介绍之sqlite3类(三)

 快速跳转文章列表:SQLite—系列文章目录

上一篇:SQLiteC/C++接口详细介绍之sqlite3类(二)
 下一篇:SQLiteC/C++接口详细介绍之sqlite3类(四)

 6.sqlite3_create_module与sqlite3_create_module_v2函数

用于创建自定义SQLite模块。创建自定义模块可以让SQLite具有更高的灵活性并满足不同的需求,开发者可以使用该函数创建自己的模块创建自定义的SQL函数、聚合函数和虚拟表等功能。

要使用sqlite3_create_module_v2函数创建自定义模块,需要先定义一个sqlite3_module结构体,该结构体包含了自定义模块需要实现的一组回调函数。这些回调函数通过sqlite3_create_module_v2函数注册到SQLite数据库中。
如下2中格式

int sqlite3_create_module(sqlite3 *db,               /*SQLite数据库的句柄,用于指定该模块所属的数据库*/const char *zName,         /* 模块的名字,在SQLite数据库中必须唯一,用于描述该模块的作用和功能 */const sqlite3_module *p,   /* 自定义模块的结构体,包含了自定义模块需要实现的回调函数 */void *pClientData          /* 自定义的客户端数据指针,用于在回调函数中传递数据*/
);
int sqlite3_create_module_v2(sqlite3 *db,               /* SQLite数据库的句柄,用于指定该模块所属的数据库 */const char *zName,         /* 模块的名字,在SQLite数据库中必须唯一,用于描述该模块的作用和功能 */const sqlite3_module *p,   /*自定义模块的结构体,包含了自定义模块需要实现的回调函数*/void *pClientData,         /*自定义的客户端数据指针,用于在回调函数中传递数据 */void(*xDestroy)(void*)     /*模块销毁时候执行的自定义函数指针 */
);

两个函数返回值为整型,如果注册成功,返回 SQLITE_OK 表示成功,否则返回其他错误码,表示注册失败。一旦注册成功,该自定义模块就可以在SQLite数据库中使用了。

注意:

        sqlite3_create_module_v2函数最后一个参数xDestroy是可选的,用于指定自定义模块销毁时执行的函数指针。当该可选参数不为空时,SQLite数据库在销毁该模块时将调用该函数。在该函数中,开发者可以释放模块中使用的不再需要的内存、关闭打开的文件和句柄等清理工作。如果不需要执行销毁函数的操作,可以将 xDestroy 参数设置为NULL,在这种情况下,SQLite不会调用任何函数。在绝大多数情况下,xDestroy参数都被设置为NULL。

下面是一个简单的例子来说明如何使用sqlite3_create_module_v2来创建一个自定义SQLite模块以实现自定义的SQlite函数:

#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
// 自定义函数:计算两个整数之和
static void sumFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
{if (argc == 2 && sqlite3_value_type(argv[0]) == SQLITE_INTEGER && sqlite3_value_type(argv[1]) == SQLITE_INTEGER) {sqlite3_int64 a = sqlite3_value_int64(argv[0]);sqlite3_int64 b = sqlite3_value_int64(argv[1]);sqlite3_int64 sum = a + b;sqlite3_result_int64(context, sum);} else {sqlite3_result_error(context, "Invalid arguments for sum function", -1);}
}
// 定义module结构体,注册自定义函数
static sqlite3_module myModule = {0, 0, 0, 0, 0, 0, 0,0,0,sumFunc};
int main(void)
{sqlite3 *db;char *errMsg;// 打开数据库if (sqlite3_open(":memory:", &db) != SQLITE_OK) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);exit(1);}// 注册自定义模块if (sqlite3_create_module_v2(db, "myfunc", &myModule, NULL, NULL) != SQLITE_OK) {fprintf(stderr, "Can't create module: %s\n", sqlite3_errmsg(db));sqlite3_close(db);exit(1);}// 测试自定义模块char *sql = "SELECT myfunc(1, 2)";if (sqlite3_exec(db, sql, NULL, NULL, &errMsg) != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", errMsg);sqlite3_free(errMsg);sqlite3_close(db);exit(1);}sqlite3_close(db);return 0;
}

在上面的例子中,我们首先实现了一个自定义函数 sumFunc,该函数可以计算两个整数的和。然后,我们定义了一个 myModule sqlite3_module 结构体,将自定义函数通过模块结构体注册到 SQLite 数据库中。

接下来,我们在程序中通过 sqlite3_open() 函数打开了一个内存数据库,并通过 sqlite3_create_module_v2() 函数将自定义模块注册到 SQLite 中。最后,我们使用sqlite3_exec()函数测试了自定义函数的功能,完成测试后关闭了 SQLite 数据库。

7.sqlite3_errstr类函数

        可以使用它来将 SQLite 中的错误码转换为相应的文本信息。当执行 SQLite 数据库的 C API 函数时,可能会出现各种错误,例如:SQL 语法错误、数据库不存在或文件打开失败等。此时,SQLite 数据库会返回一个错误码,用户可以使用 sqlite3_errstr() 函数将这个错误码转换为一个描述错误的对应信息。这种对 SQLite 错误码的转换可以帮助程序员快速了解错误所在,更方便地进行问题排查和处理。sqlite3_errstr() 此函数包含一个整形参数错误码,当传递到该函数的错误码是SQLite数据库中存在的错误码之一时,sqlite3_errstr() 返回该错误码的文本表示。否则,该函数返回 "unknown error" 的字符串。相关函数如下:

int sqlite3_errcode(sqlite3 *db);
int sqlite3_extended_errcode(sqlite3 *db);
const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);
const char *sqlite3_errstr(int);
int sqlite3_error_offset(sqlite3 *db);

如果与数据库连接D关联的最新sqlite3_*API调用失败,则sqlite3_errcode(D)接口返回该数字结果代码或扩展结果代码API调用。sqlite3_extended_errcode()interface是相同的,只是它始终返回扩展结果代码,即使扩展结果代码是禁用。
sqlite3_errcode()和/或sqlite3_extended_errcode()可能会随着每次API调用而更改。除了,有些接口保证永远不会更改错误代码的值。保留错误代码接口包括:
sqlite3_errcode()
sqlite3_extended_errcode()
sqlite3_errmsg()
sqlite3_errmsg16()
sqlite3_error_offset()
sqlite3_errmsg()和sqlite3_errmsg16()返回英语描述错误的文本,分别为UTF-8或UTF-16,如果没有可用的错误消息,则为NULL。(请参阅SQLite如何处理无效的UTF,了解此规则的例外情况。用于保存错误消息字符串的内存在内部进行管理。应用程序无需担心释放结果。但是,错误字符串可能会被覆盖或解除分配对其他SQLite接口函数的后续调用。
sqlite3_errstr(E)接口返回英文文本将结果代码E描述为UTF-8,如果E不是文本错误消息可用的结果代码。用于保存错误消息字符串的内存在内部进行管理并且不得由应用程序释放。
如果最近的错误引用了输入中的特定标记SQL,sqlite3_error_offset()接口返回字节偏移量该令牌的开头。返回的字节偏移量sqlite3_error_offset()假定输入SQL为UTF8。如果最近的错误未引用输入中的特定标记SQL,则sqlite3_error_offset()函数返回-1。
当使用序列化线程模式时,它可能是如果在两者之间的单独线程上发生第二个错误第一个错误的时间和对这些接口的调用。发生这种情况时,将报告第二个错误,因为这些接口始终报告最新结果。避免这样一来,每个线程都可以获得数据库连接D的独占使用通过在开始之前调用sqlite3_mutex_enter(sqlite3_db_mutex(D))使用D并在之后调用sqlite3_mutex_leave(sqlite3_db_mutex(D))对此处列出的接口的所有调用均已完成。
如果接口出现故障并SQLITE_MISUSE,则表示接口被应用程序错误地调用。在这种情况下,可以设置错误代码和消息,也可以不设置错误代码和消息。 

8.sqlite3_prepare类函数

是SQLite C API中用于编译和准备SQL语句的函数之一。使用sqlite3prepare函数可以将一个SQL字符串编译成SQLite内部认识的字节码,该字节码包含了该SQL语句执行的计划。如果该SQL语句后面有参数,那么sqlite3prepare函数会使用占位符代替它们,并返回一个sqlite3stmt类型的指针,该指针可以用于为SQL语句绑定参数、执行SQL语句和获取语句执行的结果。

相关函数:

int sqlite3_prepare(sqlite3 *db,            /* 数据库句柄 */const char *zSql,       /* SQL语句,UTF-8编码 */int nByte,              /* zSql的最大长度,以字节为单位 */sqlite3_stmt **ppStmt,  /* 输出:语句句柄 */const char **pzTail     /* 输出:zSql未使用的部分的指针 */
);
int sqlite3_prepare_v2(sqlite3 *db,            /* 数据库句柄 */const char *zSql,       /* SQL语句,UTF-8编码 */int nByte,              /* zSql的最大长度,以字节为单位 */sqlite3_stmt **ppStmt,  /* 输出:语句句柄 */const char **pzTail     /* 输出:zSql未使用的部分的指针 */
);
int sqlite3_prepare_v3(sqlite3 *db,            /* 数据库句柄 */const char *zSql,       /* SQL语句,UTF-8编码 */int nByte,              /* zSql的最大长度,以字节为单位 */unsigned int prepFlags, /* 零个或多个SQLITE_PREPARE_标志 */sqlite3_stmt **ppStmt,  /* 输出:语句句柄 */const char **pzTail     /* 输出:zSql未使用的部分的指针 */
);
int sqlite3_prepare16(sqlite3 *db,            /* 数据库句柄 */const void *zSql,       /* SQL语句,UTF-16编码 */int nByte,              /* zSql的最大长度,以字节为单位 */sqlite3_stmt **ppStmt,  /* 输出:语句句柄 */const void **pzTail     /* 输出:zSql未使用的部分的指针 */
);
int sqlite3_prepare16_v2(sqlite3 *db,            /* 数据库句柄 */const void *zSql,       /* SQL语句,UTF-16编码 */int nByte,              /* zSql的最大长度,以字节为单位 */sqlite3_stmt **ppStmt,  /* 输出:语句句柄 */const void **pzTail     /* 输出:zSql未使用的部分的指针 */
);
int sqlite3_prepare16_v3(sqlite3 *db,            /* 数据库句柄 */const void *zSql,       /* SQL语句,UTF-16编码 */int nByte,              /* zSql的最大长度,以字节为单位 */unsigned int prepFlags, /* 零个或多个SQLITE_PREPARE_标志 */sqlite3_stmt **ppStmt,  /* 输出:语句句柄 */const void **pzTail     /* 输出:zSql未使用的部分的指针 */
);

上述函数均用于准备 SQL 语句并将其编译成可执行的字节码。其中:

- 参数 db 是数据库连接句柄。
- 参数 zSql 是要编译的 SQL 语句,可以是 UTF-8 或 UTF-16 编码。
- 参数 nByte 是 SQL 语句的最大长度,以字节为单位。
- 参数 ppStmt 是输出参数,该函数将编译后的语句句柄存储在该指针中。
- 参数 pzTail 是输出参数,该函数将指向未使用的 SQL 语句部分的指针存储在该指针中。

sqlite3_prepare_v3和sqlite3_prepare16_v3函数带有一个额外的参数,即零个或多个SQLITE_PREPARE_标志,可以控制语句如何被准备和编译。

函数返回 SQLITE_OK 表示成功,否则返回其他错误码。

说明:

要执行SQL语句,必须首先将其编译为字节码使用这些例程之一进行编程。或者,换句话说,这些例程是预准备语句对象的构造函数。
首选例程是sqlite3_prepare_v2()。sqlite3_prepare()接口是遗留的,应避免使用。sqlite3_prepare_v3()有一个额外的“prepFlags”选项,用于用于特殊目的。
首选使用UTF-8接口,因为目前是SQLite使用UTF-8进行所有解析。提供UTF-16接口为了方便起见。UTF-16接口的工作原理是将将文本输入到UTF-8中,然后调用相应的UTF-8接口。
第一个参数“db”是从之前成功调用sqlite3_open()、sqlite3_open_v2()或sqlite3_open16()。数据库连接不得已关闭。
第二个参数“zSql”是要编译、编码的语句作为UTF-8或UTF-16。sqlite3_prepare()、sqlite3_prepare_v2()、和sqlite3_prepare_v3()接口使用UTF-8和sqlite3_prepare16()、sqlite3_prepare16_v2()、和sqlite3_prepare16_v3()使用UTF-16。
如果nByte参数为负数,则zSql将读取到第一个零终结者。如果nByte为正数,则它是从zSql读取的字节数。如果nByte为零,则没有准备语句生成。如果调用方知道提供的字符串是nul终止的,则传递一个nByte参数有一个很小的性能优势,即是输入字符串中的字节数,包括NUL终止符。
如果pzTail不为NULL,则*pzTail指向第一个字节过了zSql中第一个SQL语句的末尾。仅限这些例程编译zSql中的第一个语句,因此*pzTail指向什么仍未编译。
*ppStmt指向已编译的预准备语句,该语句可以是使用sqlite3_step()执行。如果出现错误,则设置*ppStmt设置为NULL。如果输入文本不包含SQL(如果输入为空string或注释),则*ppStmt设置为NULL。调用过程负责删除已编译的SQL语句在完成后使用sqlite3_finalize()。ppStmt不能为NULL。
成功后,sqlite3_prepare()系列例程返回SQLITE_OK;否则返回错误代码。
sqlite3_prepare_v2()、sqlite3_prepare_v3()、sqlite3_prepare16_v2()、和sqlite3_prepare16_v3()接口建议用于所有新程序。较旧的接口(sqlite3_prepare()和sqlite3_prepare16())为了向后兼容而保留,但不建议使用它们。在“vX”接口中,预准备语句返回的(sqlite3_stmt对象)包含原始SQL文本。这会导致sqlite3_step()接口在三种方式上表现不同:
如果数据库架构发生更改,而不是按原样返回SQLITE_SCHEMA总是用来做,sqlite3_step()会自动重新编译SQL语句,然后尝试再次运行它。在sqlite3_step()放弃并返回错误之前,将发生多达SQLITE_MAX_SCHEMA_RETRY次重试。
发生错误时,sqlite3_step()将返回详细的错误代码或扩展错误代码之一。遗留行为是sqlite3_step()只会返回泛型SQLITE_ERROR结果代码应用程序必须再次调用sqlite3_reset()才能找到问题的根本原因。使用“v2”准备接口,则会立即返回错误的根本原因。
如果特定值绑定到host参数WHERE子句可能会影响语句的查询计划选择,然后语句将自动重新编译,就好像曾经有过一样架构更改,在进行任何更改后的第一个sqlite3_step()调用时添加到该参数的绑定中。WHERE子句参数的特定值可能会影响如果参数是LIKE或GLOB运算符的左侧,或者将参数与索引列进行比较,则选择查询计划并启用SQLITE_ENABLE_STAT4编译时选项。
sqlite3_prepare_v3()与sqlite3_prepare_v2()的不同之处仅在于具有额外的prepFlags参数,它是一个由零或更多SQLITE_PREPARE_*标志。这sqlite3_prepare_v2()接口的工作原理与sqlite3_prepare_v3()的prepFlags参数为零。
上述函数均用于准备SQL语句并将其编译成可执行的字节码。其中:
-参数db是数据库连接句柄。
-参数zSql是要编译的SQL语句,可以是UTF-8或UTF-16编码。
-参数nByte是SQL语句的最大长度,以字节为单位。
-参数ppStmt是输出参数,该函数将编译后的语句句柄存储在该指针中。
-参数pzTail是输出参数,该函数将指向未使用的SQL语句部分的指针存储在该指针中。
sqlite3_prepare_v3和sqlite3_prepare16_v3函数带有一个额外的参数,即零个或多个SQLITE_PREPARE_标志,可以控制语句如何被准备和编译。
函数返回SQLITE_OK表示成功,否则返回其他错误码。

参考文献:

1. C-language Interface Specification for SQLite官方说明文档

相关文章:

SQLiteC/C++接口详细介绍之sqlite3类(三)

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;四&#xff09; 6.sqlite3_create_module与sqlite3_create_module_v2函数…...

Xcode调试Qt 源码

在Mac下使用Xcode 开发Qt程序&#xff0c;由于程序断点或者崩溃后&#xff0c;Qt库的堆栈并不能够正确定位到源码的cpp文件&#xff0c;而是显示的是汇编代码&#xff0c;导致不直观的显示。 加载的其他三方库都是同理。 所以找了攻略和研究后&#xff0c;写的这篇文章。 一&a…...

CVE-2019-5782:kArgumentsLengthType 设置偏小导致优化阶段可以错误的去除 CheckBound 节点

文章目录 环境搭建漏洞分析笔者初分析笔者再分析漏洞触发源码分析 漏洞利用总结 环境搭建 sudo apt install pythongit reset --hard b474b3102bd4a95eafcdb68e0e44656046132bc9 export DEPOT_TOOLS_UPDATE0 gclient sync -D// debug version tools/dev/v8gen.py x64.debug ni…...

uni-app微信小程序上拉加载,下拉刷新

pages.json配置官网链接 onPullDownRefresh、onReachBottom函数跟生命周期同级 data() {return {orderList:[],total: null, //总共多少条数据page: 1,pageSize: 10,} }, onLoad() {}, mounted(){this.getInfo() }, methods:{getInfo(){API.getListxxx().then(res > {const…...

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本...

C++中的多值返回:解锁函数返回值的神奇力量

C中的多值返回&#xff1a;解锁函数返回值的神奇力量 在C编程中&#xff0c;有时候我们需要从函数中返回多个值。虽然C中的函数通常只能返回一个值&#xff0c;但有几种技术和惯用法可以实现返回多个值的效果。本文将介绍C中实现多值返回的几种常用方法&#xff0c;包括引用、指…...

D咖智能咖啡机:营业利器,品质与效率的完美结合

D咖作为中国知名国产商用全自动咖啡机品牌&#xff0c;持续引领商用全自动智能咖啡机赛道技术、产品、创新的行业新标准&#xff0c;目前为全国几十个地区提供全场景自助咖啡机解决方案&#xff0c;并获得了广泛的认可和口碑。 一、便捷操作&#xff1a;一键即可享受美味咖啡 在…...

江科大stm32学习笔记【6-2】——定时器定时中断定时器外部时钟

一.定时器定时中断 1.原理 2.硬件 3.程序 此时CK_PSC72M&#xff0c;定时1s&#xff0c;也就是定时频率为1Hz&#xff0c;所以可以PSC7200-1,ARR10000-1。 Timer.c: #include "stm32f10x.h" // Device headerextern uint16_t Num;//声明跨文件的…...

go优雅重试

实现思路&#xff1a; 重试配置定义最大重试次数和固定重试间隔&#xff1b;使用接口优雅传递可选重试配置参数&#xff1b;重试的模板方法必须返回错误&#xff0c;且只有一个返回值&#xff1b;如果需要使用被重试方法的返回值&#xff0c;使用匿名方法包一层真实方法并在匿…...

Python最常用的库

本文章主要为大家总结&#xff0c;9个Python最常用的包及使用案例 1 NumPy 描述: NumPy 是 Python 的一个扩展库&#xff0c;支持高维数组与矩阵运算&#xff0c;并为数组运算提供了大量的数学函数库。它是科学计算中的基础包之一&#xff0c;用于处理大型多维数组和矩阵的运…...

C++面试100问(八)

C中栈溢出的解决办法有哪些&#xff1f; 1&#xff09;、增加栈内存的数目&#xff1b;如果是不超过栈大小但是分配值小的&#xff0c;就增大分配的大小 2&#xff09;、使用堆内存&#xff1b;具体实现由很多种方法可以直接把数组定义改成指针,然后动态申请内存;也可以把局部变…...

【Git】Github 上commit后,绿格子contribution却不显示?不知道怎么弥补?解决方法在这里

github 上commit后&#xff0c;绿格子&#xff08;contribution&#xff09;却不显示 问题描述 今天一直在github上面commit代码&#xff0c;但是github中并没有显示自己的contribution&#xff08;没有绿色的格子&#xff09;&#xff0c;全是空白&#xff0c;网上一查是因为…...

【Vue3】源码解析-Runtime

文章目录 系列文章packages/runtime-dom/src/index.ts初始化创建renderermount \src\runtime-core\component.jsh.tspackages/runtime-core/src/renderer.ts挂载及卸载DOM节点render packages/runtime-dom/src/nodeOps.tspackages/runtime-core/src/apiCreateApp.ts创建appmoun…...

常见面试题之计算机网络

1. OSI 五层模型&#xff08;或七层模型&#xff09;是什么&#xff0c;每一层的作用是什么 应用层&#xff1a;又可细分为应用层、表示层、会话层。其中应用层主要做的工作就是为应用程序提供服务&#xff0c;常见的协议为 HTTP、HTTPS、DNS等&#xff1b;表示层主要做的工作…...

C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)

C进阶&#xff1a;详解多态&#xff08;多态、虚函数、抽象类以及虚函数原理详解&#xff09; 结束了继承的介绍&#xff1a;C进阶&#xff1a;详细讲解继承 那紧接着的肯定就是多态啦 文章目录 1.多态的概念2.多态的定义和实现2.1多态的构成条件2.2虚函数2.2.1虚函数的概念2…...

【Hadoop大数据技术】——MapReduce经典案例实战(倒排索引、数据去重、TopN)

&#x1f4d6; 前言&#xff1a;MapReduce是一种分布式并行编程模型&#xff0c;是Hadoop核心子项目之一。实验前需确保搭建好Hadoop 3.3.5环境、安装好Eclipse IDE &#x1f50e; 【Hadoop大数据技术】——Hadoop概述与搭建环境&#xff08;学习笔记&#xff09; 目录 &#…...

02、字面量与变量

二、字面量与变量 文章目录 二、字面量与变量1、字面量字面量类型扩展&#xff1a;特殊字符 2、变量进制转换 3、数据类型 1、字面量 字面量又叫做常量&#xff0c;字面值常量&#xff0c;告诉程序员数据在程序中的书写格式。 字面量类型 整数类型(int)&#xff1a;不带小数点…...

docker的常用指令

docker的常用指令 从docker镜像仓库&#xff0c;搜索所有和mysql有关的镜像 docker search mysql 从docker仓库拉取mysql docker pull mysql这里的mysql是指使用search搜索出来的所有容器的NAME 如果和我一样遇到以下问题&#xff1a; 我可以登录阿里云的官网&#xff0c;找…...

19 OpenCV 霍夫曼变换检测圆

文章目录 cv::HoughCircles算子参数示例 cv::HoughCircles 因为霍夫圆检测对噪声比较敏感&#xff0c;所以首先要对图像做中值滤波。 基于效率考虑&#xff0c;Opencv中实现的霍夫变换圆检测是基于图像梯度的实现&#xff0c;分为两步&#xff1a; 检测边缘&#xff0c;发现可能…...

leetcode代码记录(摆动序列

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...