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

Go:方法

方法声明

type point struct { X, Y float64 }// 普通函数
func Distance(p, q Point) float64 {return math.Hypot(q.x - p.x, q.y -  p.Y)
}// Point类型的方法
func (p Point) Distance(q Point) float64 {return math.Hypot(q.x - p.x, q.y -  p.Y)
}

方法声明与普通函数声明类似,只是在函数名前多一个参数(接收者 ),将方法绑定到对应类型上 。以几何包为例 ,定义Point结构体 ,分别展示计算两点距离的普通函数DistancePoint类型的方法Distance ,方法的接收者p类似面向对象语言中向对象发送消息 ,Go 语言中接收者名字可自行选择 ,常用类型名首字母 。

p := Point{1, 2}
q := Point{4, 6}
fmt.Println(Distance(q))   // 函数调用
fmt.Println(p.Distance(q)) // 方法调用
  • 调用方式:调用方法时,接收者在方法名前面 ,如p.Distance(q) ,与声明保持一致 ,p.Distance这种表达式称作选择子 。
type Path []Pointfunc(path Path) Distance() float64 {sum := 0.0for i := range path {if i > 0 {sum += path[i-1].Distance(path[i])}}return sum
}
  • 命名冲突:不同类型可使用相同方法名 ,如PointPath类型都有Distance方法 ,编译器根据方法名和接收者类型决定调用哪个 。在同一类型命名空间内 ,方法名不能与字段名冲突 。

类型与方法绑定

Go 语言可将方法绑定到多种类型上 ,不仅限于结构体类型 ,像Path这种命名的 slice 类型也能定义方法 。同一个包下 ,只要类型不是指针类型和接口类型 ,都可声明方法 。不同类型的同名方法彼此无关 ,如Path.Distance内部可能使用Point.Distance计算相邻点距离 。

指针接收者的方法

func (p *point) ScaleBy(factor float64) {p.x *= factorp.Y *= factor
}

当函数需更新变量,或实参过大想避免复制整个实参时,需用指针传递变量地址 。如(*Point).ScaleBy方法 ,用于按指定因子缩放Point结构体的坐标 ,其接收者为*Point指针类型 。

type P *int
func (P) f() { /*...*/ } // 编译错误:非法的接收者类型
  • 声明规则:方法名是(*Point).ScaleBy ,括号必需 ,否则表达式会被错误解析 。习惯上若类型的一个方法使用指针接收者,其他方法也尽量用指针接收者 。命名类型(如Point )与其指针(*Point )是不同类型 ,不允许本身是指针的类型进行方法声明 。
r := &Point{1, 2}
r.ScaleBy(2)
fmt.Println(*r) // "{2, 4}"
// or
p := Point{1, 2}
pptr := &p
pptr.ScaleBy(2)
fmt.Println(p)
// or
p := Point{1, 2}
(&p).ScaleBy(2)
fmt.Println(p)
  • 调用规则:可通过*Point类型变量调用(*Point).ScaleBy方法 ,如r := &Point{1, 2}; r.ScaleBy(2) 。若变量是Point类型,但方法要求*Point接收者 ,编译器会对变量进行&p的隐式转换 ,只有变量(包括结构体字段、数组或 slice 元素 )允许这种转换 ,不能对不能取地址的Point临时变量调用*Point方法 。

合法的方法调用表达式需符合以下三种形式:

  • 实参接收者和形参接收者是同一类型 ,如Point{1, 2}.Distance(q) (都是Point类型 ),pptr.ScaleBy(2) (都是*Point类型 )。
  • 实参接收者是T类型变量,形参接收者是*T类型 ,编译器会隐式获取变量地址 ,如p.ScaleBy(2)pPoint类型 )。
  • 实参接收者是*T类型,形参接收者是T类型 ,编译器会隐式解引用接收者获取实际取值 ,如pptr.Distance(q)

复制问题

若类型T方法接收者是T本身,调用方法时实参会被复制 ;若接收者是指针类型 ,应避免复制T实例 ,防止破坏内部数据 ,如bytes.Buffer实例复制会有问题 。

nil是一个合法的接收者

nil在自定义类型方法中的使用

type IntList struct {Value intTail *IntList
}func (list *IntList) Sum() int {if list == nil {return 0}return list.Value + List.Tail.Sum()
}

以整型数链表IntList为例 ,*IntList类型中nil代表空链表 。Sum方法用于返回链表元素总和 ,当接收者listnil时 ,直接返回 0 ,否则返回当前节点值与后续链表总和 。定义允许nil作为接收者的类型时 ,应在文档注释中明确标明 。

nil在标准库类型方法中的使用

// Values 映射字符串到字符串列表
type Values map[string][]string// Get 返回第一个具有给定 key 的值
// 如不存在,则返回空字符串
func (v Values) Get(key string) string {if vs := v[key]; 1en(vs) > 0{ return vs[0]
} return ""// Add 添加一个键值到对应 key 列表中
func (v Values) Add(key, value string){v[key] = append(v[key], value)
}

net/url包中的Values类型为例 ,它本质是映射字符串到字符串列表的map类型 ,提供GetAdd等方法 。Get方法返回指定键的第一个值 ,若键不存在或接收者为nil ,返回空字符串 ;Add方法向对应键列表添加值 。当Values类型接收者为nil时 ,Get方法可正常工作 ,但Add方法会宕机 ,因为尝试更新一个空map 。方法对接收者引用本身的改变(如设置为nil或指向不同map )不会影响调用者 。

通过结构体内嵌组成类型


ColoredPoint类型为例 ,它嵌套了Point结构体 ,并包含Color字段 。通过嵌套 ,ColoredPoint可直接使用Point的字段 ,如cp.X等同于cp.Point.X ,也能调用Point类型的方法 ,如p.Distance(q.Point) ,实现代码相当于自动生成了包装方法来调用Point声明的方法 。但要注意ColoredPoint不是Point ,不能直接传递ColoredPoint实例给要求Point参数的方法 。

嵌套类型的方法调用

ColoredPoint嵌套*Point指针类型时 ,字段和方法间接地来自所指向的对象 ,如pq可共享一个Point 。结构体类型可拥有多个嵌套字段 ,编译器处理选择子(如p.ScaleBy )时 ,优先查找直接声明的方法 ,再依次从嵌套字段的方法中查找 。

结构体嵌套在缓存实现中的应用

通过展示简单缓存实现的例子 ,说明结构体嵌套的实用性 。最初使用包级别的互斥锁mumapping变量保护map数据 ,后来将相关变量封装到cache结构体中 ,该结构体嵌套了sync.Mutex ,这样cache变量可直接使用MutexLockUnlock方法进行加锁和解锁操作 ,使代码结构更清晰 。

方法变量与表达式

方法变量

  • 可将选择子(如p.Distance )赋值给一个变量 ,形成方法变量 ,它是一个函数 ,绑定了方法(Point.Distance )和接收者p 。调用时只需提供实参 ,无需再提供接收者 。通过Point结构体的DistanceScaleBy方法示例 ,展示方法变量的赋值与调用 。
  • time.AfterFunc等场景中 ,方法变量很有用 。如启动火箭的例子 ,使用方法变量可使代码更简洁 ,直接传递r.Launchtime.AfterFunc ,在延迟后调用该方法 。

方法表达式

  • 方法表达式写成T.f(*T).f形式 ,其中T是类型 ,它把方法的接收者替换成函数的第一个形参 ,可像普通函数一样调用 。同样以Point结构体的DistanceScaleBy方法为例 ,展示方法表达式的赋值与调用 。

方法变量的应用场景

当需要用一个值代表同一类型的多个方法 ,并处理不同接收者时 ,方法变量很有帮助 。如Path.TranslateBy函数 ,根据add参数决定使用Point.AddPoint.Sub方法 ,对路径上的每个点进行相应计算 。

示例:位向量

在数据分析领域,对于元素为小的非负整型且元素众多,操作多为求并集和交集的集合,使用map[T]bool实现集合扩展性虽好但性能欠佳,位向量是更优数据结构 。

// IntSet 是一个包含非负整数的集合
// 零值代表空的集合
type IntSet struct {words []uint64
}
// Has 方法的返回值表示是否存在非负数x
func(s *IntSet) Has(x int) bool{word, bit := x/64, uint(x%64) return word < len(s.words) && s.words[word]&(1<<bit)!=0
}
// Add  添加非负数 x 到集合中
func(s *IntSet) Add(x int){word, bit  := x/64, uint(x%64) for word >= 1en(s.words){s.word s= append(s.words, 0)}s.words[word] |= 1<<bit
}// Unionwith 将会对 s 和 t 做并集并将结果存在 s 中
func(s *ntSet) Unionwith(t *IntSet){for i, tword := range t.words { if i < len(s.words){s.words[1] |= tword}else{  s.words = append(s.words, tword)}
}

IntSet类型的实现与方法

  • 结构定义IntSet结构体包含words []uint64字段 ,用无符号整型值的 slice 表示集合 ,每一位代表集合中的一个元素 。
  • 方法功能
    • Has方法:判断集合中是否存在非负数x ,通过计算x所在的字索引和位索引 ,检查对应位是否为 1 。
    • Add方法:向集合中添加非负数x ,确定x所在字索引 ,若字不存在则扩展words ,然后将对应位置为 1 。
    • UnionWith方法:对两个IntSet求并集 ,遍历另一个集合的字 ,与当前集合对应字按位或操作 ,不存在的字添加到当前集合 。
    • String方法:以字符串形式输出集合元素 ,使用bytes.Buffer ,遍历words ,对每个字的每一位检查 ,是 1 则将对应元素添加到字符串 。

注意事项

通过示例展示IntSet类型的使用 ,包括添加元素、求并集、判断元素是否存在等操作 。强调IntSet类型方法声明为指针类型接收者 ,使用值调用方法时需注意 ,编译器会隐式插入&操作符获取指针以调用String方法 ,若无String方法 ,fmt.Println会直接输出结构体 。

封装

  • 概念:封装(数据隐藏 )是面向对象编程重要方面,指变量或方法不能通过对象访问 。
  • 实现方式:Go 语言通过标识符首字母大小写控制命名可见性 ,首字母大写可从包中导出 ,首字母小写则不导出 ,要封装对象需使用结构体 。以IntSet类型为例 ,若定义为结构体且字段words首字母小写 ,则该字段在包外不可见 ;若重新定义IntSet为 slice 类型 ,表达式*s可在其他包内使用 ,但会暴露内部表示 。强调 Go 语言中封装单元是包而非类型 ,结构体字段在同包内代码可见 。

优点

  • 减少变量检查:使用方不能直接修改对象变量 ,减少检查变量值的代码 。
  • 隐藏实现细节:防止使用方依赖的属性改变 ,方便设计者灵活改变 API 实现且不破坏兼容性 。以bytes.Buffer为例 ,其内部字段未导出 ,外部使用者无需关心实现细节 ,仅感知性能提升 。
  • 保护对象内部资源:防止使用者随意改变对象内变量 ,包作者可通过包内函数维护对象内部资源 。如Counter类型 ,使用者只能通过特定方法递增或重置计数器 ,不能随意设置计数值 。介绍了用于获取或修改内部变量的gettersetter函数 ,命名时getter常省略Get前缀 。

导出字段与封装的权衡

Go 语言允许导出字段 ,但需慎重考虑 API 兼容性、维护复杂度等因素 。同时指出封装并非总是必需 ,如time.Duration类型暴露int64整型用于运算 ;对比IntSetgeometry.PathPath定义为 slice 类型可方便使用 slice 语法 ,IntSet不对外透明有其合理性 。

etter函数 ,命名时getter常省略Get`前缀 。

导出字段与封装的权衡

Go 语言允许导出字段 ,但需慎重考虑 API 兼容性、维护复杂度等因素 。同时指出封装并非总是必需 ,如time.Duration类型暴露int64整型用于运算 ;对比IntSetgeometry.PathPath定义为 slice 类型可方便使用 slice 语法 ,IntSet不对外透明有其合理性 。

参考资料:《Go程序设计语言》

相关文章:

Go:方法

方法声明 type point struct { X, Y float64 }// 普通函数 func Distance(p, q Point) float64 {return math.Hypot(q.x - p.x, q.y - p.Y) }// Point类型的方法 func (p Point) Distance(q Point) float64 {return math.Hypot(q.x - p.x, q.y - p.Y) }方法声明与普通函数声…...

十四种逻辑器件综合对比——《器件手册--逻辑器件》

目录 逻辑器件 简述 按功能分类 按工艺分类 按电平分类 特殊功能逻辑器件 应用领域 详尽阐述 1 逻辑门 一、基本概念 二、主要类型 三、实现方式 四、应用领域 2 反相器 工作原理 基本功能 主要应用 常见类型 特点 未来发展趋势 3 锁存器 基本概念 工作原理 主要类型…...

[网鼎杯 2022 青龙组]fakeshell

这个题&#xff0c;我们查壳之后是upx壳。 但是当我们用upxunpack解包的时候我们解不出来。 说明有人动过这个包。 然后我们打开010eider&#xff0c;修改他的魔改 将此处&#xff0c;我们改成UPX我们在解包就可以了。然后我重新使用upxunpack 之后我们成功得到未加密的文件…...

vivado + modelsim 仿真:Post-Synthesis Timing Simulation

Vivado 结合Modelsim 实现综合后仿真的一种方法 Post-Synthesis Timing Simulation 使用Vivado 生成仿真所需文件创建Modelsim工程参考文档 使用Vivado 生成仿真所需文件 Vivado simulation 中可勾选Generate simulation scripts only;勾选-sdf_anno; 在testbanch文件中例化gl…...

可能存在特殊情况,比如控制台显示有延迟、缓冲问题等影响了显示顺序。

从控制台输出看&#xff0c;正常逻辑应是先执行 System.out.println(" 未处理异常演示 "); 输出对应文本&#xff0c;再因 arr 为 null 访问 length 触发 NullPointerException 输出异常信息。可能存在特殊情况&#xff0c;比如控制台显示有延迟、缓冲问题等影响…...

使用Python建模量子隧穿

引言 量子隧穿是量子力学中的一个非常有趣且令人神往的现象。在经典物理学中,我们通常认为粒子必须克服一个势垒才能通过它。但是,在量子力学中,粒子有时可以“穿越”一个势垒,即使它的能量不足以克服这个势垒。这种现象被称为“量子隧穿”。今天,我们将通过 Python 来建…...

Python-控制语句

控制语句 控制语句和逻辑思维 控制语句:把语句组合成能完成一定功能的小逻辑模块分类:顺序、选择、循环“顺序结构”:代表“先执行a,再执行b”的逻辑“条件判断结构”:代表“如果…,则…”的逻辑“循环结构”:代表“如果…则重复执行…”的逻辑条件判断结构 选择结构通…...

库学习04——numpy

一、基本属性 二、 创建数组 &#xff08;一&#xff09;arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一个参数n的话&#xff0c;默认是从0到n-1的一维数组。 &#xff08;二&#xff09;自定义reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …...

DeepSeek在应急救援领域的应用解决方案

DeepSeek在应急救援领域的应用解决方案 一、引言 1.1 应急救援领域现状 近年来&#xff0c;我国应急管理工作全面加强&#xff0c;取得了显著成效。然而&#xff0c;一系列重特大灾害事故暴露出我国应急管理体系存在诸多问题短板。例如&#xff0c;在责任落实、应急处突、法…...

【HCIP】GRE VPN实验笔记

一、实验拓扑 二、实验要求 1、按照图示配置IP地址 2、在R1和R3上配置默认路由使公网区域互通 3、在R1和R3上配置GRE VPN&#xff0c;使两端私网能够互相访问&#xff0c;Tunnel口IP地址如图 4、在R1和R3上配置RIPv2或者ospf或者静态&#xff0c;来传递两端私网路由 三、实…...

ChatRex: Taming Multimodal LLM for Joint Perception and Understanding 论文理解和翻译

一、TL&#xff1b;DR MLLM在感知方面存在不足&#xff08;远远比不上专家模型&#xff09;&#xff0c;比如Qwen2-VL在coco上recall只有43.9%提出了ChatRex&#xff0c;旨在从模型设计和数据开发两个角度来填补这一感知能力的缺口ChatRex通过proposal边界框输入到LLM中将其转…...

10min速通Linux文件传输

实验环境 在Linux中传输文件需要借助网络以及sshd&#xff0c;我们可通过systemctl status sshd来查看sshd状态 若服务未开启我们可通过systemctl enable --now sshd来开启sshd服务 将/etc/ssh/sshd_config中的PermitRootLogin 状态修改为yes 传输文件 scp scp &#xff08;Sec…...

CE、NCE、InfoNCE的演变过程

CE、NCE、InfoNCE的演变过程及数学推导和关系 在机器学习和深度学习中&#xff0c;交叉熵&#xff08; C E CE CE&#xff09;、噪声对比估计&#xff08; N C E NCE NCE&#xff09;和信息噪声对比估计&#xff08; I n f o N C E InfoNCE InfoNCE&#xff09;是三个紧密相关…...

在Vue项目的引入meting-js音乐播放器插件

开源项目&#xff1a;https://github.com/swzaaaaaaa/NBlog 1、开源项目中音乐播放插件的使用流程 步骤1&#xff1a;下载meting-js相关文件 在MetingJS官方仓库或其他可靠的CDN获取meting-js的JavaScript文件以及相关依赖&#xff08;如APlayer的文件&#xff09;。将它们下…...

rapidocr 2.0 在线demo来了

引言 今日北京大风&#xff0c;大家都窝在家里&#xff0c;自己也趁着周末更新了RapidOCR在线demo&#xff0c;适配rapidocr2.0系列。 rapidocr2.0支持4个推理引擎&#xff08;ONNRuntime、OpenVino、PaddlePaddle和PyTorch&#xff09;&#xff0c;且整理了文本检测和文本识…...

Compose笔记(十五)--进度条

这一节了解一下Compose中的进度条&#xff0c;有两种类型的进度条可供使用&#xff0c;分别是线性进度条&#xff08;LinearProgressIndicator&#xff09;和圆形进度条&#xff08;CircularProgressIndicator&#xff09;&#xff0c;每种进度条又可分为确定模式和不确定模式。…...

图谱可视化的海洋生物信息查询网站的设计与实现(springboot+ssm+vue)含文档

图谱可视化的海洋生物信息查询网站的设计与实现(springbootssmvue)含文档 该系统是一个图谱可视化的海洋生物信息查询网站&#xff0c;主要功能包括海洋动物、海洋植物、生物图鉴、保护生物和海洋生物分布等模块&#xff1b;用户可以通过系统首页访问这些模块&#xff1b;在海…...

目标追踪Hyperspectral Adapter for Object Tracking based on Hyperspectral Video

论文作者&#xff1a;Long Gao,Yunhe Zhang,Langkun Chen,Yan Jiang,Weiying Xie,Yunsong Li 作者单位&#xff1a;Xidian University;the University of Sheffield 论文链接&#xff1a;http://arxiv.org/abs/2503.22199v1 内容简介&#xff1a; 1&#xff09;方向&#x…...

【HD-RK3576-PI】Linux制作deb包的方法

1.什么是deb包 &#xff1f; DEB包是Debian及其衍生Linux发行版&#xff08;如Ubuntu、Linux Mint等&#xff09;使用的软件包格式。DEB包主要用于简化软件的安装、更新和卸载过程。它实际上是一个归档文件&#xff0c;通常包含了两个主要部分&#xff1a; 数据压缩包&#xf…...

FileInputStream 详解与记忆方法

FileInputStream 详解与记忆方法 一、FileInputStream 核心概念 FileInputStream 是 Java 中用于从文件读取原始字节的类&#xff0c;继承自 InputStream 抽象类。 1. 核心特点 特性说明继承关系InputStream → FileInputStream数据单位字节&#xff08;8bit&#xff09;用…...

什么是回表?哪些数据库存在回表?

目录 一、什么是回表1. 回表的核心流程2. 示例说明3. 回表的性能问题4. 总结 二、哪些数据库会有回表1. MySQL&#xff08;InnoDB&#xff09;2. Oracle3. 其他数据库&#xff08;如 SQL Server、PostgreSQL&#xff09;4. 总结 三、非聚集索引与聚集索引的区别及产生原因1. 聚…...

跨平台开发的挑战与突破:Java开发工具的探索与实践!

全文目录&#xff1a; 开篇语前言摘要概述源码解析代码实例代码解析代码解析1. import java.io.File;2. public class CrossPlatformFileManager3. public static void main(String[] args)4. String filePath "example.txt";5. File file new File(filePath);6. *…...

JDK的卸载与安装

卸载JDK 删除java的1安装目录 卸载JAVA_HOME 删除path下关于java的路径 java -version查看 安装JDK 百度搜索JDK&#xff0c;找到下载地址 同意协议 下载电脑对应版本 双击安装 记住安装路径 配置环境变量 我的电脑–>右键–>属性–>高级系统设置 环境变…...

CyclicBarrier 基本用法

CyclicBarrier 基本用法 简介 CyclicBarrier 是 Java 并发包&#xff08;java.util.concurrent&#xff09;中的一个同步辅助类。它允许一组线程相互等待&#xff0c;直到到达某个公共屏障点&#xff08;common barrier point&#xff09;。只有当所有参与的线程都到达屏障点…...

限流、降级、熔断、隔离?

在微服务架构中&#xff0c;服务限流、降级、熔断和隔离是保障系统高可用性的核心手段&#xff0c;但它们解决的问题和应用场景不同。以下是它们的区别、解决方案和实际案例的详细说明&#xff1a; 一、服务限流&#xff08;Rate Limiting&#xff09; 定义&#xff1a;通过限…...

asm汇编源代码之-字库转换程序

将标准的16x16点阵汉字库(下载16x16汉字库)转换成适合VGA文本模式下显示的点阵汉字库 本程序需要调用file.asm中的子程序,所以连接时需要把file连接进来,如下 C:\> tlink chghzk file 调用参数描述如下 C:\> chghzk ; 无调用参数,转换标准库文件(SRC16.FNT)为适合VGA…...

深入浅出:信号灯与系统V信号灯的实现与应用

深入浅出&#xff1a;信号灯与系统V信号灯的实现与应用 信号灯&#xff08;Semaphore&#xff09;是一种同步机制&#xff0c;用于控制对共享资源的访问。在多线程或多进程环境下&#xff0c;信号灯能够帮助协调多个执行单元对共享资源的访问&#xff0c;确保数据一致性与程序…...

定时器介绍及简单应用

定时器介绍及简单应用 文章目录 定时器介绍及简单应用1.定时器基本介绍1.1MSP430的四种定时器&#xff1a; 2.定时器A&#xff08;Timer_A)2.1特点2.2寄存器的命名2.3寄存器表格2.4计数器原理说明2.4.1时钟源、分频器、计数器、工作模式2.4.2计数器复位 2.5定时器中断2.5.1定时…...

运行一次性任务与定时任务

运行一次性任务与定时任务 文章目录 运行一次性任务与定时任务[toc]一、使用Job运行一次性任务1.创建一次性任务2.测试一次性任务3.删除Job 二、使用CronJob运行定时任务1.创建定时任务2.测试定时任务3.删除CronJob 一、使用Job运行一次性任务 1.创建一次性任务 &#xff08;…...

TypeScript入门

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

MySQL数据库备份与恢复详解

在数据库管理中&#xff0c;数据的备份与恢复是至关重要的一环。对于MySQL数据库&#xff0c;定期备份不仅能防止数据丢失&#xff0c;还能在发生故障时快速恢复数据库。本文将详细介绍MySQL数据库的备份与恢复方法&#xff0c;覆盖所有常用备份和恢复方式&#xff0c;帮助大家…...

【c语言】猜凶手

日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&#xff0c;1个人说的是假话。 现在请根据这些信…...

Java学习打卡-Day25-注解和反射、Class类

注解&#xff08;JDK5引入&#xff09; 什么是注解&#xff1f; Java注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xf…...

【愚公系列】《Python网络爬虫从入门到精通》048-验证码识别(滑动拼图验证码)

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

CMake中add_custom_target用法详解

在 CMake 中&#xff0c;add_custom_target 是一个用于创建自定义构建目标的命令。它主要用于定义一些不生成文件&#xff0c;但需要执行的特定操作&#xff08;比如运行脚本、执行命令、触发其他构建步骤等&#xff09;。以下是它的核心用途和特点&#xff1a; 基本语法 add_…...

埃隆·马斯克如何通过开源创新塑造未来

李升伟 编译 埃隆马斯克的名字在多个行业回响——从电动汽车、太空探索到人工智能及更多领域。虽然许多人关注他革命性的公司&#xff08;如特斯拉、SpaceX、Neuralink和The Boring Company&#xff09;&#xff0c;但较少有人意识到他在开源软件运动中悄然却深远的影响力。本…...

大型语言模型中的工具调用(Function Calling)技术详解

一、引言 随着大型语言模型&#xff08;LLM&#xff09;能力的飞速发展&#xff0c;它们在自然语言理解、文本生成、对话交互等方面展现出了令人惊叹的表现。然而&#xff0c;LLM 本身并不具备执行外部操作的能力&#xff0c;比如访问网页、调用第三方 API、执行精确数学运算等…...

IKBC F108 白色背光普通版说明书

部分按键白色背光版和新的 RGB 版并不相同。比如灯光控制&#xff0c;新老款会有按键配置冲突的。 IKBC F108 白色背光款&#xff08;普通款&#xff09;按键说明​ ScrLk 倒计时定时器​ 使用 F1~F12 及 1~9 控制时间&#xff0c;设置完成按 Enter 确认&#xff0c;或按 En…...

Microsoft Office 如何启用和正常播放 Flash 控件

对于新安装的 Office 默认是不支持启用 Flash 组件的&#xff0c;Flash 组件会无法播放或者黑屏。 本片文章就带你解决这个问题&#xff0c;相关资料都在下方连接内。前提概要&#xff0c;教程对应的版本是 mso16&#xff0c;即 Office 2016 及更新版本&#xff0c;以及 365 等…...

muduo库源码分析: One Loop Per Thread

One Loop Per Thread的含义就是&#xff0c;一个EventLoop和一个线程唯一绑定&#xff0c;和这个EventLoop有关的&#xff0c;被这个EventLoop管辖的一切操作都必须在这个EventLoop绑定线程中执行 1.在MainEventLoop中&#xff0c;负责新连接建立的操作都要在MainEventLoop线程…...

[ARC196A] Adjacent Delete 题解

假设 n n n 是偶数。如果我们忽略删除相邻数的条件&#xff0c;即可以任选两个数相减&#xff0c;那么答案应该是前 n 2 \frac{n}{2} 2n​ 大的数&#xff08;记作“较大数”&#xff09;的和减去前 n 2 \frac{n}{2} 2n​ 小的数&#xff08;记作“较小数”&#xff09;的和…...

拼团系统设计-人群标签的设计与思考

目录 轻量化人群标签数据采集与Redis BitMap应用 为什么需要人群标签&#xff1f; 设计思路&#xff1a;轻量化人群标签系统 1. 核心目标 2. 技术选型&#xff1a;Redis BitMap 3. 数据链路设计 技术实现&#xff1a;代码级拆解 1. 人群标签任务调度 2. 用户ID与BitMap索引映射…...

【Python] pip制作离线包

制作离线安装包是一种非常实用的方法&#xff0c;尤其是在网络环境受限或需要在多台机器上部署相同环境时。以下是详细的步骤&#xff0c;帮助您创建一个包含所有依赖项的离线安装包&#xff0c;并在后续环境中复用。 步骤 1&#xff1a;准备工具和环境 确保您有一台可以访问互…...

Java学习手册:Java异常处理机制

在Java编程中&#xff0c;异常处理是确保程序健壮性和稳定性的关键机制。异常是指程序运行过程中出现的错误或异常情况&#xff0c;如除以零、文件找不到或网络连接失败等。Java提供了强大的异常处理机制&#xff0c;帮助开发者捕获和处理这些异常情况&#xff0c;从而避免程序…...

[特殊字符] 第十二讲 | 地统计学基础与克里金插值法(Kriging)建模实践

&#x1f4d8; 专栏&#xff1a;科研统计方法实战分享 | 地学/农学人的数据分析工具箱 ✍️ 作者&#xff1a;平常心0715 &#x1f5dd;️ 本讲关键词&#xff1a;Kriging、地统计学、变异函数、空间插值、空间预测、R语言 一、什么是地统计学&#xff1f; 地统计学&#xff0…...

Introducing Machine Learning with SAP Leonardo

Introducing Machine Learning with SAP Leonardo...

软考 系统架构设计师系列知识点之杂项集萃(49)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;48&#xff09; 第76题 某文件管理系统在磁盘上建立了位视图&#xff08;bitmap&#xff09;&#xff0c;记录磁盘的使用情况。若磁盘上物理块的编号依次为&#xff1a;0、1、2、……&#xff1b…...

list容器

1. list 的介绍 list 是序列容器&#xff0c;允许在序列中的任何位置进行O(1)时间复杂度的插入和删除操作以及双向迭代。 list 容器实现为带头结点双向链表&#xff0c;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。 2. list 的使用 2.1 构造函数 1.…...

Linux xorg-server 解析(一)- 编译安装Debug版本的xorg-server

一:下载代码 1. 配置源,以Ubuntu24.04 为例( /etc/apt/sources.list.d/ubuntu.sources): 2. apt source xserver-xorg-core 二:编译代码 1. sudo apt build-dep ./ 2. DEB_BUILD_OPTIONS="nostrip" DEB_CFLAGS_SET="-g -O0" dpkg-buildpac…...

VTK使用Render()渲染窗口的相关问题

转自个人博客&#xff1a;VTK使用Render()渲染窗口的相关问题 1. VTK更新数据但窗口不更新 问题&#xff1a;在对窗口内的数据进行更新后&#xff0c;VTK窗口不会立即更新&#xff0c;需要鼠标等交互后才会更新。 解决办法&#xff1a;对数据更新后&#xff0c;对VTK窗口也要…...