【mybatis】objectwrapper解读

简介

在 MyBatis 中,ObjectWrapper 是一个关键的接口,用于详细封装了对象的属性信息。ObjectWrapper 主要用于内部操作,它抽象了对象的属性操作,使得 MyBatis 能够统一处理原生类型、Bean 对象以及 Map 集合等。

类图展示

ObjectWrapper.png

主要功能

  1. 属性的获取与设置ObjectWrapper 提供了方法来获取和设置对象的属性值。这对于 MyBatis 在执行 SQL 语句时,动态地插入参数值或者将查询结果映射回对象是非常有用的。
  2. 集合操作的支持:对于 Map 类型或者集合类型的对象,ObjectWrapper 提供了方法来操作集合内的元素,包括获取指定键的值等。
  3. 复杂属性的处理ObjectWrapper 还能处理复杂的属性路径。例如,如果有一个属性路径是 someBean.somePropertyObjectWrapper 能够解析这个路径并获取或设置相应的属性值。

实现类

MyBatis 提供了几个 ObjectWrapper 的实现类,用于处理不同类型的对象:

  • **BeanWrapper**:用于处理 Java Bean 对象的包装器,通过反射机制访问对象的属性。
  • **MapWrapper**:用于处理 Map 类型对象的包装器,通过键值对来访问数据。
  • **CollectionWrapper**:尽管不直接实现 ObjectWrapper 接口,但 MyBatis 处理集合类型时有相关的机制,以支持集合的处理。

应用场景

ObjectWrapper 的设计主要是为了内部使用,以提供一种统一的方式来访问对象的属性,无论这些对象是普通的 Java Beans、Map 集合还是其他复杂的数据结构。这种机制极大地简化了 MyBatis 的参数映射和结果映射逻辑,使得开发者可以更加专注于 SQL 语句的编写,而不是数据的封装和解析过程。

在自定义类型处理器(Type Handler)或是高级映射配置时,了解 ObjectWrapper 的工作原理可以帮助开发者更好地控制 MyBatis 的行为,实现更加灵活和强大的数据操作。

ObjectWrapper 接口类的设计理念

封装性(Encapsulation)

ObjectWrapper 封装了对对象属性的操作,隐藏了具体的实现细节。这意味着,不论是操作 Java Bean、Map 还是其他任何复杂对象,对于使用者来说,都是通过一个统一的接口进行。这种封装性使得 MyBatis 的其余部分可以不用关心对象属性是如何被访问和修改的,从而降低了各个模块间的耦合度。

抽象性(Abstraction)

ObjectWrapper 作为一个高层次的抽象,定义了一套操作对象属性的通用方法。这种抽象使得 MyBatis 能够支持广泛的数据类型,而无需为每种数据类型编写特定的代码。通过抽象出一个统一的接口,MyBatis 可以轻松地扩展以支持新的对象类型,只需添加相应类型的 ObjectWrapper 实现即可。

单一职责原则(Single Responsibility Principle)

ObjectWrapper 的设计遵循了单一职责原则,即一个类应该只有一个引起变化的原因。ObjectWrapper 接口专注于对象属性的访问和操作,而不涉及其他逻辑,如 SQL 语句的构建、数据库连接的管理等。这使得 ObjectWrapper 及其实现类易于理解和维护。

开闭原则(Open/Closed Principle)

根据开闭原则,软件实体应该对扩展开放,对修改关闭。ObjectWrapper 接口的设计允许 MyBatis 在不修改已有代码的基础上扩展框架的功能。通过添加新的 ObjectWrapper 实现,可以支持新的数据类型或自定义的对象处理逻辑,而无需改动框架的核心部分。

策略模式(Strategy Pattern)

ObjectWrapper 的设计体现了策略模式的应用,其中 ObjectWrapper 接口定义了一组算法家族(在这里是对象属性的操作方法),而它的实现类则封装了这些算法的具体实现。这使得 ObjectWrapper 在运行时可以根据对象的类型选择合适的实现,从而改变对象属性的访问和操作行为。这种模式提高了代码的灵活性和可重用性。

BaseWrapper类解读

MyBatis 中的 BaseWrapper 类并不是直接暴露给终端用户的一个类,而是作为一个内部使用的基础类,提供了一些共通的功能和工具,供其子类如 BeanWrapperMapWrapperObjectWrapper 的实现类使用。BaseWrapper 主要是实现了 ObjectWrapper 接口的一些公共逻辑,以避免在每一个实现中重复相同的代码。它是一个抽象类,为处理对象属性的读取和设置提供了基础设施。

主要功能
  1. 属性表达式解析BaseWrapper 提供了解析复杂属性表达式的功能,例如嵌套属性和集合/数组元素的访问。这允许 MyBatis 在运行时动态地访问和修改对象的属性,即使这些属性是通过复杂的路径访问的。
  2. 通用属性访问:通过封装对反射 API 的调用,BaseWrapper 提供了一种相对简单的方式来读取和设置对象的属性值。这包括处理 Java Beans、Map 以及集合类型的对象。
  3. 缓存机制:为了提高性能,BaseWrapper 可能会实现一些缓存机制,例如缓存反射操作的结果(如方法、字段访问)。这样可以减少对相同属性的重复解析和访问开销。
  4. 类型转换和处理BaseWrapper 提供了类型转换的基础设施,以便在设置属性值时,能够将输入数据转换为目标属性的适当类型。这是通过 MyBatis 的类型处理器(TypeHandler)来实现的。
  5. 延迟加载支持:在一些情况下,BaseWrapper 可能会参与支持延迟加载(Lazy Loading)的逻辑,尽管这通常是在更高层次上处理的,但 BaseWrapper 提供的基础设施使得这种功能的实现变得可能。
应用场景

BaseWrapper 主要在 MyBatis 内部使用,作为一个工具类来支持更高层次的抽象,如 ObjectWrapper 的实现。它通过提供一组通用的工具和方法简化了对不同类型对象的操作,提高了 MyBatis 在处理复杂映射和动态 SQL 时的灵活性和效率。用户通常不需要直接与 BaseWrapper 交互,但理解其功能和作用可以帮助更好地理解 MyBatis 是如何在内部处理对象映射的。

类定义和构造函数
  • BaseWrapper 是一个抽象类,它实现了 ObjectWrapper 接口。
  • 它包含一个 protectedMetaObject 类型的成员变量 metaObjectMetaObject 是 MyBatis 中用于反射操作的核心类,提供了对对象属性的访问和修改功能。
  • 构造函数 BaseWrapper(MetaObject metaObject) 用于初始化 metaObject 成员变量。
方法解读
  • **resolveCollection(PropertyTokenizer prop, Object object)**** 方法**:用于处理集合对象。如果 PropertyTokenizername 属性为空字符串,表示直接返回输入对象;否则,通过 metaObject.getValue(prop.getName()) 获取属性值。这里的 PropertyTokenizer 是用于分析属性表达式的工具类。
  • **getCollectionValue(PropertyTokenizer prop, Object collection)**** 方法**:根据 PropertyTokenizer 中的索引,从集合对象中获取元素值。这个方法能够处理 MapList、数组以及基本类型数组(如 int[], char[] 等)。如果集合对象不是这些类型之一,则抛出 ReflectionException 异常。
  • **setCollectionValue(PropertyTokenizer prop, Object collection, Object value)**** 方法**:根据 PropertyTokenizer 中的索引,向集合对象中设置元素值。这个方法同样能够处理 MapList、数组以及基本类型数组。它根据集合的类型,将值 value 插入或替换到正确的位置。如果操作的目标不是这些集合类型之一,同样会抛出 ReflectionException 异常。

CollectionWrapper类解读

核心功能
  • 构造函数:接受一个 CustomCollection 类型的对象作为参数,并将其存储在 collection 成员变量中。这表明 CustomObjectWrapper 是专门为操作 CustomCollection 设计的。
  • **isCollection**** 方法**:返回 true,表明这个包装器封装的是一个集合对象。这是对 ObjectWrapper 接口的具体实现,指示 MyBatis 这个包装器处理的是集合类型的数据。
  • **add**** 方法和 **addAll** 方法**:这两个方法允许向 collection 成员变量中添加单个元素或多个元素。这表明 CustomObjectWrapper 提供了基本的集合操作功能,使得可以通过这个包装器修改底层集合。
未实现的方法

代码中有多个方法标记为 “Not Implemented”,包括 getsetfindPropertygetGetterNamesgetSetterNamesgetSetterTypegetGetterTypehasSetterhasGetterinstantiatePropertyValue。这些方法的空实现表明 CustomObjectWrapper 在当前形态下不支持这些操作。这可能是因为这些操作对于 CustomCollection 类型的数据不是必需的,或者开发者打算在未来根据需要实现它们。

设计意图

CustomObjectWrapper 的设计意图是提供一个机制,通过它 CustomCollection 类型的对象可以在 MyBatis 中使用,同时提供了一种方式来扩展 MyBatis 默认的对象包装行为。通过实现 ObjectWrapper 接口,CustomObjectWrapper 使得 MyBatis 能够对 CustomCollection 进行操作,如添加元素,而不必担心其他更复杂的属性操作。

使用场景

这种自定义包装器的一个潜在使用场景是在 MyBatis 的 ORM 映射中,当需要处理非标准集合类型时。例如,如果 CustomCollection 提供了一些特殊的行为或优化,那么使用 CustomObjectWrapper 可以确保这些特性能够在 MyBatis 操作中得到支持和利用。
总的来说,CustomObjectWrapper 提供了一个框架,用于将自定义集合类型集成到 MyBatis 中,尽管它需要进一步的实现来支持所有的 ObjectWrapper 接口方法。这种设计允许开发者根据特定需求定制 MyBatis 的行为,从而提高框架的灵活性和可用性。

MapWrapper类解读

这段代码定义了 类,它继承自 BaseWrapper 并实现了 ObjectWrapper 接口,专门用于处理 Java Map 类型的对象。MapWrapper 类提供了一系列操作,使得 MyBatis 能够通过反射机制访问和修改 Map 对象的内容。以下是对该类关键功能和方法的详细解释:

构造函数
  • MapWrapper(MetaObject metaObject, Map<String, Object> map):接受一个 MetaObject 和一个 Map<String, Object> 作为参数。metaObject 用于访问对象的元数据,map 是这个 MapWrapper 实例将要操作的 Map 对象。
方法实现
  • **get(PropertyTokenizer prop)**:如果属性名(prop)带有索引,则解析并返回集合中的相应元素;如果没有索引,则直接从 Map 中获取对应的值。
  • **set(PropertyTokenizer prop, Object value)**:如果属性名(prop)带有索引,则在集合中设置相应的元素;如果没有索引,则在 Map 中设置对应的值。
  • **findProperty(String name, boolean useCamelCaseMapping)**:直接返回属性名,因为 Map 的属性查找不需要转换或处理。
  • **getGetterNames()**** 和 ****getSetterNames()**:返回 Map 中所有键的数组,表示所有可用的getter和setter方法名。
  • **getSetterType(String name)**** 和 ****getGetterType(String name)**:返回给定属性名对应值的类型。如果 Map 中包含该属性,则返回其值的类类型;否则,默认为 Object 类型。
  • **hasSetter(String name)**hasGetter(String name)**:对于 Map 类型,理论上所有的属性名都可以有setter和getter,因为可以在 Map 中插入或查询任何键。
  • **instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory)**:用于动态创建并初始化一个属性值。在这里,它创建了一个新的 HashMap 并将其设置为指定属性的值。
  • **isCollection()**:返回 false,因为 Map 不被视为 Collection 类型。
  • **add(Object element)**** 和 ****addAll(List<E> element)**:抛出 UnsupportedOperationException,因为对于 Map 类型的数据结构,单独添加元素的操作没有定义。
设计意图

MapWrapper 类的设计主要是为了让 MyBatis 能够更灵活地处理 Map 类型的对象。通过实现 ObjectWrapper 接口,它提供了一种标准化的方式来访问和修改 Map 中的数据,无论是单个值还是集合类型的元素。这种封装使得 MyBatis 在执行 SQL 操作时,能够方便地映射结果集到 Map,或者将 Map 中的数据用作查询的参数。

使用场景

在 MyBatis 中,MapWrapper 被用来处理那些需要动态查询参数或希望将查询结果映射到 Map 对象的场景。通过 MapWrapper,用户可以灵活地操作 Map,无需担心如何将数据库的列映射到 Map 的键上。这在处理动态查询或构建动态响应时尤其有用。

BeanWrapper类解读

这段代码定义了 BeanWrapper 类,它是 MyBatis 反射模块中的一个关键部分,用于封装和操作 Java Bean 对象。BeanWrapper 继承自 BaseWrapper 并实现了 ObjectWrapper 接口,提供了一系列方法来访问和修改 Java Bean 的属性。以下是对该类关键功能和方法的详细解释:

构造函数
  • BeanWrapper(MetaObject metaObject, Object object):构造函数接收一个 MetaObject 和一个 Java 对象。MetaObject 是 MyBatis 反射模块的核心,用于访问对象的元数据,而 object 是被封装的 Java Bean 对象。metaClass 是通过 MetaClass.forClass(object.getClass(), metaObject.getReflectorFactory()) 创建的,用于访问 Java Bean 的元数据,如属性的 getter 和 setter 方法。
主要方法
  • **get(PropertyTokenizer prop)**:根据 PropertyTokenizer 提供的属性名(可能包含索引或嵌套路径)获取属性值。如果属性名带有索引,则处理为集合或数组的访问;否则,通过 getBeanProperty 方法直接访问 Bean 的属性。
  • **set(PropertyTokenizer prop, Object value)**:根据 PropertyTokenizer 设置属性值。如果属性名带有索引,则处理为集合或数组的修改;否则,通过 setBeanProperty 方法修改 Bean 的属性。
  • **getBeanProperty**** 和 ****setBeanProperty**:这两个私有方法分别用于获取和设置 Java Bean 的属性值。它们通过 MetaClass 获取属性的 getter 或 setter Invoker,然后反射调用相应的方法。
  • 属性查找和类型获取方法:如 findPropertygetSetterTypegetGetterType 等方法,这些方法通过 MetaClass 实现,用于查找属性名、获取属性的类型等。
  • **hasSetter**** 和 ****hasGetter**:检查 Java Bean 是否有指定属性的 setter 或 getter 方法。
  • **instantiatePropertyValue**:如果需要,此方法用于实例化属性值。它通过 ObjectFactory 创建属性类型的新实例,并将其设置为属性值。
  • 集合操作相关方法isCollectionaddaddAll 方法在 BeanWrapper 中不支持,因为它封装的是单个 Java Bean 对象而非集合。
设计意图

BeanWrapper 的设计主要目的是封装对 Java Bean 对象的反射操作,提供统一的接口来访问和修改属性,支持嵌套属性和集合属性的操作。通过 MetaClass 和反射,BeanWrapper 能够动态地访问 Java Bean 的属性,这对于 MyBatis 在执行 SQL 语句时动态绑定参数值、映射查询结果到 Java 对象非常重要。

使用场景

在 MyBatis 的 ORM 映射过程中,BeanWrapper 被用于处理 Java Bean 类型的参数和结果对象。它允许 MyBatis 动态地访问和修改对象的属性,支持复杂的嵌套属性和集合属性的操作,从而使得 MyBatis 能够灵活地将数据库查询结果映射到 Java 对象,以及将 Java 对象作为查询参数。

CustomBeanWrapper类解读

类定义
  • CustomBeanWrapper 继承自 BeanWrapper 类,这意味着它继承了所有的公共方法和属性,使得可以覆盖(Override)或添加新的行为和功能。
构造函数
  • CustomBeanWrapper(MetaObject metaObject, Object object):构造函数接收两个参数:一个 MetaObject 和一个 Java 对象(object)。这与父类 BeanWrapper 的构造函数签名一致。在构造函数体中,它通过调用 super(metaObject, object) 将这些参数传递给父类的构造函数。
设计意图
  • 扩展 **BeanWrapper** 功能:虽然这个示例中 CustomBeanWrapper 没有实现任何新的功能或覆盖任何父类方法,实际使用时,你可以在这个类中添加新的方法或覆盖现有方法,以实现特定的行为或处理逻辑。例如,可以覆盖 getset 方法来添加日志记录、错误处理、属性值转换等自定义行为。
使用场景
  • 自定义对象包装器:如果你在使用 MyBatis 时有特殊需求,比如需要对某些 Java Bean 的属性访问或修改进行特殊处理,可以通过创建自定义的 BeanWrapper 来实现。这样可以保留 MyBatis 原有的映射和参数处理机制的同时,添加或修改特定的行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/279365.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构扩展性

架构扩展性&#xff1a;应用扩展 数据扩展 组织扩展 流程扩展 核心方法论–扩展立方体&#xff1a; x轴&#xff1a;无脑克隆 y轴&#xff1a;功能分割z轴&#xff1a;客户分割扩展立方体在应用扩展的应用&#xff1a; x轴&#xff1a;横向克隆 对于无状态的应用&#xff0c;多…

苹果意将Gemini引入iPhone;英伟达发布新AI GPU;Grok正式开源

苹果正在谈判将 Gemini 引入 iPhone Mark Gurman 报道&#xff0c;苹果正在谈判将 Google 的生成式 AI 大模型 Gemini 引入 iPhone。 知情人士透露&#xff0c;两家公司正在积极谈判&#xff0c;让苹果获得 Gemini 授权&#xff0c;为今年 iPhone 软件的一些新功能提供动力。苹…

2024年Jira全面解析:从 Jira 的概念到优缺点、最新政策

Jira是澳大利亚的Atlassian公司开发的一款项目管理软件&#xff0c;名字来源于日文中“哥斯拉”的称呼“Gojira”。Jira不仅可以追踪缺陷和问题&#xff0c;还能管理项目。很多企业还将JIRA用于一些特殊的场景&#xff0c;比如作为仓库自动化工具、管理文档流程、优化费用等等。…

Python之Web开发中级教程----ubuntu安装MySQL

Python之Web开发中级教程----ubuntu安装MySQL 进入/opt目录 cd /opt 更新软件源 sudo apt-get upgrade sudo apt-get update 3、安装Mysql server sudo apt-get install mysql-server 4、启动Mysql service mysql start 5、确认Mysql的状态 service mysql status 6、安全设…

了解和编译安装mysql数据库

一. 数据库的基本概念 1.1 数据 ① 描述事物的符号记录 称为数据&#xff08;Data&#xff09;。包括数字、文字、图形、图像、声音、档案记录等 ② 数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱无章的。 相同格式和类型的数据统一存放在一起&…

Nginx发布之后可以使用IP访问,不能使用localhost访问, Nginx发布之后可以使用localhost访问,不能使用IP访问,

如标题所说 Nginx发布之后可以使用IP访问&#xff0c;不能使用localhost访问&#xff0c; Nginx发布之后可以使用localhost访问&#xff0c;不能使用IP访问&#xff0c; 修改配置文件也没有用 清除浏览器缓存数据

轻松解锁微博视频:基于Perl的下载解决方案

引言 随着微博成为中国最受欢迎的社交平台之一&#xff0c;其内容已经变得丰富多彩&#xff0c;特别是视频内容吸引了大量用户的关注。然而&#xff0c;尽管用户对微博上的视频内容感兴趣&#xff0c;但却面临着无法直接下载这些视频的难题。本文旨在介绍一个基于Perl的解决方…

【Linux(1)】Linux的一些基本指令(补充上一篇)

思维导图 学习内容 通过上面的学习目标&#xff0c;我们可以列出要学习的内容&#xff1a; linux的一些指令&#xff1a;cd mkdir cp touch which rm cat alias 一些基本的概念&#xff1a;指令的概念&#xff0c;用户家目录是什么...... 一、Linux的一些指令 1.1 重新认识…

vue3封装对话框el-dialog组件

实现逻辑&#xff1a; 1、引入对话框组件&#xff1b; 2、组件使用&#xff1b; 3、点新增和编辑的时候&#xff0c;通过ref调用对话框暴漏出来的方法&#xff0c;并传值&#xff1b; 4、关闭对话框时&#xff0c;封装方法&#xff0c;重置对话框的表单和重置校验&#xff1b; …

.htaccess全站设置SSL,wordpress全站设置SSL,网站重定向的次数过多”错误最佳解决方法教程

.htaccess全站设置SSL,wordpress全站设置SSL&#xff0c;网站重定向的次数过多”错误最佳解决方法教程 网上找了很多教程网无效**.htacces**设置&#xff0c;访问后台出现重定向次数过多&#xff0c;导致无法访问 找了好久&#xff0c;测试用AI机器人无法解决&#xff0c;参考…

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

【RabbitMQ | 第七篇】RabbitMQ实现JSON、Map格式数据的发送与接收

文章目录 7.RabbitMQ实现JSON、Map格式数据的发送与接收7.1消息发送端7.1.1引入依赖7.1.2yml配置7.1.3RabbitMQConfig配置类——&#xff08;非常重要&#xff09;&#xff08;1&#xff09;创建交换器方法&#xff08;2&#xff09;创建队列方法&#xff08;3&#xff09;绑定…

自动化部署利器:Jenkins+Gitlab助力Springboot项目快速上线,实现持续集成与持续交付!

Jenkins 能干什么 来自官网 官网 Jenkins怎么用【Linux版】 下载 war包 本机为Java8 选择Jenkins版本为2.289.1 注意&#xff1a; 如果是Java8 尽量和我的Jenkins版本保持一致哈&#xff01;后面可能会遇到各种坑。 把下载好的war放到Linux服务器的某一个目录下 启动war …

实现:mysql-5.7.42 到 mysql-8.2.0 的升级(二进制方式)

实现&#xff1a;mysql-5.7.42 到 mysql-8.2.0 的升级&#xff08;二进制方式&#xff09; 1、操作环境1、查看当前数据库版本2、操作系统版本3、查看 Linux 系统上的 glibc&#xff08;GNU C 库&#xff09;版本&#xff08;**这里很重要&#xff0c;要下载对应的内核mysql版本…

抖音视频爬虫提取软件|视频批量采集工具

抖音视频爬虫软件 想要快速并批量地下载抖音视频吗&#xff1f;现在&#xff0c;我们推出了一款基于C#开发的抖音视频爬虫工具&#xff0c;满足您的需求&#xff0c;让您轻松实现关键词搜索、q1977470120批量抓取和选择性下载视频的操作。 功能特点&#xff1a; 关键词搜索抓…

CMake笔记之通用模板以及将官方库作为third_party完整地包含在工程项目中使用

CMake笔记之通用模板以及将官方库作为third_party完整地包含在工程项目中使用 —— 杭州 2024-03-20 凌晨1:06 code review! 文章目录 CMake笔记之通用模板以及将官方库作为third_party完整地包含在工程项目中使用1.通用CMakeLists.txt模板2.GPT4给出的改进建议3.git clone或a…

excel 表中有图片并在筛选特定行时,只显示该行的图片

建议&#xff1a;选中excel 表中某张图片&#xff0c;CtrlA&#xff0c;选中所有图片。再右键&#xff0c;在菜单中选设置对象格式 在属性里按下图设置&#xff0c; 生效之后&#xff0c;筛选某个产品的时候&#xff0c;就不会显示其他的不符合筛选条件的产品的图片了。

游戏引擎中的动画基础

一、动画技术简介 视觉残留理论 - 影像在我们的视网膜上残留1/24s。 游戏中动画面临的挑战&#xff1a; 交互&#xff1a;游戏中的玩家动画需要和场景中的物体进行交互。实时&#xff1a;最慢需要在1/30秒内算完所有的场景渲染和动画数据。&#xff08;可以用动画压缩解决&am…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI…

GO语言:函数、方法、面向对象

本文分享函数的定义、特性、defer陷阱、异常处理、单元测试、基准测试等以及方法和接口相关内容 1 函数 函数的定义 func 函数名(参数列表) (返回值列表) { // 函数体&#xff08;实现函数功能的代码&#xff09; } 匿名函数的定义就是没有函数名&#xff0c;可以当做一个函…