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

【Gorm】模型定义

intro

package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用该驱动来连接和操作 SQLite 数据库。
)type Product struct {gorm.Model //  嵌入GORM 内置的模型结构,包含 ID、CreatedAt、UpdatedAt、DeletedAt 四个字段Code  stringPrice uint
}func main() {db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) // 使用 SQLite 驱动打开名为 "test.db" 的数据库文件,并用默认配置初始化 GORMif err != nil {panic("failed to connect database")}// 迁移 schemadb.AutoMigrate(&Product{}) // 根据 Product 结构体自动创建或更新数据库中的表结构,确保数据表与结构体一致。// Create 在数据库中插入一条新记录db.Create(&Product{Code: "D42", Price: 100})// Readvar product Product // 用来存储查询结果db.First(&product, 1) // 根据整型主键查找db.First(&product, "code = ?", "D42") // 通过条件查找,查找 code 字段值为 D42 的记录// Update - 将 product 的 price 更新为 200db.Model(&product).Update("Price", 200)// Update - 更新多个字段// 使用结构体 Product 作为参数更新多个字段,此方式只会更新结构体中非零值的字段。db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段// 使用 map 更新字段,可以同时更新多个字段,不受非零值的限制db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})// Delete - 删除 productdb.Delete(&product, 1)
}
  • gorm.Config{}:这是一个结构体字面量,用于创建一个 gorm.Config 类型的实例,其中的各个字段都被赋予了默认的零值(如果没有显式指定)。
  • & 运算符:在结构体字面量前加 &,表示取这个实例的地址,也就是生成一个指向 gorm.Config 实例的指针。
  • 传递指针而非值,可以使函数 gorm.Open 修改或读取配置,同时也避免了结构体值的拷贝。

数据库迁移(schema migration)

  • 定义:数据库迁移是指对数据库表结构进行创建、修改或删除的过程。
  • 自动迁移:GORM 提供了 AutoMigrate 方法,可以根据你的 Go 结构体(模型)自动创建或更新数据库中的表结构。
    • 示例:db.AutoMigrate(&User{}) 会检查 User 模型,并自动生成或调整表结构来匹配这个模型。
  • 优点
    • 让你无需手动编写 SQL 语句来创建或修改表结构。
    • 保证模型和数据库结构保持一致。
  • 局限性
    • 对于复杂的结构变更(如大规模数据迁移、索引优化等),可能需要手动编写迁移脚本。

结构体标签和反射

  • 结构体标签:了解 Go 中标签的语法和使用场景,特别是如何利用标签为字段添加元信息。

    • 概念:在 Go 中,你可以在结构体字段后面加上反引号(```)内的标签,这些标签是一些字符串,用来存储额外的信息。
    • 用途
      • 用于告诉 GORM 如何将这个字段映射到数据库中的列,比如指定列名、数据类型、约束条件等。
      • 也常见于 JSON 序列化,告诉程序如何将字段转换为 JSON 格式。
    type User struct {Name  string `gorm:"column:user_name;type:varchar(100);not null" json:"name"`Email string `gorm:"unique;not null" json:"email"`
    }
    // Name 字段在数据库中将映射为 user_name 列,类型为 varchar(100) 且不能为空
    // 同时在 JSON 中使用 name 作为键
    
  • 反射机制:虽然不必深入,但需要了解反射是如何在运行时读取结构体标签并据此执行操作的。

    • 反射是 Go 语言的一种特性,它允许程序在运行时检查变量的类型、结构以及标签等信息。

    • 用途

      • GORM 就是通过反射读取结构体标签,从而了解如何把结构体字段和数据库表的列对应起来。
      • 反射可以动态地获取类型信息,使得代码更灵活,但同时也会带来一定的性能开销。
      import ("fmt""reflect"
      )type User struct {Name string `gorm:"column:user_name" json:"name"`
      }func main() {user := User{Name: "Alice"}t := reflect.TypeOf(user)field, _ := t.FieldByName("Name")fmt.Println("GORM标签:", field.Tag.Get("gorm"))fmt.Println("JSON标签:", field.Tag.Get("json"))
      }

      这段代码利用反射获取了 User 结构体中 Name 字段的 gormjson 标签信息。

time.Time 的基本用法和常见操作

GORM 会自动处理时间戳字段。

获取当前时间:now := time.Now()// 使用 Format 方法将时间转换为字符串
formatted := now.Format("2006-01-02 15:04:05")// 使用 time.Parse 将字符串转换为 time.Time 类型
t, err := time.Parse("2006-01-02", "2025-04-06")// 比较时间:可以使用 Before、After、Equal 等方法比较两个时间的先后。

模型定义

模型定义

  • 映射机制:GORM 将 Go 语言中的结构体(struct)映射为数据库中的表。定义模型就是编写对应的结构体。
  • 字段类型:模型字段可以使用基本类型(如 uintstringuint8)、指针(如 *string*time.Time)以及特殊类型(如 sql.NullStringsql.NullTime)来处理可空值
  • 自动管理的时间戳:如果定义了 CreatedAtUpdatedAt 字段,GORM 会在创建和更新记录时自动填充当前时间。
  • 非导出字段:结构体中首字母小写的字段不会映射到数据库中。

内置模型(gorm.Model)

  • GORM 提供了预定义结构体 gorm.Model,包含了常用的字段:
    • ID(主键)
    • CreatedAt(创建时间)
    • UpdatedAt(更新时间)
    • DeletedAt(软删除字段,支持索引)
  • 嵌入 gorm.Model 可以让你快速拥有一套标准的字段。

约定与自动行为

  • 主键约定:默认使用名为 ID 的字段作为主键。

  • 表名和列名:GORM 会自动将结构体名转换为 snake_case 的复数形式(例如 User 变为表名 users),而字段名也转换为 snake_case。

  • 自动时间戳:除了自动填充 CreatedAtUpdatedAt 外,还支持通过标签(如 autoCreateTimeautoUpdateTime)自定义时间精度(秒、毫秒、纳秒)。

    type User struct {CreatedAt time.Time // 在创建时,如果该字段值为零值,则使用当前时间填充UpdatedAt int       // 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充Updated   int64 `gorm:"autoUpdateTime:nano"` // 使用时间戳纳秒数填充更新时间Updated   int64 `gorm:"autoUpdateTime:milli"` // 使用时间戳毫秒数填充更新时间Created   int64 `gorm:"autoCreateTime"`      // 使用时间戳秒数填充创建时间
    }
    

标签和字段配置

  • 字段级控制:使用标签可以设置字段的数据库列名、数据类型、大小、默认值以及约束(如非空、唯一、索引等)。

    type Product struct {ID          uint   `gorm:"primaryKey"`                                   // 主键字段Code        string `gorm:"column:product_code;type:varchar(100);not null;unique;index"` // 指定列名为 product_code,数据类型为 varchar(100),非空、唯一并创建索引Price       uint   `gorm:"default:0;not null"`                           // 默认值为 0,且不允许为空Description string `gorm:"type:text;default:'no description'"`           // 指定数据类型为 text,并设置默认描述
    }
    • column:将 Code 字段映射到数据库的 product_code 列。
    • type:设置数据库中的数据类型。
    • not null、unique、index:添加非空、唯一和索引约束。
    • default:指定默认值。
  • 权限控制:标签还支持配置字段在 CRUD 操作中的读写权限(例如只创建、只更新或完全忽略)。

    type User struct {Name string `gorm:"<-:create"` // 允许读和创建Name string `gorm:"<-:update"` // 允许读和更新Name string `gorm:"<-"`        // 允许读和写(创建和更新)Name string `gorm:"<-:false"`  // 允许读,禁止写Name string `gorm:"->"`        // 只读(除非有自定义配置,否则禁止写)Name string `gorm:"->;<-:create"` // 允许读和写Name string `gorm:"->:false;<-:create"` // 仅创建(禁止从 db 读)Name string `gorm:"-"`  // 通过 struct 读写会忽略该字段Name string `gorm:"-:all"`        // 通过 struct 读写、迁移会忽略该字段Name string `gorm:"-:migration"`  // 通过 struct 迁移会忽略该字段
    }
    
    • 理解箭头方向

      • <- 表示写入(写操作)

        数据从外部传入数据库时走 <-。(意味着在写入操作(无论创建或更新)时允许该字段参与。)

      • -> 表示读取(读操作)

        数据从数据库中输出时走 ->。(意味着在读取操作时允许该字段参与。)

    • 后缀部分(如 :create:updatefalse)用于进一步限制操作时机:

      • <-[操作] 限定写入操作
        • <-:create仅在创建时写入,更新时不允许写入。
        • <-:update仅在更新时写入,创建时不允许写入。
        • <-创建和更新都允许写入
        • <-:false禁止写入,相当于只读。
      • >[操作] 限定读取操作
        • >只允许读取(写入禁止)。
        • >:false禁止读取(但可能允许写入,具体配合 <- 说明)。
    • 组合写法

      • >;<-:create读取始终允许,但写入仅在创建时允许;更新时不能写。
      • >:false;<-:create禁止从数据库中读取>:false),但在创建时可以写入。
    • 忽略字段的写法

      • "-":完全忽略该字段,既不读也不写。
      • "-:all":在所有操作(读、写、迁移)中都忽略。
      • "-:migration":仅在迁移操作时忽略该字段。
  • 嵌入结构体:通过匿名嵌入或使用 embedded 标签,可以将一个结构体的字段直接嵌入到父结构体中,并且可以用 embeddedPrefix 添加前缀。

    type Address struct {City  stringState string
    }type Customer struct {ID   uint   `gorm:"primaryKey"`Name string// 匿名嵌入 Address 结构体,其字段会直接映射到 Customer 表中Address// 使用 embedded 标签嵌入 Address 结构体,并添加前缀 contact_Contact Address `gorm:"embedded;embeddedPrefix:contact_"`
    }

高级选项

  • 除了基础的映射和约定,GORM 允许使用序列化标签(serializer)来自定义数据的存储和读取方式,增强灵活性。
  • 对于字段更新的细粒度控制,如仅更新非零值字段、使用 map 或结构体进行批量更新,均由标签和方法调用来实现。

相关文章:

【Gorm】模型定义

intro package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用该驱动来连接和操作 SQLite 数据库。 )type Product struct {gorm.Model // 嵌入GORM 内置的模型结构&#xff0c;包含 ID、CreatedAt、UpdatedAt、DeletedAt 四个字段Cod…...

程序化广告行业(65/89):AdX/SSP系统深度剖析与实战要点

程序化广告行业&#xff08;65/89&#xff09;&#xff1a;AdX/SSP系统深度剖析与实战要点 大家好&#xff01;一直以来&#xff0c;我都对程序化广告领域充满热情&#xff0c;这个领域发展迅速且不断涌现新的技术和模式。之前我们探讨了程序化广告的一些基础内容&#xff0c;…...

算法刷题记录——LeetCode篇(2.7) [第161~170题](持续更新)

更新时间&#xff1a;2025-04-06 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 169. 多数元素 给定一个大小为…...

conda安装指定版本python环境

1. 创建指定 Python 版本的环境 使用以下命令创建环境&#xff0c;并将 <env_name> 替换为你的环境名称&#xff0c;<python_version> 替换为具体的 Python 版本&#xff08;如 3.8, 3.9 等&#xff09; conda create -n <env_name> python<python_vers…...

PH热榜 | 2025-04-05

1. Comp AI 标语&#xff1a;开源的 Vanta 和 Drata 替代方案 介绍&#xff1a;这款开源的 Drata 和 Vanta 替代方案&#xff0c;能够帮助你在几周内&#xff0c;轻松满足 SOC 2、ISO 27001 和 GDPR 等合规框架的要求&#xff0c;而不是像往常那样拖延数月。 产品网站&#…...

C++之红黑树

目录​​​​​​​ 一、红黑树的概念 1.1、红黑树的规则 1.2、红黑树如何确保最长路径不超过最短路径的二倍 1.3、红黑树的效率 二、红黑树的实现 2.1、红黑树的结构 2.2、红黑树的插入 2.2.1、红黑树插入一个值的大概过程 2.2.2、情况一&#xff1a;变色 2.2.3、情…...

各个语言对不同数据结构的叫法

一、基础数据结构对比 数组&#xff08;Array&#xff09;‌ C/C‌&#xff1a;固定大小数组&#xff08;int arr&#xff09;&#xff0c;动态数组通过vector&#xff08;C&#xff09;实现 ‌ Java‌&#xff1a;固定数组&#xff08;int[]&#xff09;&#xff0c;动态数组…...

蓝桥杯 web 水果拼盘 (css3)

做题步骤&#xff1a; 看结构&#xff1a;html 、css 、f12 分析: f12 查看元素&#xff0c;你会发现水果的高度刚好和拼盘的高度一样&#xff0c;每一种水果的盘子刚好把页面填满了&#xff0c;所以咱们就只要让元素竖着排列&#xff0c;加上是竖着&#xff0c;排不下的换行…...

算法专题(八):分治-归并排序

目录 一、排序数组 1.1 题目 2.2 思路 2.3 代码实现 二、LCR 170. 交易逆序对的总数 &#xff08;数组中的逆序对&#xff09; 2.1 题目 2.2 思路 方法一&#xff1a;快速统计出某个数前面有多少个数比它大 方法二&#xff1a;快速统计出某个数后面有多少个数比它小 …...

51单片机使用定时器实现LCD1602的时间显示(STC89C52RC)

本文前半部分直接给出实现&#xff08;注意进位问题是秒->分->小时&#xff0c;用 if 嵌套即可实现&#xff09;&#xff0c;后半部分讲解定时器和中断系统。 效果展示&#xff1a; LCD1602电路图&#xff1a; 项目结构&#xff1a; 代码实现&#xff1a; main.c #…...

微软2025年AI技术深度解析:从多模态大模型到企业级代理服务

微软2025年AI技术深度解析&#xff1a;从多模态大模型到企业级代理服务 一、微软AI技术全景概览 在2025年的AI领域&#xff0c;微软通过Azure AI Foundry、多模态大模型、企业级AI代理三大核心技术&#xff0c;构建了覆盖开发、部署、应用全流程的AI生态体系。根据最新财报数…...

24 设计模式总结

设计模式分类&#xff08;意图&#xff09; • 创建型模式&#xff1a;创建对象的机制&#xff0c;从所需要实例化的对象中解耦。 • 结构型模式&#xff1a;将对象或类组装到更大的结构中。 • 行为型模式&#xff1a;负责对象间的交互和分配职责。分类的目的是为了更抽象的了…...

【ARTS】2873.有序三元组中的最大值!

前言 仅做学习使用&#xff0c;侵删 什么是ARTS&#xff1f; 算法(Algorithm): 每周至少一道LeetCode算法题&#xff0c;加强编程训练和算法学习 阅读(Review)&#xff1a; 阅读并点评至少一篇英文技术文章&#xff0c;提高英文水平 技巧 (Tip)&#xff1a;学习至少一个技…...

Mysql进阶

目录 一.Mysql架构 1.连接层 2.服务层 3.引擎层 4.物理文件存储层 二.Mysql引擎 1.InnoDB 2.MyISAM 三.索引 1.什么是索引 2.为什么要有索引 3.索引的原理 4.索引优势 5.索引劣势 6.索引分类 主键索引 唯一索引 单值索引 组合索引&#xff08;复合索引&#…...

探秘JVM内部

在我们编写Java代码&#xff0c;点击运行后&#xff0c;会发生什么事呢&#xff1f; 首先&#xff0c;Java源代码会经过Java编译器将其编译成字节码&#xff0c;放在.class文件中 然后这些字节码文件就会被加载到jvm中&#xff0c;然后jvm会读取这些文件&#xff0c;调用相关…...

c语言学习12天

c语言的宏定义&#xff1a;宏定义单纯的文本替换不会检查语法是否合法 #include #pragma 以及开头的#都属于预处理指令 预处理指令&#xff1a;在gcc编译套件中的cpp预处理器对程序进行编译之前所做的一些动作&#xff0c;如#include预处理指令就是在程序编译之前有预处理器…...

公司内网部署离线deepseek本地模型实战

企业内部可能有些数据比较敏感&#xff0c;不能连接互联网。deepseek来提高工作效率&#xff0c;这个时候你可以利用ollama在内网本地部署来实现。 本式样是先在自己电脑上用虚拟机部署好&#xff0c;再用U盘把虚拟机文件复制到内网去。 一、使用VMware新建WIN2022虚拟机 &a…...

rocketmq中的延迟队列使用详解

RocketMQ的延迟队列通过预设的延迟等级实现消息的定时投递&#xff0c;适用于订单超时、定时通知等高并发场景。以下是其核心原理、使用方式及优化策略的详细解析&#xff1a; 一、实现原理 延迟等级机制 RocketMQ默认提供18个固定延迟等级&#xff08;1s、5s、10s、30s、1m、2…...

VB.NET Asp.Net Core模板WebAPI应用-宝塔面板Linux系统通过Docker部署

宝塔面板支持在Linux系统上部署Docker容器吗&#xff1f; 如何在宝塔面板上通过Docker部署VB.NET应用&#xff1f; Docker容器中的VB.NET Asp.Net Core WebAPI应用如何配置&#xff1f; 一,首先,创建一个ASP.NET Core测试项目 1.1 打开VS2019/2022,创建一个.NTE6 Core控制台应…...

4985 蜗牛

4985 蜗牛 ⭐️难度&#xff1a;中等 ⭐️考点&#xff1a;2023、省赛、动态规划 &#x1f4d6; &#x1f4da; import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner sc new Sc…...

springboot多模块工程打包部署运行

1、问题概述? 基于实际项目打包过程,各种配置面面俱到,已配置的可跳过。 本文以打包jar包为模板进行操作,部署方便。 在实际的开发中,项目的模块可能较多,如果都放在一个项目的目录中,势必会造成项目包中的文件冗余,难以管理,这个时候就需要使用多模块管理项目。 …...

吴恩达深度学习复盘(8)神经网络中激活函数的建模

激活函数的建模原理 到目前为止&#xff0c;在隐藏层等一直使用激活函数&#xff0c;最初通过逻辑回归建立新网络&#xff0c;组合多个逻辑回归单元。这表明激活函数在神经网络构建中一直存在&#xff0c;且最初的网络构建方式与逻辑回归相关。实际上&#xff0c;激活函数的种类…...

1-linux的基础知识

一.linux的文件系统结构 windows文件系统 微软windows系统将硬盘上的几个分区&#xff0c;用A: B: C: D:等符号标识。存取文件时一定要清楚放在那个磁盘的那个目录下。 linux文件系统 linux文件系统的组织模式犹如一颗倒置的树&#xff0c;这与windows文件系统有很大的差别…...

docker 常用命令

文章目录 一、帮助启动类命令启动docker停止docker重启docker查看docker状态开机自启查看docker概要信息 二、镜像命令列出本地主机上的镜像搜索镜像拉取镜像查看镜像所占空间删除镜像 三、容器命令新建运行容器交互式启动容器守护进程式启动容器列出当前所有的容器进入容器之后…...

使用docker搭建redis镜像时云服务器无法访问到国外的docker官网时如何解决

下载redis镜像 docker redis:版本号 此时截图中无法访问到国外的docker官网 解决方案&#xff1a; 通过更换镜像源来正常下载redis镜像 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1…...

基于Python的人脸识别校园考勤系统

【Python】基于Python的人脸识别校园考勤系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &#x1f31f; 该系统主要分为前端和后端两个部分&#xff0c;前端&#x1f440;负责人脸采集、人…...

微信小程序学习实录11:startLocationUpdateBackground:fail auth deny

startLocationUpdateBackground:fail auth deny 表明小程序在尝试开启后台位置更新时&#xff0c;用户授权被拒绝。以下是可能的原因及解决方法&#xff1a; 原因分析 缺少必要的用户授权&#xff1a; 使用 wx.startLocationUpdateBackground 接口需要用户授予 scope.userLo…...

DAPP实战篇:规划下我们的开发线路

前言 在DApp实战篇&#xff1a;先用前端起个项目一文中我们起了一个前端项目&#xff0c;在后续开发中笔者将带领大家一步步完成这个DAPP&#xff0c;为了方便后续讲解&#xff0c;本篇将完整说明后续我们要进行的开发和思路。 主打前端 实际上一个完整的DAPP是由前端和智能…...

docker配置redis容器时配置文件docker-compose.yml示例

1.配置数据节点&#xff08;主从节点&#xff09; version: 3.7 services:master:image: redis:5.0.9container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: redis:5.0.9container_name: redis-slave1restart: a…...

清晰易懂的 Jenkins 安装与核心使用教程

Jenkins 是业界领先的开源自动化服务器&#xff0c;用于实现持续集成与持续交付&#xff08;CI/CD&#xff09;。本教程将覆盖 安装部署、核心功能配置、避坑指南&#xff0c;助你快速掌握企业级自动化流水线搭建&#xff01; 一、Jenkins 安装&#xff08;全平台指南&#xff…...

anomalib—2—输入图像大小调整

三个地方 第一&#xff1a;在定义model时&#xff0c;要在pre_processor里面去定义一个前处理&#xff0c;前处理就一个功能&#xff0c;定义图像的大小 pre_processor0 Patchcore.configure_pre_processor( image_size (128, 128)) model Patchcore( backbone"wide_r…...

小型园区组网图

1. 在小型园区中&#xff0c;S5735-L-V2通常部署在网络的接入层&#xff0c;S8700-4通常部署在网络的核心&#xff0c;出口路由器一般选用AR系列路由器。 2. 接入交换机与核心交换机通过Eth-Trunk组网保证可靠性。 3. 每个部门业务划分到一个VLAN中&#xff0c;部门间的业务在C…...

编程哲学——TCP可靠传输

TCP TCP可靠传输 TCP的可靠传输表现在 &#xff08;1&#xff09;建立连接时三次握手&#xff0c;四次挥手 有点像是这样对话&#xff1a; ”我们开始对话吧“ ”收到“ ”好的&#xff0c;我收到你收到了“ &#xff08;2&#xff09;数据传输时ACK应答和超时重传 ”我们去吃…...

2024华为OD机试真题-任务最优调度(C++/Java/Python)-E卷-200分

2024华为OD机试最新E卷题库-(D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 考点 题目解析 代码 c++ java python 题目描述 给定一个正整数数组表示待系统执行的任务列表,数组的每一个元素代表一个任务,元素的值表示该任务的类型。请计算执…...

蓝桥杯 2023省B 飞机降落 dfs

传送门 P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 n<10&#xff0c;考虑dfs&#xff0c;只有当 当前飞机的到达时刻盘旋时间 < 上一个飞机降落的时刻 时&#xff0c;当前飞机才能降落 const int N 1e3 10;int n; struct Node {LL t,d,l; }a[N];bool st[N];bool dfs(in…...

Mybatis--动态SQL

动态SQL是MyBatis的重要特征之一&#xff0c;能够完成不同条件下的SQL拼接&#xff0c;参考文档&#xff1a;动态 SQL_MyBatis中文网 一、<if>标签 该标签主要适用的情况为实现必填字段和非必填字段&#xff1a; 例如下面的例子就是将用户表中的性别设置成了非必填字段…...

计算机视觉中的基于网格的卷绕算法全解析

大家好呀&#xff5e;今天给大家带来一个超级实用且有趣的计算机视觉技巧&#xff1a;基于网格的卷绕算法&#xff08;Grid Warp Algorithm&#xff09;&#xff01;如果你对图像变形、动画制作感兴趣&#xff0c;那一定不要错过这篇文章哦&#xff01;话不多说&#xff0c;直接…...

xv6 文件系统

Buffer Cache buffer Cache 结构体 bcache 存放了 NBUF 个 buf 框&#xff0c;每个框对应 disk 上某一个 block。从初始化函数 binit中可以看出&#xff0c;bcache 是一个循环双向链表。通过双链表组织这些 buf&#xff0c;以近似 LRU 的策略管理&#xff0c;大概如下图。 st…...

Python Cookbook-5.5 根据内嵌的数字将字符串排序

任务 你想将一个字符串列表进行排序&#xff0c;这些字符串都含有数字的子串(比如一系列邮寄地址)。举个例子&#xff0c;“foo2.txt”应该出现在“foo10.txt”之前。然而&#xff0c;Python 默认的字符串比较是基于字母顺序的&#xff0c;所以默认情况下&#xff0c;“foo10.…...

EMC内参二(1-45页)学习【技术进阶】

EMC设计介入产品设计时间越早&#xff0c;成本越低。 微带线和带状线的区别&#xff1a; 微带线是PCB外层的走线&#xff0c;带状线是结余两个完整参考平面&#xff08;电源层和地层&#xff09;之间的走线。 天线效应&#xff1a; PCB上面任何悬空的金属都会积累电荷&…...

Ansible(7)——管理机密

目录 一、Ansible Vault &#xff1a; 二、ansible-vault 命令行工具&#xff1a; 1、创建加密文件&#xff1a; 2、查看加密文件&#xff1a; 3、编辑现有加密文件&#xff1a; 4、加密现有文件&#xff1a; 5、解密现有文件&#xff1a; 6、更改加密文件的密码&#…...

通俗地讲述DDD的设计

通俗地讲述DDD的设计 前言为什么要使用DDDDDD架构分层重构实践关键问题解决方案通过​​领域事件机制​​解耦服务依赖&#xff1a;防止逻辑下沉 领域划分电商场景下的领域划分 结语完结撒花&#xff0c;如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;…...

【学Rust写CAD】34 精确 Alpha 混合函数(argb.rs补充方法)

源码 #[inline]pub fn over_exact(self, dst: Argb) -> Argb {let a 255 - self.alpha32();let t dst.rb() * a 0x80_00_80;let mut rb (t ((t >> 8) & Argb::MASK)) >> 8;rb & Argb::MASK;rb self.rb();// saturaterb | 0x1000100 - ((rb >&…...

10种电阻综合对比——《器件手册--电阻》

二、电阻 前言 10种电阻对比数据表 电阻类型 原理 特点 应用 贴片电阻 贴片电阻是表面贴装元件&#xff0c;通过将电阻体直接贴在电路板上实现电路连接 体积小、重量轻&#xff0c;适合高密度电路板&#xff1b;精度高、稳定性好&#xff0c;便于自动化生产 广泛应用于…...

SpringCloud入门及创建分布式项目

1、了解微服务 1.1 什么是微服务 微服务是一种架构风格一个应用拆分为一组小型服务每个服务运行在自己的进程内&#xff0c;也就是可独立部署和升级服务之间使用轻量级HTTP交互服务围绕业务功能拆分可以由全自动部署机制独立部署去中心化&#xff0c;服务自治。服务可以使用不同…...

xv6启动过程

entry,S -> start.c -> main.c -> proc.c中的 userinit 函数 -> initcode.S -> init.c entry.S // entry.S# qemu -kernel loads the kernel at 0x80000000# and causes each CPU to jump there.# kernel.ld causes the following code to# be placed at 0x800…...

【秣厉科技】LabVIEW工具包——OpenCV 教程(18):highgui 模块

文章目录 前言highgui 模块总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#xff0c;LabVIEW>2018&#xff0c;兼容32位和64位。 highgui 模块 尽量别用&#xff0c;要不我删了吧&#xff1f; LabVIEW…...

基于OPENCV的图像透视矫正

这段代码的主要功能是对输入的图像进行透视矫正。它会读取一张图像&#xff0c;检测图像中最大的四边形轮廓&#xff0c;然后对该四边形区域进行透视变换&#xff0c;将其矫正为正视图&#xff0c;最后保存矫正后的图像。 模块导入说明 python import cv2 import numpy as n…...

数据结构----------顺序查找,折半查找和分块查找(java实现)

import java.util.Arrays;//顺序查找法 public class Main {public static void main(String[] args) {//查找表int[] arr {4, 3, 5, 1, 2};System.out.print("5在数组中的索引:");System.out.println(SearchSeq(arr, 5));Arrays.sort(arr);System.out.print("…...

整数编码 - 华为OD统一考试(A卷、JavaScript)

题目描述 实现一种整数编码方法&#xff0c;使得待编码的数字越小&#xff0c;编码后所占用的字节数越小。 编码规则如下: 编码时7位一组&#xff0c;每个字节的低7位用于存储待编码数字的补码。字节的最高位表示后续是否还有字节&#xff0c;置1表示后面还有更多的字节&…...