自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小知识折射大智慧

冷静观察,稳住阵脚,沉着应对,韬光养晦,善于守拙,决不当头,所有作为。关键还是要有所作为

  • 博客(497)
  • 资源 (5)
  • 收藏
  • 关注

原创 中栈内联(THE MID-STACK INLINER)优化

内联(InLining)的工作原理是将对一个函数的调用展开为函数本身的代码,通过内联减少函数调用的开销,也给编译器带来进一步优化代码的机会。内联可以帮助消除动态绑定的开销,通过在编译时确定具体的类型和方法,就不需要在运行时通过虚拟表(v-table)查找具体的函数地址。Go编译器会基于一套复杂的规则和模型来决定是否要对函数做内联,这个过程是Go编译时自动帮我们完成的。,Go版本环境为 1.21.9,以一种更简单的方式来深入了解内联优化。,接口的断言或反射是比较耗费性能的,通过内联可以减少反射上的性能开销。

2024-04-21 23:36:22 300

原创 安全特性 悬垂指针

做一个类比:我换手机号码了,但是没有通知老板,老板通讯录存的是我的旧号码。然后老板打电话有两种可能:打不通电话或者电话打通了,但是接电话的人不是我。英文名称 Dangling point,它还有一个兄弟叫 wild point - 野指针。当前版本的错误提示输出如下,这里借用的值已经发生了移动,联想一下。这个用的会比较常见,诸如。类型,就可以实现格式化。之后就不能再被访问了。下面是代码验证示例,声明类型标注,实现的。没有垃圾回收机制,当。

2024-03-04 16:27:30 475

原创 tree可视化查看目录结构

大多数情况下,我们只关心目录的结果,而不关心目录下文件的结果。全部展示出来的话显得没有重点,通过显示地指定。的附属,用来指定最后修改时间的格式。不过,这些内容都可以通过。另外的一些情况是,我们不想显示当前目录下的部分目录,我们想。的形式做内容输出,方便我们做日常分析使用。安装就不多说了,可以说说。属性就可以只输出目录。

2024-03-02 21:00:11 329

原创 动态加载库

为了让其它语言正常地识别。

2023-12-16 10:44:00 302

原创 外部函数接口FFI

是编程语言定义函数的一种方式,它允许其它编程语言来调用这些函数。代码可能需要与另外一种语言编写的代码进行交互。关键字来简化创建和使用外部函数接口(

2023-12-14 00:17:46 1062

原创 不安全的裸指针

实际上,将不安全的代码封装在安全的函数中是一种十分常见的抽象。但在使用裸指针时,我们却可以创建指向同一地址的可变指针和不可变指针,并通过可变指针来改变数据。由于这两个裸指针来自有效的引用,所以我们能够确认它的有效性。方法也是不安全的,因为它必须默认地址的偏移量也是一个有效的指针。借用一个切片的不同部分从原理上来讲是没有问题的,因为两个切片没有交叉的地方,但。与引用类似,裸指针要么是可变的,要么是不可变的,它们分别被写作。默认接收的裸指针参数是合法的,所以它是不安全的。的可变引用和不可变引用,那个就会因为。

2023-12-14 00:15:54 183

原创 模式|表达式匹配

if let。

2023-12-14 00:13:36 57

原创 字符串String

字符串字面量变量s属于字符串字面量,它们属于硬编码进程序的字符串值,属于不可变的类型。但并不是所有字符串的值都能够在编写代码时确定。

2023-12-10 21:50:33 192

原创 RUST博客帖子编辑示例

是一种面向对象的设计,它的关键点在于:一个值拥有的内部状态由数个状态对象()表的而成,而值的行为则随着内部状态的改变而改变。这个语法意味着该方法只能被包裹着当前实例的。不允许结构体中出现未被填充的值。方法需要获取状态值的所有权。无法在我们完成状态转换后再次使用旧的。的所有权并使旧的状态失效,从而将。定义了文章状态共享的行为,状态。声明中,第一个参数的类型是。调用,它会在调用过程中获取。值,并在原来的位置留下一个。值的所有权,而不能直接使用。状态转换为一个新的状态。这种代码,这可以确保。

2023-12-09 20:23:16 407

原创 rust 包模块组织结构

有几条规则决定了包可以包含哪些东西:首先,一个包中最多只能拥有一个库单元包。其次,包可以拥有多个二进制单元包。最后,包内必须存在至少一个单元包(库单元包或二进制单元包)。提供了一系列的功能来帮助我们管理代码,包括决定哪些细节是暴露的、哪些细节是私有的,以及不同的作用域的命名管理。)可以拥有多个二进制单元包及一个可选的库单元包。随着包内代码规模的增长,你还可以将代码拆分到独立的单元包(视作一个二进制单元包的根节点,这个二进制单元包与包拥有相同的名字。也会自动将其视作与包同名的库单元包的根节点。

2023-12-05 08:03:35 395

原创 enum 枚举类型

我们可以通过定义枚举IpAddrKind来表达这样的概念,声明该枚举需要列举出所有可能的IP地址种类,也就是所谓的枚举变体(variant枚举的变体全部位于其标识符的命名空间中,并使用两个冒号来将标识符和变体分隔开。由于和拥有相同的类型IpAddrKind,所以我们可以定义一个接收IpAddrKind类型参数的函数来统一处理它们。现在的定义只知道枚举的种类,却没有办法去存储实际的IP地址数据,只能起到一个标识的作用。但实际上,枚举允许我们在变体上嵌套数据。在新的IpAddr枚举变体中,V4和V6。

2023-12-05 08:02:20 55

原创 dyn 动态类型

约束的泛型参数来定义结构体,但两者的工作机制截然不同。泛型参数一次只能替代为一个具体的类型,而。约束就再好不过了,因为这段定义会在编译时被多态化以便使用具体的类型。对象则允许你在运行时填入多种不同的具体类型。通过在定义动态数组时指定。方法只关心值对行为的响应,而不在意。这个动态数组元素类型使用了新语法。对象,它被用来代表所有被放置在。如果你需要的仅仅是同质集合(实例只会接收那些能够调用。我们同样可以使用带有。

2023-12-05 08:00:28 69

原创 RefCell 数据类型

假如我们能够保证自己的代码在运行时符合借用规则,那么即使编译器无法在编译阶段保证符合借用规则,也能使用那些采用了内部可变性模式的类型。的设计模式之一,它允许你在只持有不可变引用的前提下对数据进行修改。为了能改变数据,内部可变性模式在它的数据结构中使用了。只能被用于单线程场景中。强行将它用于多线程环境中会产生编译时错误。则只会在运行时检查这些规则,并在违反借用规则的情况下触发。会在编译阶段强制代码遵守借用规则。正常的可变性和借用规则。(不安全)代码来绕过。

2023-12-03 20:04:14 397

原创 引用计数 Rc 数据类型

RUST提供了一个名为Rc的类型来支持多重所有权,Rc是的缩写。Rc类型实例会在内部维护一个用于记录值引用次数的计数器,从而确定这个值是否仍在使用。如果一个值的引用次数为零,就意味着这个值可以被安全清理掉,而不会触发引用失效的问题。你可以把Rc想象成客厅的电视,在第一个人打开电视之后,后续进入客厅的其他人都可以直接观看电视。电视会一直保持开启状态直到最后一个人离开时关闭,因为此时不需要再使用电视了。

2023-12-03 14:40:46 58

原创 装箱 Box 数据类型

RUST必须在编译时知道每一种类型占据的空间大小,但有一种递归的类型却无法在编译时被确定具体大小。Nil,我们尝试使用枚举来表达一个持有i32值的链表数据类型,通过不断嵌套元组的形式最终组成一个列表。但程序无法编译通过,RUST认为这个类型拥有无限大小,无法确认类型所占用的存储空间大小。Quit,RUST如何计算Message类型的大小?为了计算Message值需要多大的存储空间,RUST会遍历枚举中的每一个成员来找到需要最大空间的那个变体。不需要占用任何空间,需要两个存储i32。

2023-12-03 00:26:08 385

原创 trait 特征

将特定方法签名组合起来,用来实现某种目的所必须的行为集合。可以包含多个方法:每个方法签名占据单独一行并以分号结尾。约束用来将泛型参数指定为实现了某些特征行为的类型。用来以一种抽象的方式来定义共享行为,还可以使用。的类型都需要为上述方法提供自定义行为。

2023-12-01 00:04:17 77

原创 生命周期标注

结构体的字段也可以声明引用类型,不过需要为结构体定义中的每一个引用都添加生命周期标注。println!self.part如同泛型数据类型一样,为了在结构体定义中使用生命周期参数,我们需要在结构体名称后的尖括号内声明泛型周期参数的名字。这个标注意味这实例的存活时间不能超过存储在part中的引用的存活时间。结构体字段中的生命周期名字总是需要被声明在impl关键字之后,并被用于结构体名称之后,因为这些生命周期属于结构体类型的一部分。

2023-12-01 00:01:49 333

原创 泛型数据类型

在预导入模块找那个,所以我们不需要手动将其引入作用域。的泛型也有这样的类型约束。中间的加号(+)表示。也限制了切片的元素类型都是可比较的。的所有权,要保证这个操作顺利实现,就需要引入。当然,不是所有的类型都实现了。中想要通过大于(>)运算符来比较两个。就因为同时实现了这两个约束。

2023-11-28 23:55:39 63

原创 迭代器模式

自定义Counter结构体类型,并实现迭代器。其他语言的场景,读取数据库行数据时,使用的就是迭代器。我们使用for语言遍历数组,也是一种迭代。结构体对象实现Iteratortrait,创建自定义的迭代器,只需要实现一个next方法的定义。它会在每次调用时返回一个包裹在Some中的迭代器元素,并在迭代器结束时返回None。Item定义为关联类型,就像是给类型起了一个别名。这个迭代器并没有特别的地方,某种意义上它就是实现了一个接口,外部可以将这个对象当做接口来看待,最终体现在无脑适用迭代器提供的模式方法。

2023-11-25 16:02:45 514

原创 结构体 struct

rust结构体打印

2023-11-22 23:20:47 156

原创 for 循环变量的声明方式

在RUST中for循环中,变量的声明方式

2023-11-22 23:17:13 369

原创 rust 基础数据类型

整数的类型声明有别于其他语言,有符号整数类型名称以 u 开头,无符号以 i 开头。usize 和 isize 是两种特殊的整数类型,它们的长度取决于系统是 32位还是64位。但也有一些例外情况,比如,字符串类型的转换中变量 x 的类型,rust 就自动推导不出来。这种情况就需要显示的声明变量的类型。大部分情况下,rust 可以基于上下文自动推导出变量的类型。下面代码中,变量 x 没有显式,rust 默认是 i32 类型。对于位数为 n 的有符号整形,它可以存储。范围内的所有整数,无符号可以存储 0 到。

2023-11-05 16:13:02 493 1

原创 rust入门基础案例:猜数字游戏

案例出处是《Rust权威指南》,书中有更加详细的解释。

2023-11-05 00:08:22 677

原创 Graphviz 作图工具

选择 Graphviz 作为作图工具,主要是想通过代码创建图标,按照 Graphviz 的代码规范就可以生成 svg 的图片。了解 Graphviz 的第一步是,对象和属性是画图的核心:Graphive 提供的可视化对象有哪些,以及这些对象可以设置的属性。以属性nodesep来说明,它表示一个属性,作用的对象是GraphsGraphs表示无向图。通过文档说明,Graphviz 提供的可视化对象就显而易见。下面我们利用官网的示例来操作一下,加深对 Graphviz 中对象和属性的认识。建议大家在。

2023-10-09 17:15:09 553

原创 channel 转移数据

文章完全参考的内容,并没有进行直接翻译,而是使用另一个 redis 库来验证学习文章的例子。在了解 channel 的同时也掌握一些 redis 的编程。首先,我们需要在本机安装一个 redis 实例。

2023-09-20 00:28:12 290

原创 Redis过期时间的思考

比如,我们基于用户的地理位置推荐附近的陌生主播,当系统第一次匹配出最佳的主播时,会为用户缓存推荐的结果。在一段时间和地理范围内,这个推荐的结果保持不变。当我们把 Redis 当做缓存来使用时,设置过期时间是必须的,但具体设置多少的过期时间呢,针对不同的场景会有不同的决策。为什么要给这样的推荐结果做缓存呢?

2023-09-07 08:35:35 133

原创 async/await 编程理解

博客主要是参考,会结合简单的例子,对 async 和 await 做比较系统的理解,如何使用 async 和 await 是本节的重点。async 和 await 主要用来写异步代码,async 声明的代码块实现了 Future 特性,如果实现 Future 的代码发生阻塞,会让出当前线程的控制权,允许线程去执行别的 Future 代码。我把 async 代码块使用 Future 来表示,关键是理解 future 和执行线程之间的关系。

2023-08-20 08:07:32 1020

原创 如何使用 reqwest 包

我拼凑了下面代码,虽然耗费了很大的气力,但运行不起来,仔细观察运行提示,过程中发生 panic。向连接发起一个 GET 请求:https://hacker-news.firebaseio.com/v0/topstories.json,并解析返回的内容。这段代码使用到了 reqwest、Arc、futures、serde_json,暂时不考虑代码使用的合理性。因为是 GET 请求,可以先在浏览器中进行查看,浏览器可以正常显示一个 id 列表,如下所示。我们开始 coding。

2023-08-06 20:44:56 453

原创 rust 并发

go 语言面试中,经常会被问到 go 语言的优势,go 的高并发能力便是优势之一。那么,rust 的并发如何呢?我们先从如何使用并发谈起,接下来会列举几个例子来说明 rust 并发编程。

2023-07-30 23:09:54 532

原创 go 内存分配

关注 go 语言内存分配策略,主要是想了解 go 的性能。申请不同大小的内存,性能开销是有差别的,申请内存越大,耗时也越久,性能也越差。

2023-07-30 23:00:32 267

原创 rust 代码结构包和模块

rust 的头文件声明中经常会出现 extern、crate、use、mod 这些关键字,它们被用来给当前代码声明依赖。线上开发中,我们不会将所有的代码都写在 main.rs 的文件中,我们总是会组织代码结构。比如参考 MVC,会有 controller、service、model 等等目结构。我们还需要依赖各种各样的第三方库,比如 json 序列化和反序列化、发送 http 请求、gui界面等等。这些代码的结构组织和模块依赖,都需要依赖 extern、crate、use、mod 的声明。

2023-07-30 21:54:07 339

原创 rust 闭包函数

函数有自己的类型,可以像使用基础类型一样使用函数,包括将函数保存在变量中、保存在 vec 中、声明在结构体成员字段中。闭包函数也是函数,也有自己的类型定义。不过,函数实际上是指针类型,在 rust 所有权中属于借用的关系。我们声明一个 Vec 对象集,并使用闭包函数做排序。接下来我们自定义一个 City 结构体类型,Vec 中的每个元素都是 City 类型,后面会根据结构体中的 population 属性做排序。我们初始化 cities 变量,并向其中依次追加 3 个元素。

2023-07-29 22:00:17 848

原创 利用 trait 实现多态

但下面的代码会编译报错,提示 method not found,buf 实现了 Write trait,但编译器找不到这个 write_all 方法。问题的原因:特型本身必须在作用域中,否则,特型的所有方法都是隐藏的。我理解,这属于 rust 类型和 trait 的自动绑定过程。我在书上看到基于 std::io::Write 的示例,它是一个 trait 类型,内部声明了一些方法。下面的例子中调用 write_all 方式来演示,write_all 也是 Write trait 声明要实现的方法之一。

2023-07-25 08:00:53 363

原创 rust gtk 桌面应用 demo

精通Rust》里介绍了 GTK+框架的开发,这篇博客记录并扩展一下。rust 可以用于桌面应用开发,我还挺惊讶的,大学的时候也有学习过 VC++,对桌面编程一直都很感兴趣,而且一直有一种妄念,总觉得自己能开发一款很好用的桌面程序,就和总觉得自己能彩票中大奖一样。

2023-07-23 17:08:05 3056

原创 rust 的所有权

假设是 go 语言来实现同样的代码,程序没有任何问题,s1 和 s2 实际指向的同样的字符串,可以正常打印 s1,赋值前后压根不会对 s1 产生影响。快速解决上述问题的方案,是将赋值的方式修改为引用赋值,就像下面这样,给 s2 赋值的是 s1 的引用,这样 s2 就不能接管 neojos 字符串的所有权,引用赋值过程就属于。比如下面的例子,s2 指向了 s1 的可修改引用,s3 试图通过从 s2 取值,那么,s1 变量所拥有的值会发生转移吗?由 s1 转移给了 s2,然后 s1 变成了未初始化的状态。

2023-07-17 07:31:15 815

原创 Go参考TcMalloc内存分配

关于 span 和 class 的概念,内存的最小单位是 page,而 span 用来对 page 做管理,不同类型的 span 由不同数量的 page 组成,下图中,span A 由 2 个page 组成,span B 由 3 个 page 组成。ThreadCache 属于线程管理的内存,对象所需的内存申请在线程内部完成,不涉及到加锁的开销,主要负责小对象的内存分配。中对于 TCMalloc 的介绍,和第一张图相比,这张图在介绍的时候,拆成了三个模块:front-end 负责快速分配、回收内存;

2023-07-13 00:20:47 280

原创 rust 从转移说起

Rust 中,对大多数类型而言,给变量赋值、给函数传值或者从函数返回值,这些操作不会发生值复制,而是“转移”。所谓转移,就是原来的所有者让渡这个值的所有权给目标所有者,并变成未初始化状态。然后,由目标所有者控制这个值的生命期。Rust 专门提出了所有权和转移的概念,第一次接触总感觉晦涩,不属于正常思维,但还是得耐下性子,观摩观摩 Rust 所谓的转移。上面这段话是我抄的,绕来绕去的,

2023-07-05 00:04:39 468

原创 从 Option 类型说起

Option 不是结构体声明,而是枚举类型。印象中的枚举类型都是固定的常量,这里 Rust 的枚举支持了泛型。枚举了两种可能:有值、或没值。None表示没有值,Some(T) 表示存在 T 类型的值。

2023-07-01 11:59:50 583 1

原创 match more result 表达式

rust 中 match 表达式和 go 中 switch 有几分相似,但 rust 语言的无厘头性,让 math 有了更多的组合。

2023-07-01 11:24:38 445

原创 Go代码片段品鉴

作为一个服务端开发,熟悉我们服务的业务至关重要,但我们换工作的时候,也经常会换到别的业务场景下。比方说,我在成人教育的行业工作了2年,跳槽到了支付的行业。这么看的话,业务并不能成为服务端工程师的求职门槛。但我们可能会有被评价过缺少产品 sense,限制我们始终工作在一线。抛开业务的特殊场景,我们所开发的功能其实大同小异,面临的问题也有很高的重复性。当遇到之前解决过的问题,我经常会回忆之前写过的代码,代码本身可能很烂,但总觉得它经过了线上的考验,是信的过的。但很严肃的结果是,自己完全回忆不起来。

2023-06-18 20:36:56 870

隐藏Console窗口无效(续1)代码

隐藏Console窗口无效(续1)的代码包

2014-10-20

VC++进程注入

跟博客的代码一致,附加的door.dll的工程

2014-10-19

geoserver 样式(点,线,面)

用于geoserver样式的编辑,从代码中体会geoserver样式的书写规则,样式中通过filter类实现了样式的不同实现,将地图的表现更加的丰富

2014-03-16

Geoserver+Beginners+Guide电子书

电子书,感觉非常有收藏价值,基于地理信息的web map,希望能从中了解很多东西。

2014-01-25

OpenLayers

英文文档,但是英文比较简单,一般人都可以差不多的理解内容; 第一章:简单的例子介绍 第二章:FireBug介绍

2013-10-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除