- 博客(25)
- 收藏
- 关注
原创 Rust的特征详解Trait
注意 dyn 不能单独作为特征对象的定义,例如下面的代码编译器会报错,原因是特征对象可以是任意实现了某个特征的类型,编译器在编译期不知道该类型的大小,不同的类型大小是不同的。另外一种情况,如果想要一个数组中存放不同的对象,但是这些对象都实现了相同的特征的话,那也得用到特征对象。如果要实现这种返回不同对象的话,就得使用如下的代码。也就是说作为返回值的时候,不能够返回两个不同类型的对象。如果想返回一个对象,这个对象实现了某一个特征。Rust中的特征和其他语言的接口非常相似。存放实现了相同特征的不同对象的数组。
2024-09-13 14:56:49
242
原创 Rust的所有权和借用
什么样子的数据才会有所有权Rust中数据可以分为基本类型和非基本类型。可以通过以下两个方面来理解这些东西的所有权。就不会发生所有权的转化。也就是说所有权是针对于堆上分配的来说的。所有权转移是怎么样的每一个变量都是有作用域的。并且在离开这个作用域的时候,会调用Drop方法来释放这个变量所指代的内存。那么在这个作用域中,如果内存的所属权从一个变量转移到了另外一个变量。那就是发生了所有权的转移。所以,这也得出了以下的先决条件。这三条是所有权的规则。那在实际发生所有权转移的时候,内存中发生了什么事情呢。
2024-09-12 16:33:21
804
5
原创 Rust模式匹配
这段代码会报错,因为s的所有权转移到了_s上面,但是如果不用_s而是使用_的话,就不会报错了。当我们需要获取到这个T的时候,就可以用到模式绑定的语法特性。这个if let是只用于匹配match中单一的某一种类型的时候用的。在rust模式匹配中,单纯的下划线和下划线开头的变量有什么区别呢?上面这种情况汇总,if是不能解构出i的值的,只能是一个确定的值。每一个分支的最后一句话必须是一个语句,代表要返回的东西。在这个代码中,Option中的T被绑定到了i上面。在和这个例子中,所有分支的返回值类型都是相同的。
2024-09-12 14:49:47
175
原创 Rust泛型
在 Rust 中,如果你想编写一个方法,将结构体中某个字段的所有权转移出去,你不可以使用 &mut self 作为参数,因为 &mut self 是一个可变借用,而不是所有权的转移。为了转移所有权,你需要使用 self 作为方法的接收者。在这段代码中为什么value函数要返回val的引用呢?不返回引用换句话说,就是要把val的所有权给转移出去。在这个代码中,val的所有权被转移了。那么要实现这一点要怎么做呢?可不可以不返回引用。
2024-09-06 16:21:46
253
原创 Rust中的方法和关联函数
只要在 impl 块中的都叫 associated functions,其中,有 self 参数的是 methods。Rust中跟struct有关的函数都叫关联函数。如果这个关联函数第一个参数是self的话,那么这个函数就是方法。可以看出,对于一个方法来说,第一个参数的类型很重要。
2024-09-06 15:46:28
288
原创 Rust中的match和模式匹配和解构
也就是说如果match匹配里面只想关注其中一个分支的话,那么就可以简写为上面这种形式。如果给age赋值给None,那么就不会匹配成功。就会进入else分支。这段代码的上半部分,我认为是既用到了解构,又用到了模式匹配。并且有人觉得这种等效的写法是没有意义的,其实是有意义的。所以if let语法也可以看成是一种简写。是把这两合并到了一起。这里的这种语法就是·
2024-09-05 11:17:31
341
原创 【计算机网络】TCP全连接队列和半连接队列
在内核中维护了两个队列,全连接队列,半连接队列。他们在下图中表示。可以看到在收到客户端的SYN包之后,就会将这个socket放入半连接队列。在服务端收到最后一个ack的时候,放入全连接队列。
2024-02-22 09:37:08
415
1
原创 水平触发和边缘触发
为什么要使用非阻塞的socket?当多个进程监听同一个fd的时候,如果这个fd发生了三次握手,建立了连接,那么所有的进程都会收到通知。但是只有一个进程能够read到东西。如果此时不使用非阻塞的socket的话,那么一不小心就会阻塞进程了。
2024-02-18 11:54:54
142
原创 关于RESTful风格的一些思考
REST风格和面向过程面向对象的设计方式有什么区别?从更高的层次上看,他们是抽象的层次或者说是角度不同。REST重点是抽象资源。面向过程编程时,为什么要以算法和处理过程为中心,输入数据,输出结果?当然是为了符合计算机世界中主流的交互方式。
2022-12-02 11:48:31
121
原创 Kryo序列化
register方法究竟啥用?刚开始使用的时候根本不知道这玩意啥用。原来必须要配合kryo.writeClassAndObject(output,obj);一起使用才行。单独注册但是如果使用kryo.writeObject(output, obj);那么是没用的。
2021-08-20 11:27:43
152
原创 tcp,http队头阻塞
这里有两种队头阻塞,是不一样的。tcp 队头阻塞TCP数据包是有序传输,中间一个数据包丢失,会等待该数据包重传,造成后面的数据包的阻塞。http队头阻塞http1.x采用长连接(Connection:keep-alive),可以在一个TCP请求上,发送多个http请求。有非管道化和管道化,两种方式。非管道化,完全串行执行,请求->响应->请求->响应…,后一个请求必须在前一个响应之后发送。管道化,请求可以并行发出,但是响应必须串行返回。后一个响应必须在前一个响应之后。
2021-07-29 10:13:59
663
原创 Leetcode 17.电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。解法一class Solution { public List<String> ret = new ArrayList<>(); public static Map<Character, String> phoneMap = new HashMap<Character
2021-06-28 12:42:11
88
原创 Leetcode合并区间
合并区间以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].解法:可以将给定的intervals数组中的数字..
2021-06-25 21:32:29
165
原创 静态代理与动态代理
本文不讲概念,主要讲代码实现。静态代理从 JVM 层面来说, 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件。1.定义发送短信的接口// 定义一个必须要去实现的接口public interface SmsService { String send(String message);}2.实现发送短信的接口public class SmsServiceImpl implements SmsService { public String s
2021-06-23 11:32:56
143
原创 枚举与单例模式
枚举枚举的用法:enum Weekday { MON("1",1){ @Override public String toString() { return super.toString(); } // 注意这里重写了 @Override public boolean isOrdered() { return true; } },
2021-06-23 10:39:06
257
原创 快速幂算法思路
这里写自定义目录标题的的欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入的的欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何
2021-06-16 11:45:56
230
原创 gethash的实现
geohash算法介绍首先得到某一个点的经度和纬度(比如说 34.1° , 115° ),这个是能够精确得到的。然后,先从经度开始判断。比如说经度115 > (-180 和 180 的中间值)0° ,所以生成1,然后继续切分 (在剩下的 0 - 180)之间。在90的右边,继续生成 1,就这样不断地向下切分。得到一个二进制串,比如说01000111001… 当然可以无限切分。经度也是一样。然后按照经度为偶数位,纬度为奇数位进行合并。再用base32 编码进行编码。最后得到一串字符串。注意事
2020-11-26 16:43:11
981
原创 布隆过滤器基本使用
布隆过滤器基本原理: 原理就是维护一个很大的位数组。这个位数组的大小直接关系了最后判断的结果是否精确。确定好位数组之后,在确定几个hash函数。当添加一个值的时候,将这个值来进行hash运算,得到的结果对数组长度取余。并标记数组为1 。代表访问过。这样的话,如果判断一个元素是否存在,就按照上面的方法进行hash,如果有一个hash函数对应的数组位置上没有为1 ,那么这个元素一定不存在,如果所有hash的位置上都为1,也有可能 不存在,因为是别的元素放上去的1。所以还是有误差的。只不过这个误差可
2020-11-26 15:46:38
360
转载 SQL窗口函数详解
1.窗口函数语法<窗口函数>over(partitionby<用于分组的列名>orderby<用于排序的列名>)<窗口函数>的位置,可以放以下两种函数:1) 专用窗口函数,比如rank, dense_rank, row_number等2) 聚合函数,如sum. av...
2020-04-04 18:07:14
304
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人