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

Go语言接口实现面对对象的三大特征

一.知识回顾

在 Go 语言中,接口是一种强大的抽象机制,它允许我们定义一组方法签名,任何类型只要实现了这些方法,就被视为实现了该接口。接口的实现是隐式的,这意味着类型不需要显式声明它实现了某个接口,只要提供了接口所需的所有方法即可。

接口:就是一组方法的签名,任何类型只要实现这些方法,就可以被视为实现了该接口

package mainimport "fmt"type speaker interface {speak()//只要实现了speak方法的,都可以是speaker类型
}
type cat struct{}
type dog struct{}func (d dog) speak() {fmt.Println("汪汪汪")
}
func (c cat) speak() {fmt.Println("喵喵喵")
}func da(x speaker) {//接收参数,传入什么,我就打印什么x.speak()
}// 在编程存在
func main() {var c1 catvar d1 dogda(c1)da(d1)
}

所以接口是比较抽象的东西,他的这个类型只是存储了共同的方法,这样的目的就是为了实现不管传入是什么类型的,都可以实现他的方法

1.1 接口的实现和实现

type 接口名 interfacce{方法名1(参数1,参数2....)(返回值1,返回值2....)方法2.....
}

接口的实现:

一个变量如果实现了接口中规定的所有的方法,那么这个变量就实现了这个接口,可以称为这个接口类型的变量。

(这一句话很重要,你要实现了所有的方法才算是说是接口,如果你只是实现了接口内所定义的个别方法的话,就不能称之为接口)

就比如猫狗,这些就是接口类型,也就是speaker类型。

如果一个接口没有方法呢?

这样的接口被称为是空接口

它的主要作用:

  • 作为函数的参数(可以是任意类型,因为所有类型都实现了空接口)
  • 作为map的值,可以是字典保存任意类型的值

正是因为有了空接口的概念,就会出现分不清1和 '1'的情况,这个时候就需要类型断言

package mainimport "fmt"func assign(a interface{}) {str, ok := a.(string)if ok {fmt.Println(str)} else {fmt.Println("错误")}//fmt.Printf("type:%T,value:%v\n", a, a)//这里其实用switch猜合适
}func assign2(a interface{}) {fmt.Printf("type:%T,value:%v\n", a, a)switch a.(type) {case int:fmt.Println("int")case string:fmt.Println("string")case bool:fmt.Println("bool")case float64:fmt.Println("float64")}
}
func main() {var m1 map[string]interface{}m1 = make(map[string]interface{}, 16)m1["name"] = "cxy"m1["age"] = 18m1["married"] = truem1["hobby"] = [...]string{"唱", "跳"}fmt.Println(m1)assign2("100")
}

1.2 接口和类型的关系

多个类型可以实现一个接口,是上述我们经常使用的。

除此之外还可以一个类型对应多个接口

1.3 接口的嵌套

接口的嵌套,也就是接口里包含接口,要实现的话,父接口,就必须实现所有的子接口才可以。

二.接口实现面对对象的三大特征

面对对象的3个概念:封装,继承,多态

2.1 封装

封装的好处:

  1. 隐藏实现细节;
  2. 可以对数据进行校验,保证安全合理;

go语言的封装和其他语言稍微有点不同。

主要就是go语言的封装是包级别的,在同一个包内均是可见的,其它包内是不可见的,除非是大写字母开头才是可见的。否则只可以通过封装来实现。

接下来写一个封装的例子:

package mainimport "fmt"type Person struct {name stringage  int
}func (p *Person) SetName(name string) {p.name = name
}func (p *Person) SetAge(age int) {p.age = age
}func (p *Person) GetName() string {return p.name
}func (p *Person) GetAge() int {return p.age
}func main() {//p := &Person{}p := new(Person)p.SetName("Alice")p.SetAge(18)fmt.Println(p.GetName())	//Alicefmt.Println(p.GetAge())		//18
}

2.2 继承

go里面的继承可能和之前学习的不太一样,但是大致内容是一致的,只是他的形式不太一样而已。

这里我们会发现一个问题:

就是结构体的嵌套和继承是有区别的,要注意

在Golang中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,这就是所谓的继承。

package mainimport "fmt"type animal struct {name string
}func (a animal) wang() {fmt.Printf("%d会动", a.name)
}type dog struct {animal //这样的话animal内有的属性,这样的话他的后代dog也会有name属性,feet   int
}func (d dog) wang() {fmt.Printf("%s会汪汪汪", d.name)//这里的查找如果dog没有的话就会找上一级结构体。
}// 返回尽量使用指针,如果返回变量的话开销比较大
func Init(name string) *dog {return &dog{animal: animal{name: name,},feet: 4,}
}func main() {a1 := Init("haha\n")a1.wang()fmt.Println(a1)
}
package mainimport "fmt"type animal struct {name string
}func (a animal) wang() {fmt.Printf("%d会动", a.name)
}type dog struct {animalfeet int
}func (d dog) wang() {fmt.Printf("%s会汪汪汪\n", d.name)//这里的查找如果dog没有的话就会找上一级结构体。
}func (a *dog) Init(name string, feet int) {a.name = namea.feet = feet
}func main() {a1 := &dog{}a1.Init("小狗", 4)a1.wang()fmt.Println(a1.name)fmt.Println(a1.feet)
}小狗会汪汪汪
小狗
4

而结构体的嵌套是什么样子呢?举一个简单的例子

就是加上类型。

继承存在的问题是非常多的,在后续都会介绍。

2.3 多态

多态啥意思?

就是在不同继承关系的类对象,调用同一函数时,产生的不同行为。

暂时先这样理解

变量(实例)具有多种形态,在Go语言中,多态特征是通过接口实现的。

可以按照统一的接口来调用不同的接口实现。这时接口变量就呈现出不同的形态。

这就是go里面多态的实现。

package mainimport "fmt"type Speaker interface {Speak()
}type Person struct {name string
}func (p *Person) Speak() {fmt.Println("Hello, I am a person")
}type Cat struct {name string
}func (c *Cat) Speak() {fmt.Println("Hello, I am a cat")
}func main() {speaker1 := &Person{}speaker2 := &Cat{}speaker1.Speak()speaker2.Speak()
}Hello, I am a person
Hello, I am a cat

虽然这里也实现了,但是实际上,不能完全被称为多态,为什么?

因为这里没有做到父类指针(或者父类引用)指向子类对象

func main() {var speaker Speakerspeaker = &Cat{}speaker.Speak()speaker = &Person{}speaker.Speak()
}

三.多继承和二义性

3.1 多继承

多继承:就是指一个结构体里面有着多个匿名结构体,从而实现了一个结构体的多个继承

那么随之而来就会有很多问题:

比如:如果我继承的多个父类,他们(包括本身)有相同的字段怎么办呢?

这里go语言提供了一种解决办法,就是通过加匿名字段的类型,从而实现对相同属性的区分

(这里也被称之为同名二义性)

并且继承之后,也可以调用父类的方法,不过虽然是调用父类的方法,但是本质你还是修饰的父类,所以打印的内容还是属于是父类的。

package mainimport "fmt"type Father struct {Name stringAge  int
}type Mother struct {Name string
}type Son struct {Name string// 结构体的匿名字段可以是基础数据类型,这种没有名字的字段就称为匿名字段,调用时基于该基础数据类型调用即可;//这里匿名字段的说法并不代表没有字段名,而是默认会采用类型名作为字段名;// 结构体要求字段名称必须唯一,因此一个结构体中同种类型的匿名字段只能有一个。// 继承多个结构体,尽管Go语言支持多继承,但推荐少用。很多语言就将多重继承去除了,因为容易造成逻辑混乱。FatherMother
}func (f *Father) DriveCar() {fmt.Printf("%s开车很稳~\n", f.Name)
}func (m *Mother) Sing() {fmt.Printf("%s唱歌很好听~\n", m.Name)
}func (s *Son) Dance() {fmt.Printf("%s跳舞很好看\n", s.Name)
}func main() {// 构建Son结构体实例// s := Son{"唐三", 18, Father{"唐昊", 30}, Mother{"阿银"}}s := Son{"唐三",18,// 在创建嵌套匿名结构体变量(实例)时,可以直接指定各个匿名结构体字段的值;Father{Name: "唐昊",Age:  30,},Mother{Name: "阿银",},}fmt.Printf("s = %v\n", s)// 通过Son结构体实例的确可以调用多个继承结构体的方法s.Sing()s.Dance()s.DriveCar()// 如嵌入的匿名结构体有相同的字段名或者方法名称,则在访问时,需要通过匿名结构体类型名来区分;fmt.Printf("[%s]的今年[%d]岁, 父亲是: [%s], 今年[%d]岁, 母亲是: [%s]\n", s.Name, s.int, s.Father.Name, s.Age, s.Mother.Name)
}s = {唐三 18 {唐昊 30} {阿银}}
阿银唱歌很好听~
唐三跳舞很好看
唐昊开车很稳~
[唐三]的今年[18]岁, 父亲是: [唐昊], 今年[30]岁, 母亲是: [阿银]

3.2 二义性

二义性:主要分为同名二义性和路径二义性

同名二义性就是字段名字一样,通过加上匿名字段来分隔就可以

其次就是路径二义性:举个例子:

子类调用祖父类的属性,父类有两个,编译器不知道这个属性是从哪一个路径来的,被称为是路径二义性。

package mainimport "fmt"type A struct {X int
}type B struct {A
}type C struct {A
}type D struct {BC
}func main() {test := D{B: B{A{X: 1}}, C: C{A{X: 2}}}fmt.Println(test.X)//fmt.Println(test.B.X) // 输出: 1//fmt.Println(test.C.X) // 输出: 2
}

对于这种情况,就会出现一个报错的问题。

至于怎么解决,其实和解决上述方法一样,加上前缀匿名字段即可

四.多态的进一步了解

4.1 多态实现的三个条件

多态:总结一句话:同一对象的不同表现形式

在C++的学习里面,常说多态有三个条件嘛:

  1. 要有继承
  2. 要有虚函数重写
  3. 父类指针(或者父类引用)指向子类对象

但是在go语言稍微有点区别,其实继承已经改为实现接口,虚函数重写其实就是类似一个接口,通过对接口定义的方法进行重写,最后通过接口对象获取不同的类型,从而达到一个多态的效果。

package mainimport "fmt"type Speaker interface {Speak()
}type Person struct {name string
}func (p *Person) Speak() {fmt.Println("Hello, I am a person")
}type Cat struct {name string
}func (c *Cat) Speak() {fmt.Println("Hello, I am a cat")
}func main() {var speaker Speakerspeaker = &Cat{}speaker.Speak()speaker = &Person{}speaker.Speak()
}

相关文章:

Go语言接口实现面对对象的三大特征

一.知识回顾 在 Go 语言中,接口是一种强大的抽象机制,它允许我们定义一组方法签名,任何类型只要实现了这些方法,就被视为实现了该接口。接口的实现是隐式的,这意味着类型不需要显式声明它实现了某个接口,只…...

TS 字面量类型

str是string类型l str2是常量,类型是字面量类型 用途:配合联合类型确定更严谨精确的可选值利恩...

langchain中 callbacks constructor实现

目录 代码代码解释代码结构代码功能 类似例子 代码 from typing import Any, Dict, Listfrom langchain_openai import ChatOpenAI from langchain_core.callbacks import BaseCallbackHandler from langchain_core.messages import BaseMessage from langchain_core.outputs …...

小土堆pytorch--tensorboard的使用

小土堆pytorch--tensorboard的使用 小土堆pytorch--tensorboard的使用0.介绍1.使用tensorboard绘制 y x 等简单函数1.1 相应的代码1.2 对上述代码的解释1.3 可能遇到的问题1.3.1 问题1.3.2 解决方法 2.使用tensorboard加载数据集中的图片2.1 相应代码2.2 对上述代码的解释2.2.…...

从 0 到 1:使用 Jetpack Compose 和智能自动化实现高效 Android UI 开发

现代 Android UI 开发正逐步从命令式 XML 向声明式 Compose 转变。Compose 凭借其简洁、高效、易测试的特点,能够让开发者更专注于界面和业务逻辑,而不必陷入大量模板化的代码。手把手带你构建一个完整的 Todo List 应用,并演示如何借助自动化…...

学习黑客 week1周测 复盘

Day 7 – 周测 & 复盘 今天任务: 完成 10 道快测题,涵盖 Week 1 的核心知识点:《CIA 三要素》、OWASP Top 10、MITRE ATT&CK、NIST RMF、Linux 权限、TCP/IP、网络安全法、“黑客五阶段” 与风险管理。撰写 300 字周总结&#xf…...

【五一培训】Day 3

Topic 1:元学习 一、概念:learn to learn 区分少样本学习与元学习 少样本学习(Few-shot learning)是元学习的一个重要应用,它指的是机器能够在仅有少量样本的情况下,成功地学习和泛化到新任务上。在许多现…...

C++继承详讲

1.继承的概念 继承是实现代码复用的手段,它允许程序员在保持基类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。 2.继承和组合 1.继承体系下,子类对象包含父类的成员。组合体系下,子类对象包含…...

第四节:OpenCV 基础入门-第一个 OpenCV 程序:图像读取与显示

一、引言:为什么选择 OpenCV? 在计算机视觉领域,OpenCV(Open Source Computer Vision Library)是一个开源的、跨平台的计算机视觉库,广泛应用于图像处理、模式识别、机器学习等领域。它支持多种编程语言&a…...

基于PHP实现的easy管理系统

easy管理系统 2.0.1 easy管理系统 是一个多功能的 Web 管理平台,旨在简化项目管理、文件共享和协作流程。它集成了大创项目管理、在线文档生成、代码托管等多种功能,并提供了用户管理、系统设置、日志查看等后台管理能力。 ✨ 功能特性 统一管理平台:…...

ios systeam introduction

Here is an in-depth look at Apple’s iOS, from its inception to its latest major release, covering architecture, core components, security, app lifecycle, development tools, and the headline features of iOS 18. iOS began life as “iPhone OS,” unveiled alo…...

【论文阅读】LLMOPT:一种提升优化泛化能力的统一学习框架

文章目录 第一遍一、摘要二、关键词三、预知识1. 什么是优化泛化问题2. 什么是消融研究3. model alignment(模型对齐) 第二遍:了解论文论点一、研究背景与目的二、相关工作三、LLMOPT框架四、METHODOLOGY(方法论)1. 数据处理2. 学习过程3. 自…...

Prompt多版本测试指南:如何科学评估不同提示词的效果

对于现代AI开发来说,同一个需求,不同的提示表达方式往往会产生截然不同的结果。因此,如何设计、测试和优化提示词成为了一项关键技能。 本文将深入探讨Prompt多版本测试的技术方法,帮助你系统性地评估不同提示词的效果&#xff0…...

每日c/c++题 备战蓝桥杯(洛谷P1015 [NOIP 1999 普及组] 回文数)

洛谷P1015 [NOIP 1999 普及组] 回文数 题解 题目描述 P1015 回文数 是NOIP 1999普及组的经典模拟题。题目要求如下: 给定一个数N(十进制)和进制K(2≤K≤16),将N转换为K进制表示后,通过以下操…...

最小单调子序列的长度+联通最小乘积

因为题目ICPC是英文版,基于大家都不怎么看的懂的情况下直接给大家进行题目讲解 题目1: 题目分析: 构造一个长度为n的排列 p(里面的数是1-n),不能重复得 max⁡(lis(p),lds(p)) 最小。 其中,lis(p)是 p 的最长递增子序…...

OpenHarmony平台驱动开发(一),ADC

OpenHarmony平台驱动开发(一) ADC 概述 功能简介 ADC(Analog to Digital Converter),即模拟-数字转换器,可将模拟信号转换成对应的数字信号,便于存储与计算等操作。除电源线和地线之外&#…...

数据结构与算法:回溯

回溯 先给出一些leetcode算法题,以后遇见了相关题目再往上增加 主要参考代码随想录 2.1、组合问题 关于去重:两种写法的性能分析 需要注意的是:使用set去重的版本相对于used数组的版本效率都要低很多,大家在leetcode上提交&#x…...

KaiwuDB X 遨博智能 | 构建智能产线监测管理新系统

​01 项目背景 遨博智能作为国内协作机器人行业领军企业,深度布局制造、农业、医疗、教育、民生等场景,出货量连续四年蝉联国内第一、世界第二。随着工业自动化的蓬勃发展,遨博智能生产规模不断扩大,先后在常州、淄博等地建设完成…...

高等数学第三章---微分中值定理与导数的应用(§3.6 函数图像的描绘§3.7 曲率)

3.6 函数图像的描绘 一、曲线的渐近线 对于某些函数,其图形向无穷远处延伸时,会越来越趋近于某一条直线,这条直线被称为曲线的渐近线 (Asymptote)。 1. 定义 若曲线 y f ( x ) yf(x) yf(x) 上一点 P ( x , y ) P(x, y) P(x,y) 沿曲线趋…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.2 数据类型转换(CAST函数/自定义函数)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据分析实战:数据清洗之数据类型转换(CAST函数/自定义函数)4.2 数据类型转换:让数据「格式正确,类型对…...

docker:制作镜像+上传镜像+拉取镜像

1.dockerfile制作镜像 示例内容: 1.创建一个index.js的文件 console.log("hello world")2.在相同目录下创建名为dockerfile的文件 FROM node:alpine COPY index.js /index.js CMD node /index.js3.构建镜像 docker build -t minterra/hello-docker . …...

信息系统监理师第二版教材模拟题第三组(含解析)

信息系统监理师模拟题第三组(30题) 监理基础理论 信息系统工程监理的性质是( ) A. 服务性、独立性、公正性、科学性 B. 强制性、营利性、行政性、技术性 C. 临时性、从属性、随意性、主观性 D. 单一性、封闭性、被动性、保守性答案:A 解析:监理具有服务性、独立性、公正…...

潮乎盲盒商城系统全开源多级分销推广海报奖品兑换试玩概率OSS云存储多端源码

一、源码描述 这是一套潮乎盲盒商城源码,仿小叮当盲盒商城,后端Laravel框架前端uniappvue,前后端数据库分离,支持四端同步数据(H5小程序等),测试环境: php7.4,mysql5.6,…...

文章记单词 | 第64篇(六级)

一,单词释义 residence [ˈrezɪdəns] n. 住宅;居住;住所;居住期fling [flɪŋ] v. (用力地)扔,掷,抛;猛动(身体或身体部位);急冲&a…...

数据同步实战篇

文章目录 数据同步实战篇1. mysql数据同步1.1 mysql集群部署1.2 数据同步1.2.1 同步复制1.2.2 异步复制1.2.3 半同步复制 2. redis数据同步2.1 redis集群部署2.2 数据同步 3. mq数据同步3.1 mq集群部署3.2 数据同步 4. es数据同步4.1 es集群部署4.2 数据同步 数据同步实战篇 数…...

具身系列——Double DQN算法实现CartPole游戏(强化学习)

完整代码参考: rl/ddqn_cartpole.py 陈先生/ailib - Gitee.com 部分训练得分: Model saved to ./output/best_model.pth New best model saved with average reward: 9.6 Episode: 0 | Train Reward: 25.0 | Epsilon: 0.995 | Best Eval Avg: 9.6…...

以下是在 Ubuntu 上的几款PDF 阅读器,涵盖轻量级、功能丰富和特色工具:

默认工具:Evince(GNOME 文档查看器) 特点:Ubuntu 预装,轻量快速,支持基本标注和书签。 安装:已预装,或手动安装: sudo apt install evince功能全面:Okular&…...

有关水下图像增强的论文

4.21 TEBCF:Real-World Underwater Image Texture Enhancement Model Based on Blurriness and Color Fusion 基于模糊和颜色融合的现实水下图像纹理增强模型 2022年的一篇文章,基于传统方法,基于不同的色彩方法构建了两个新的融合输入。一…...

Raycaster光线投射

Raycaster光线投射 3D虚拟工厂在线体验 描述 光线投射Raycaster,用于进行raycasting(光线投射)。 光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体)。 构造器 Raycaster( origin : Vector3, dire…...

javaEE——单例模式

目录 前言1.概念2. 实现3. 比较和改进总结 前言 本篇文章来介绍单例模式,并讲述在保证线程安全的前提下,单例模式的写法。 1.概念 单例模式是一种设计模式,可以说是写代码的一种模板,如果在一些固定的场景下按照设计模式进行写…...

WSL在D盘安装Ubuntu

目录 前提条件步骤一:查看可用的Linux发行版步骤二:安装Ubuntu 22.04步骤三:导出已安装的Ubuntu到D盘步骤四:注销当前Ubuntu安装步骤五:在D盘导入Ubuntu启动Ubuntu 前提条件 Windows 10或Windows 11系统已启用WSL功能…...

Java并发编程-多线程基础(三)

文章目录 线程间通信线程间通信的核心问题volatile 关键字1. 核心特性2. 使用限制3. 示例 synchronized 关键字1. 核心特性2. 示例 volatile 与 synchronized 的对比Volatile 和 Synchronized 最佳实践 线程间通信 线程间通信的核心问题 多个线程通过共享内存实现信息交换&am…...

React--》掌握react构建拖拽交互的技巧

在这篇文章中将深入探讨如何使用react-dnd,从基础的拖拽操作到更复杂的自定义功能带你一步步走向实现流畅、可控且用户友好的拖拽体验,无论你是刚接触拖拽功能的初学者还是想要精细化拖拽交互的经验开发者,都能从中找到适合自己的灵感和解决方案。 目录 …...

【Qt】常用的类与数据类型

目录 一、Qt常见基本数据类型 二、Qt 字符串类应用 2.1 操作字符串 2.2 查询字符串 三、QMap 类&QHash 类&QVector 类 3.1 QMap 类 3.2 QHash 类 3.3 QVector 类 四、QList 类&QLinkedList 类 4.1 QList 类 4.2 QLinkedList 类 4.3 STL 风格迭代器遍历…...

React实现B站评论Demo

该Demo涉及的技术点 useState函数(数据驱动视图)子组件的封装条件判断回调函数的封装 1、评论数据 {"list": [{"rpid": 3,"user": {"uid": "13258165","avatar": "http://toutiao.…...

从实列中学习linux shell12 通过Shell脚本来优化MySQL数据库性能,特别是慢SQL跟踪和索引优化

在Shell脚本中优化MySQL数据库性能,特别是慢SQL跟踪和索引优化 可以通过以下步骤实现。以下是一个结构化的解决方案,包含示例代码和详细说明: 1. 启用慢查询日志 目标:动态启用慢查询日志并配置参数,收集慢SQL数据。…...

ES6入门---第三单元 模块一:类、继承

补充&#xff1a; prototype 属性使您有能力向对象添加属性和方法。 object.prototype.namevalue <script>function Person(name, age){this.name name;this.age age;}/* Person.prototype.showName function(){return 名字为: ${this.name};};Person.prototype.showA…...

CSS 变量与原生动态主题实现

CSS 变量与原生动态主题实现 CSS 变量基础 CSS 变量&#xff08;自定义属性&#xff09;是 CSS 语言的一项强大功能&#xff0c;允许我们在样式表中定义和重用值。与 SCSS 或 LESS 等预处理器中的变量不同&#xff0c;CSS 变量在运行时计算&#xff0c;这意味着它们可以动态更…...

Ubuntu 安装 Docker

安装 Docker 1. 卸载旧版本&#xff08;如果有&#xff09; sudo apt-get remove docker docker-engine docker.io containerd runc 2. 更新 APT 包的索引 sudo apt-get update 3. 安装依赖包 sudo apt-get install -y \ca-certificates \curl \gnupg \lsb-release4. 添加…...

SpringMVC——第三章:获取请求数据

假设有这样一个请求&#xff1a;http://localhost:8080/springmvc/register?namezhangsan&password123&emailzhangsanpowernode.com 在SpringMVC中应该如何获取请求提交的数据呢&#xff1f; 在SpringMVC中又应该如何获取请求头信息呢&#xff1f; 在SpringMVC中又应…...

动静态库【Linux操作系统】

文章目录 动静态库制作静态库如何把第三方库安装在Linux系统中&#xff0c;如何使用第3方库方案一&#xff1a;为什么我们之前使用gcc/g编译C/C标准库的时候不用加选项-l xxx呢&#xff1f;方案二&#xff1a;方案三&#xff1a; 为什么不同平台的库不一样呢&#xff1f;动态库…...

Day 4:牛客周赛Round 91

好久没写了&#xff0c;问题还蛮多的。听说这次是苯环哥哥出题 F题 小苯的因子查询 思路 考虑求因子个数&#xff0c;用质因数分解&#xff1b;奇数因子只需要去掉质数为2的情况&#xff0c;用除法。 这里有个比较妙的细节是&#xff0c;提前处理出数字x的最小质因数&#xff0…...

drawDB:打造高效数据库设计流程

drawDB&#xff1a;打造高效数据库设计流程 drawDB 简介资源链接 核心功能详解1. 直观的实体关系图设计2. SQL 脚本生成3. SQL 导入功能4. 本地化存储与分享功能5. 自定义主题与外观 安装和使用教程本地开发环境搭建构建生产版本Docker 部署基本使用方法 应用场景和实际价值适用…...

【心海资源】子比主题新增注册与会员用户展示功能模块及实现方法

内容改写&#xff1a; 本次分享的是子比主题顶部展示注册用户与会员信息的功能模块及其实现方式。 你可以通过两种方式启用该功能&#xff1a; 直接在后台进入“外观 → 小工具”启用该展示模块&#xff0c;操作简便&#xff1b;也可将提供的代码覆盖至子比主题目录中&#…...

gitblit安装教程,搭建一个属于自己的Git版本仓库

本章教程,主要记录如何在Windows服务器上利用gitblit搭建GIT私有化仓库。 一、gitblit简介 官网地址:https://www.gitblit.com/ Gitblit 是一个开源的纯 Java 技术栈,用于管理、查看和服务Git仓库。 它主要设计为一款面向希望托管集中式仓库的小型工作组的工具。 二、基础环…...

2023年第十四届蓝桥杯省赛B组Java题解【简洁易懂】

2023年第十四届蓝桥杯省赛B组Java题解 题型概览与整体分析 题目编号题目名称题型难度核心知识点通过率&#xff08;预估&#xff09;A阶乘求和结果填空★☆☆模运算、数学规律95%B幸运数字结果填空★★☆进制转换、数位和计算80%C数组分割编程题★★☆组合数学、奇偶性分析65…...

Javase 基础加强 —— 01 异常

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 课程安排…...

iview 表单验证问题 Select 已经选择 还是弹验证提示

问题&#xff1a;iview 的 Select 下拉框的时候&#xff0c;数据验证必填&#xff0c;明明选择了数据&#xff0c;却一直提示验证不能通过 html代码&#xff1a; <Form ref"FormData" :model"FormData" :rules"ruleValidate" :label-width&qu…...

OrCAD中离图连接器、端口及网络标签的作用范围与选择指南

一、OrCAD主要连接元素概述 在OrCAD Capture原理图设计环境中&#xff0c;有三种主要的网络连接元素&#xff1a;离图连接器(Off-Page Connector)、端口(Port)和网络标签(Net Alias)。理解它们的作用范围和使用场景对设计清晰、可维护的原理图至关重要。 PS&#xff1a; 电源和…...

dpm_sysfs_add

这段代码是 Linux 内核中**设备电源管理&#xff08;PM&#xff09;子系统**与 **sysfs 文件系统**交互的核心实现&#xff0c;主要功能是为设备创建电源管理相关的 sysfs 属性文件。以下从五个关键维度进行深度解析&#xff1a; --- ### 一、功能架构全景 mermaid graph TD …...