自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小知识折射大智慧

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

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

原创 go 中 string 并发写导致的 panic

按照旧的数据结构来构造变量,Len 的部分设置为 16,Data 所指的内存数据设置为 nil,把结构体的内存位置和字符串的内存对应起来,再通过 unsafe 进行类型强转。方法,这是一个高层次的封装,减少直接操作指针的需求,同时仍然保留了灵活性和性能。: 通过提供高层次的接口,开发者不再需要手动操作指针,这大大降低了出错的风险以及潜在的安全漏洞。: 封装在方法内部,可以内建一些基本的错误检查和约束,进一步提升代码的安全性和健壮性。结构体,这是为了提供更安全和简洁的字符串操作方式。

2024-08-03 12:53:10 593

原创 编辑器 goland 和 visual studio code

使用 visual studio code 编译器进行 go 语言开发,对比安装常用的 go 插件,满足我们日常开发验证的小需求

2024-07-09 19:51:26 342

原创 cobra 命令行工具集

主要解释 cobra 三方库的使用,快速创建命令行工具,类比 grep、less 这样的指令。还会有很大的篇幅来介绍接收控制台命令行输入,因为控制台本身存在存在一些限制或者说模式的影响,会导致单行文本的输入受限。

2024-06-16 11:40:35 414

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

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

2024-04-21 23:36:22 409

原创 安全特性 悬垂指针

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

2024-03-04 16:27:30 555

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

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

2024-03-02 21:00:11 450

原创 动态加载库

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

2023-12-16 10:44:00 531

原创 外部函数接口FFI

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

2023-12-14 00:17:46 1243

原创 不安全的裸指针

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

2023-12-14 00:15:54 271

原创 模式|表达式匹配

if let。

2023-12-14 00:13:36 126

原创 字符串String

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

2023-12-10 21:50:33 266

原创 RUST博客帖子编辑示例

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

2023-12-09 20:23:16 492

原创 rust 包模块组织结构

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

2023-12-05 08:03:35 479

原创 enum 枚举类型

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

2023-12-05 08:02:20 129

原创 dyn 动态类型

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

2023-12-05 08:00:28 151

原创 RefCell 数据类型

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

2023-12-03 20:04:14 482

原创 引用计数 Rc 数据类型

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

2023-12-03 14:40:46 146

原创 装箱 Box 数据类型

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

2023-12-03 00:26:08 459

原创 trait 特征

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

2023-12-01 00:04:17 149

原创 生命周期标注

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

2023-12-01 00:01:49 372

原创 泛型数据类型

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

2023-11-28 23:55:39 99

原创 迭代器模式

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

2023-11-25 16:02:45 546

原创 结构体 struct

rust结构体打印

2023-11-22 23:20:47 186

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

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

2023-11-22 23:17:13 513

原创 rust 基础数据类型

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

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

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

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

2023-11-05 00:08:22 732

原创 Graphviz 作图画图工具

在日常工作中,我经常会想,有没有一个工具可以将我们项目代码结构脉络给清晰的展示出来,直白点就是函数的调用关系。这样我就可以全局查看目标函数究竟在哪些场景被调用了。「go pprof」好像就具备这样的能力,但它其实是依赖采样的,并不能完全表示项目的全貌。按照这个设想,我们做了如下调查。

2023-10-09 17:15:09 1122

原创 channel 转移数据

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

2023-09-20 00:28:12 324

原创 Redis过期时间的思考

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

2023-09-07 08:35:35 202

原创 async/await 编程理解

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

2023-08-20 08:07:32 1069

原创 如何使用 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 517

原创 rust 并发

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

2023-07-30 23:09:54 594

原创 go 内存分配

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

2023-07-30 23:00:32 300

原创 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 446

原创 rust 闭包函数

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

2023-07-29 22:00:17 884

原创 利用 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 409

原创 rust gtk 桌面应用 demo

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

2023-07-23 17:08:05 3363

原创 rust 的所有权

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

2023-07-17 07:31:15 874

原创 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 338

原创 rust 从转移说起

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

2023-07-05 00:04:39 551

隐藏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

空空如也

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

TA关注的人

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