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

微信小程序中缓存数据全方位解惑

微信小程序中缓存数据全方位解惑

微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍:

1. 数据缓存的类型

微信小程序提供了两种数据缓存方式:

  • 本地存储(Local Storage):数据存储在本地,即使小程序关闭后数据依然保留,直到手动清除。
  • 内存存储(Memory Storage):数据存储在小程序的运行内存中,小程序关闭后数据丢失。

2. 数据缓存的API

微信小程序提供了以下API用于数据缓存操作:

2.1 设置缓存

前情:缓存方法后面跟上Sync的就是同步方法,反之就是异步方法

  • 异步设置缓存wx.setStorage

    wx.setStorage({// 设置缓存的名字  key: 'userInfo',// 设置缓存的值  data: { name: '张三', age: 28 },// 设置缓存成功时候调用的方法success: function(res) {console.log('设置成功:', res);},// 设置缓存失败时候调用的方法fail: function(err) {console.error('设置失败:', err);}
    });
    
  • 同步设置缓存wx.setStorageSync

    // 由于是同步的方法,所以用try{}catch(){}格式
    try {// 注意:同步设置缓存与上面的异步方法的参数有所不同// 参数1:存储数据的键名// 参数2:存储的数据wx.setStorageSync('userInfo', { name: '张三', age: 28 }); // 尝试同步设置本地缓存console.log('设置成功'); // 如果设置成功,打印“设置成功”到控制台
    } catch (err) {console.error('设置失败:', err); // 如果设置失败,捕获错误并打印“设置失败:”以及错误信息
    }
    

2.2 获取缓存

  • 异步获取缓存wx.getStorage

    wx.getStorage({key: 'userInfo', // 指定要获取的缓存键(key),这里是 'userInfo'success(res) {   // 成功回调函数,当获取缓存成功时执行console.log('获取成功:', res.data); // 打印获取到的缓存数据,res.data 是缓存的值},fail(err) {      // 失败回调函数,当获取缓存失败时执行console.error('获取失败:', err);   // 打印错误信息,err 是错误对象}
    });
    
  • 同步获取缓存wx.getStorageSync

    try {const userInfo = wx.getStorageSync('userInfo'); // 同步获取本地缓存中键为 'userInfo' 的数据console.log('获取成功:', userInfo);           // 如果获取成功,将获取到的数据打印到控制台
    } catch (err) {console.error('获取失败:', err);             // 如果获取失败,捕获错误并打印错误信息
    }
    

2.3 清除缓存

  • 清除单个缓存wx.removeStorage

    wx.removeStorage({key: 'userInfo', // 指定要删除的缓存键(key),这里是 'userInfo'success(res) {   // 成功回调函数,当删除操作成功时执行console.log('清除成功:', res); // 打印成功信息,res 是返回的结果对象},fail(err) {      // 失败回调函数,当删除操作失败时执行console.error('清除失败:', err); // 打印错误信息,err 是错误对象}
    });
    
  • 同步清除单个缓存wx.removeStorageSync

    try {wx.removeStorageSync('userInfo'); // 同步删除本地缓存中键为 'userInfo' 的数据console.log('清除成功');         // 如果删除成功,打印成功信息
    } catch (err) {console.error('清除失败:', err); // 如果删除失败,捕获错误并打印错误信息
    }
    
  • 清除所有缓存wx.clearStorage

    wx.clearStorage({success(res) { // 成功回调函数,当所有缓存数据被成功清除时执行console.log('所有缓存清除成功:', res); // 打印成功信息,res 是返回的结果对象},fail(err) { // 失败回调函数,当清除操作失败时执行console.error('清除失败:', err); // 打印错误信息,err 是错误对象}
    });
    

3. 缓存策略

3.1 高频更新数据的缓存策略

对于高频更新的数据(如新闻列表),可以采用以下策略:

  1. 初始加载时从服务器获取最新数据并缓存到本地。
  2. 设置缓存过期时间(如1小时),在过期内直接从本地读取。
  3. 缓存过期后自动发起网络请求更新缓存。

示例代码:

// 缓存新闻列表并设置过期时间
wx.setStorageSync('news_list', newsList, 3600 * 1000); // 缓存1小时

3.2 大文件缓存策略

对于大文件(如图片或视频),可以缓存文件的URL而不是文件本身:

  1. 首次加载时,将文件URL保存到本地存储。
  2. 需要显示文件时,检查本地存储是否有URL,若有则直接加载,否则从服务器下载并保存URL。

示例代码:

// 缓存大文件URL
let fileUrl = 'http://example.com/largefile.jpg';
wx.setStorageSync('largefile_url', fileUrl);

4. 注意事项

  1. 存储空间限制:微信小程序的本地存储空间有限(单个key最大1MB),需合理规划。
  2. 数据安全性:敏感数据需加密存储。
  3. 缓存清理:定期清理无用缓存,避免占用过多存储空间。

5. 如何选择

在微信小程序开发中,选择使用同步缓存还是异步缓存取决于具体的应用场景和需求。同步方法(如 wx.setStorageSyncwx.getStorageSync)和异步方法(如 wx.setStoragewx.getStorage)各有优缺点,适用于不同的场景。以下是详细的分析和建议:


5.1 同步缓存方法

特点:
  1. 阻塞当前线程:同步方法会阻塞当前线程,直到操作完成。
  2. 直接返回结果:操作完成后直接返回结果,不需要回调函数。
  3. 代码简洁:适合简单的操作,代码更直观。
适用场景:
  1. 数据量小且操作简单
    • 如果需要存储或读取的数据量较小(例如单个对象或字符串),同步方法可以快速完成操作,不会对用户体验产生明显影响。
    • 示例:存储用户的基本信息(如用户名、头像URL)。
  2. 初始化操作
    • 在页面加载时(如 onLoadonShow 生命周期方法中)加载或设置必要的数据。
    • 示例:加载用户配置或初始化任务列表。
  3. 对性能要求不高
    • 如果操作不会频繁触发,且对性能要求不高,同步方法可以简化代码逻辑。
    • 示例:保存用户设置(如主题颜色、字体大小)。
示例代码:
// 同步保存数据
try {wx.setStorageSync('userInfo', { name: '张三', age: 28 });
} catch (err) {console.error('保存失败:', err);
}// 同步读取数据
try {const userInfo = wx.getStorageSync('userInfo');console.log('读取成功:', userInfo);
} catch (err) {console.error('读取失败:', err);
}

5.2 异步缓存方法

特点:
  1. 非阻塞:异步方法不会阻塞当前线程,操作完成后通过回调函数返回结果。
  2. 适合复杂操作:适合数据量较大或操作频繁的场景。
  3. 用户体验更好:避免因同步操作导致的页面卡顿或白屏。
适用场景:
  1. 数据量大
    • 如果需要存储或读取的数据量较大(例如长列表、大文件路径等),异步方法可以避免阻塞主线程。
    • 示例:保存或加载任务列表、文章内容等。
  2. 操作频繁
    • 如果数据存储或读取操作频繁(例如实时更新数据、频繁读取配置),异步方法可以避免主线程卡顿。
    • 示例:实时更新用户消息列表、频繁读取用户偏好设置。
  3. 需要反馈用户操作
    • 如果需要在操作完成后给用户明确的反馈(如提示框、加载动画),异步方法可以通过回调函数实现。
    • 示例:保存任务后提示用户“保存成功”或“保存失败”。
  4. 与其他异步操作结合
    • 如果需要与其他异步操作(如网络请求、文件操作)结合,异步方法可以更好地管理操作流程。
    • 示例:从服务器获取数据后保存到本地缓存。
示例代码:
// 异步保存数据
wx.setStorage({key: 'userInfo',data: { name: '张三', age: 28 },success() {console.log('保存成功');},fail(err) {console.error('保存失败:', err);}
});// 异步读取数据
wx.getStorage({key: 'userInfo',success(res) {console.log('读取成功:', res.data);},fail(err) {console.error('读取失败:', err);}
});

5.3 总结

使用同步缓存的场景:
  1. 数据量小且操作简单。
  2. 初始化操作(如页面加载时加载数据)。
  3. 对性能要求不高,且代码逻辑需要简洁。
使用异步缓存的场景:
  1. 数据量大或操作复杂。
  2. 操作频繁,需要避免主线程卡顿。
  3. 需要在操作完成后给用户反馈。
  4. 需要与其他异步操作结合。

5.4 最佳实践

  1. 小数据量优先使用同步方法:如果数据量小且操作简单,同步方法可以简化代码逻辑。
  2. 大数据量或频繁操作使用异步方法:如果数据量大或操作频繁,异步方法可以提升用户体验。
  3. 结合实际需求:根据具体需求选择合适的方法,必要时可以混合使用同步和异步方法。

希望这些分析和建议能帮助你更好地选择合适的缓存方法!

6. 实战示例

以下是一个完整的示例,展示如何在两个页面之间通过缓存传递数据:

完整示例1(存入数据)

<view><!-- 每当用户输入内容时,getInput 方法会被触发。 --><input placeholder="输入信息" bind:input="getInput" /><button bind:tap="saveInput">存入</button>
</view>
Page({data: {storage: '' // 定义页面数据,初始值为空字符串,用于存储用户输入的内容},getInput(e) { // 获取输入框的值,e就是表单中输入的值this.setData({ storage: e.detail.value }); // 使用 setData 更新页面数据,将输入框的值赋给 storage},saveInput() { // 保存输入的内容到本地缓存wx.setStorageSync('storage', this.data.storage); // 同步将页面数据 storage 保存到本地缓存,键为 'storage'}
});

完整示例2(读取数据)

<view>从存储中得到的数据:{{storage}}</view>
Page({data: {storage: '' // 定义页面数据,初始值为空字符串,用于存储从本地缓存获取的内容},onLoad() { // 页面加载时触发的生命周期方法wx.getStorage({ // 调用异步方法获取本地缓存中的数据key: 'storage', // 指定要获取的缓存键success: (res) => { // 成功回调函数this.setData({ storage: res.data }); // 使用 setData 更新页面数据,将获取到的缓存数据赋值给 storage}});}
});

通过以上内容,您可以更好地理解和应用微信小程序中的数据缓存功能,从而提升小程序的性能和用户体验。

7. 实战案例-任务列表

7.1 功能需求

  1. 添加任务:用户可以输入任务内容并添加到任务列表。
  2. 查看任务列表:用户可以查看所有未完成的任务。
  3. 完成任务:用户可以标记任务为已完成。
  4. 删除任务:用户可以删除不再需要的任务。

7.2 页面结构和逻辑

我们将使用两个文件:

  1. index.wxml:页面的结构文件。
  2. index.js:页面的逻辑文件。
1. 页面结构文件(index.wxml
<view class="container"><!-- 页面的最外层容器 --><view class="header"><!-- 页面头部,包含输入框和添加按钮 --><input type="text" placeholder="请输入任务" bind:input="getInput" /><!-- 输入框,用户可以在这里输入任务内容 --><!-- bind:input="getInput":绑定输入事件,当用户输入时触发页面的 getInput 方法 --><button bind:tap="addTask">添加任务</button><!-- 添加按钮,用户点击后触发页面的 addTask 方法,将输入的任务添加到任务列表 --></view><view class="task-list"><!-- 任务列表的容器 --><block wx:for="{{tasks}}" wx:key="id"><!-- 使用 wx:for 循环渲染任务列表 --><!-- tasks:页面数据中的任务数组 --><!-- wx:key="id":指定循环的唯一键值,提升渲染性能 --><view class="task-item" bind:tap="toggleTask" data-id="{{item.id}}"><!-- 每个任务项 --><!-- bind:tap="toggleTask":点击任务项时触发页面的 toggleTask 方法 --><!-- data-id="{{item.id}}":为任务项绑定一个自定义属性,存储任务的唯一 ID --><text class="{{item.completed ? 'completed' : ''}}">{{item.content}}</text><!-- 显示任务内容 --><!-- class="{{item.completed ? 'completed' : ''}}":根据任务的完成状态动态添加样式 --><!-- 如果任务已完成(item.completed 为 true),添加 'completed' 样式 --><button bind:tap="deleteTask" data-id="{{item.id}}">删除</button><!-- 删除按钮,点击后触发页面的 deleteTask 方法 --><!-- data-id="{{item.id}}":为删除按钮绑定任务的唯一 ID --></view></block></view>
</view>
2. 页面逻辑文件(index.js
Page({data: {tasks: [], // 任务列表newTask: '' // 当前输入的任务内容},// 在页面加载时调用 loadTasks 方法,从本地缓存加载任务列表onLoad() {this.loadTasks(); // 页面加载时加载任务},// 当用户输入时触发的方法,再用this.setData把输入框中的值,赋值到data区中的newTaskgetInput(e) {this.setData({ newTask: e.detail.value }); // 获取输入框的内容},// 添加任务的方法addTask() {// 解构赋值,等同于 const newTask = this.data.newTaskconst { newTask } = this.data;// trim() 方法会移除字符串两端的空格(包括空格、制表符、换行符等)if (newTask.trim() === '') {// 调用微信小程序的 wx.showToast 方法,显示一个提示框。// icon: 'none':指定提示框的图标类型为无图标(none)wx.showToast({ title: '任务不能为空', icon: 'none' });// return终止当前函数的执行return;}// 将一个新的任务对象添加到任务列表中// Array.prototype.concat() 方法是用来合并数组的,它会返回一个新的数组,而不会修改原始数组const newTasks = this.data.tasks.concat({id: Date.now(), // 使用时间戳生成唯一 IDcontent: newTask,completed: false // 默认未完成});this.setData({ tasks: newTasks, newTask: '' }); // 更新任务列表并清空输入框// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新(添加过的)过的任务数组this.saveTasks(newTasks); // 保存任务到本地缓存},// 当用户点击任务项时,会触发 toggleTask 方法// 该方法会找到对应的任务并切换其完成状态,然后更新页面数据并保存到本地缓存toggleTask(e) {// 参数e为设置的自定义属性 data-id="{{item.id}}"const taskId = e.currentTarget.dataset.id; // a.获取任务的唯一 ID// b.map方法遍历任务列表const tasks = this.data.tasks.map(task => {// c.通过id找到被点击的任务if (task.id === taskId) { task.completed = !task.completed; // d.切换任务的完成状态}return task; // 返回任务对象});this.setData({ tasks }); // e.更新页面数据// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新过(切换状态)的任务数组this.saveTasks(tasks); // f.保存任务到本地缓存},// 删除任务的方法deleteTask(e) {// 参数e为设置的自定义属性 data-id="{{item.id}}"const taskId = e.currentTarget.dataset.id; // a.获取任务的唯一 ID// 用filter方法,通过传过来的id将点击删除的任务项过滤掉,生成一个新的数组tasksconst tasks = this.data.tasks.filter(task => task.id !== taskId); // b.过滤掉被删除的任务this.setData({ tasks }); // c.更新页面数据// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新过(删除过的)的任务数组this.saveTasks(tasks); // d.保存任务到本地缓存},// 方法 saveTasks,用于将任务列表保存到本地缓存// 在上面的几个更改任务列表(tasks)的几个方法中调用saveTasks(tasks) {try {wx.setStorageSync('tasks', tasks); // 将任务保存到本地缓存} catch (err) {console.error('保存任务失败:', err);}},// loadTasks作用:从微信小程序的本地缓存中加载任务列表,并将其设置为页面数据loadTasks() {try {const tasks = wx.getStorageSync('tasks') || []; // 从本地缓存加载任务列表this.setData({ tasks }); // 更新页面数据} catch (err) {console.error('加载任务失败:', err); // 捕获并打印错误信息}}
});

7.3 功能说明

  1. 添加任务
    • 用户在输入框中输入任务内容,点击“添加任务”按钮。
    • 新任务会被添加到任务列表中,并保存到本地缓存。
  2. 查看任务列表
    • 任务列表通过 wx:for 循环渲染,显示所有未完成的任务。
    • 如果任务已完成,任务内容会显示为划线样式(通过 class="completed" 实现)。
  3. 完成任务
    • 点击任务项时,任务的完成状态会切换(未完成变为已完成,已完成变为未完成)。
    • 更新后的任务列表会保存到本地缓存。
  4. 删除任务
    • 点击任务项中的“删除”按钮,任务会被从列表中移除。
    • 更新后的任务列表会保存到本地缓存。

7.4 本地缓存的使用

  • 保存任务:使用 wx.setStorageSync 将任务列表保存到本地缓存。
  • 加载任务:页面加载时,通过 wx.getStorageSync 从本地缓存中加载任务列表。

7.5 样式文件(可选)

你可以在 index.wxss 文件中添加样式,使页面更美观:

.container {padding: 20px;
}
.header {display: flex;margin-bottom: 20px;
}
.header input {flex: 1;margin-right: 10px;
}
.task-item {display: flex;justify-content: space-between;padding: 10px 0;border-bottom: 1px solid #ccc;
}
.task-item text {flex: 1;
}
.completed {text-decoration: line-through;color: #ccc;
}

7.6 总结

这个案例展示了如何使用微信小程序的本地缓存功能来实现一个简单的代办任务应用。通过 wx.setStorageSyncwx.getStorageSync 方法,任务数据可以持久化存储,并在页面加载时恢复。

相关文章:

微信小程序中缓存数据全方位解惑

微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段&#xff0c;跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍&#xff1a; 1. 数据缓存的类型 微信小程序提供了两种数据缓…...

python语言进阶之函数

目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…...

Mybatis-扩展功能

逻辑删除乐观锁 MyBatisPlus从入门到精通-3&#xff08;含mp代码生成器&#xff09; Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解&#xff0c;很不灵活 希望用枚举类来代替这个Integer 这样的话我…...

青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理

青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理 一、授权授权的主要特点和作用授权的类型应用场景 二、权限系统使用Django内置的权限系统使用组管理权限使用第三方库在视图中应用权限 三、权限管理示例步骤 1: 创建Django项目和应用步骤 2: 定义模型和权限步骤 …...

Baklib知识中台构建企业智能运营核心架构

内容概要 在数字化转型的浪潮中&#xff0c;企业对于知识的系统化管理需求日益迫切。Baklib作为新一代的知识中台&#xff0c;通过构建智能运营核心架构&#xff0c;为企业提供了一套从知识汇聚到场景化落地的完整解决方案。其核心价值在于将分散的知识资源整合为统一的资产池…...

Java爬虫获取1688商品搜索API接口的实现指南

在电商数据分析、市场调研以及商品选品等领域&#xff0c;按关键字搜索1688商品并获取相关数据是一项重要的任务。本文将详细介绍如何使用Java爬虫技术&#xff0c;通过1688的API接口按关键字搜索商品&#xff0c;并解析返回的数据。以下是实现的完整步骤和代码示例。 一、前期…...

Ubuntu启动geteck/jetlinks实战:Docker启动

参考&#xff1a; JetLinks 物联网基础平台 安装Docker Ubuntu下载安装Docker-Desktop-CSDN博客 sudo apt install -y docker-compose 下载源码 # github亦可 git clone https://gitee.com/jetlinks/jetlinks-community.git cd jetlinks-community 启动 cd docker/run-a…...

保姆级GitHub大文件(100mb-2gb)上传教程

GLF&#xff08;Git Large File Storage&#xff09;安装使用 使用GitHub desktop上传大于100mb的文件时报错 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…...

【16届蓝桥杯寒假刷题营】第2期DAY1I

4.有向无环的路径数 - 蓝桥云课 问题描述 给定 N 个节点 M 条边的有向无环图&#xff0c;请你求解有多少条 1 到 N 的路径。 由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模后的结果。 输入格式 第一行包含 2 个正整数 N,M&#xff0c;表示有向无环图的节…...

WEB安全--SQL注入--PDO与绕过

一、PDO介绍&#xff1a; 1.1、原理&#xff1a; PDO支持使用预处理语句&#xff08;Prepared Statements&#xff09;&#xff0c;这可以有效防止SQL注入攻击。预处理语句将SQL语句与数据分开处理&#xff0c;使得用户输入的数据始终作为参数传递给数据库&#xff0c;而不会直…...

SQL与数据库程序设计

1.1986年&#xff0c;10月美国国家标准局颁布了SQL语言的美国标准&#xff0c;称为SQL86 2.SQL(Structured Query Language)又称为结构化查询语言 3.建立索引的主要目的是加快查找的速度 4.在基本表上建立一个或者多个索引 5. 一个基本表是最多只能建立一个聚簇索引 6.CAL…...

软考高级《系统架构设计师》知识点(五)

计算机网络 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。 计算机网络的功能&#xff1a;数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标&#xff1a;速率、带宽(频带宽度或…...

DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

Ubuntu 系统 LVM 逻辑卷扩容教程

Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中&#xff0c;LVM&#xff08;Logical Volume Manager&#xff09;是一种逻辑卷管理工具&#xff0c;允许管理员动态调整磁盘空间&#xff0c;而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷&#xff0c;以实现…...

美团一面,有点难度。

一位粉丝朋友分享了最近参与美团民宿旅游业务线的一面的经历&#xff0c;全程约1小时&#xff0c;面试官围绕高并发、分布式事务、性能优化等高频考点展开追问&#xff0c;问题密集且注重落地细节。以下是完整问题整理回答思路扩展解析&#xff0c;助你避坑&#xff01; 一、项…...

7-Zip Final绿色版:高效压缩解压缩工具

在工作与学习旅程中&#xff0c;我们时常需要与各式各样的文件和文件夹打交道。为了更有效地利用存储空间或促进文件的便捷传输&#xff0c;压缩与解压工具自然而然地成为了我们不可或缺的助手。在众多同类工具中&#xff0c;7-Zip凭借其高效能、免费及开源的特性&#xff0c;深…...

详解如何使用Pytest内置Fixture tmp_path 管理临时文件

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 临时目录在测试中起着至关重要的作用&#xff0c;它为执行和验证代码提供了一个可控…...

QML使用ChartView绘制饼状图

一、工程配置 首先修改CMakeLists.txt&#xff0c;按下图修改&#xff1a; find_package(Qt6 6.4 REQUIRED COMPONENTS Quick Widgets) PRIVATEtarget_link_libraries(appuntitledPRIVATE Qt6::QuickPRIVATE Qt6::Widgets )其次修改main.cpp&#xff0c;按下图修改&#xff…...

用大模型学大模型03-数学基础 概率论 最大似然估计(MLE)最大后验估计(MAP)

https://metaso.cn/s/r4kq4Ni 什么是最大似然估计&#xff08;MLE&#xff09;最大后验估计&#xff08;MAP&#xff09;&#xff1f;深度学习中如何应用&#xff0c;举例说明。 好的&#xff0c;我现在需要回答关于最大似然估计&#xff08;MLE&#xff09;和最大后验估计&…...

Rust学习总结之结构体(一)

一&#xff1a;结构体定义 定义结构体&#xff0c;需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着&#xff0c;在大括号中&#xff0c;定义每一部分数据的名字和类型&#xff0c;我们称为 字段&#xff08;field&#xf…...

【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决

问题描述 我们将Debug版本的安装包发送到手机上安装&#xff0c;会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码&#xff1a; android.injected.testOnlyfalse 最后点击“Sync now”&#xff0c;等待重新加载gradle资源即可 后面我们重新编译Debug安装…...

Ubuntu添加桌面快捷方式

以idea为例 一. 背景 在ubuntu中&#xff0c;很多时候是自己解压的文件并没有桌面快捷方式&#xff0c;需要自己找到对应的目录的执行文件手动打开&#xff0c;很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…...

day09_实时类标签/指标

文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…...

排序算法的魔法世界:用C语言揭开数据排列的奥秘

当数据开始跳集体舞:排序的意义 想象你面前有一群调皮的数字精灵在开派对,7和3在跳探戈,9和1在玩捉迷藏,5和2在抢蛋糕。这时候就需要排序算法这位神奇的派对管家出场了!它像音乐指挥家一样挥动魔棒,让所有数字精灵乖乖排成整齐的队伍。在计算机的世界里,排序算法就是处…...

网页模板免费HTML源码 HTML网页设计模板

在现代网站开发中&#xff0c;拥有一个美观且功能齐全的网页模板是至关重要的。对于许多开发者和设计师来说&#xff0c;获取高质量的免费HTML源码和网页设计模板可以大大简化开发流程。本文将探讨网页模板免费HTML源码的资源、优势以及如何有效利用这些模板。 什么是网页模板…...

Python实现语音识别详细教程【2025】最新教程

文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装必要的库 二、使用 SpeechRecognition 库进行语音识别1.识别本地音频文件2.实时语音识别3. 使用其他语音识别引擎 注意事项 前言 以下是一份较为完整的 Python 语音识别教程&#xff0c;涵盖环境搭建、使…...

与传统光伏相比 城电科技的光伏太阳花有什么优势?

相比于传统光伏&#xff0c;城电科技的光伏太阳花有以下优势&#xff1a; 一、发电效率方面 智能追踪技术&#xff1a;光伏太阳花通过内置的智能追踪系统&#xff0c;采用全球定位跟踪算法&#xff0c;能够实时调整花瓣&#xff08;即光伏板&#xff09;的角度&#xff0c;确…...

Qt——连接MySQL数据库之ODBC的方法详细总结(各版本大同小异,看这一篇就够了)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...

Python的那些事第二十二篇:基于 Python 的 Django 框架在 Web 开发中的应用研究

基于 Python 的 Django 框架在 Web 开发中的应用研究 摘要 Django 是一个基于 Python 的高级 Web 框架,以其开发效率高、安全性和可扩展性强等特点被广泛应用于现代 Web 开发。本文首先介绍了 Django 的基本架构和核心特性,然后通过一个实际的 Web 开发项目案例,展示了 Dj…...

pytest测试专题 - 1.3 测试用例发现规则

<< 返回目录 1 pytest测试专题 - 1.3 测试用例发现规则 执行pytest命令时&#xff0c;可以不输入参数&#xff0c;或者只输入文件名或者目录名&#xff0c;pytest会自己扫描测试用例。那pytest基于什么规则找到用例呢&#xff1f; 文件名&#xff1a;满足文件名称为tes…...