- 博客(119)
- 收藏
- 关注
原创 Golang 容易被忽视的知识点(个人向)
Golang是由Google公司开发的一种 静态型、编译型 并且自带 GC 和 并发 的编程语言。特性:简单、易学类型系统抽象:仅仅支持最基本的类型组合,不支持继承和重载,但是Golang可以通过 接口实现多态工程结构简单快速编译:健全包管理机制,得益于包之间的树状依赖,Go初次编译速率可以和 C/Cpp 媲美,甚至第二次编译速率明显快于 C/Cpp原生支持并发:Go语言对多核处理器的编程进行了优化,Go从程序与结构方面来实现并发编程。开源在Golang中字符串可以用 "==" 和 "<" 等比较符进行比较
2025-03-23 19:12:25
937
原创 Java,Golang,Rust 泛型的大体对比小记
在我重构JVM尝试实现泛型时,在阅读《深入理解JVM》这本书时,对Java泛型的实现原因和应用场景有了一定了解,书中也将其与C#泛型进行了简单对比。当我去年在学习Golang时,也发现了Golang在1.8后才提供了泛型,并不是原生自带而是与Java类似在中间版本加入的特性,网上也有众多言论在抨击Golang泛型 "代码丑陋","使用别扭"。
2025-03-06 14:28:21
1084
原创 Rust unresolved import `crate::xxx` 报错解决
Actix报错解决我希望在 `user_service.rs` 和 `repository.rs` 中使用我的自定义error结构体对象,我在 `application`目录下和 `infrastructure` 目录下的 mod.rs 中都已经导出了对应 .rs 文件:并且在lib.rs目录下也已经导出了对应包: 但是在 `repository.rs` 文件中的引入却报错:unresolved import `crate
2025-02-07 15:43:00
597
原创 Rust快速入门(五)
这意味着 Rust 会回溯栈上数据和函数调用,因此也意味着更多的善后工作,好处是可以给出充分的报错信息和栈调用信息,便于事后的问题复盘。rust使用了一个借用检查器来检查程序正确性,它会比较两个变量声明周期,比如上述代码中:r的生命周期是。消除规则不是万能的,若编译器不能确定某件事是正确时,会直接判为不正确,那么你还是需要手动标注生命周期。上述代码中,返回值的生命周期与参数生命周期中的较小值一致,虽然两个参数的生命周期都是标注了。,由于a引用了b,由于b远远小于a,所以编译器会拒绝执行上述代码。
2024-12-08 17:09:29
889
原创 Rust快速入门(四)
在Rust中使用implx: f64,y: f64,Circle{x:x,y:y,方法定义与golang非常相似,结构体存储数据,调用方法功能放在方法中。即对象定义与方法定义是分开的,这种方式给予了使用者极高的灵活性。Rust允许我们定义多个impl块,目的是提供更多的灵活性和可读性,即可以将相关代码放在一起,进行解耦。
2024-12-08 17:07:28
1000
原创 Rust快速入门(三)
Rust 中的字符是 Unicode 类型,因此每个字符占据 4 个字节内存空间,但是在字符串中不一样,字符串是 UTF-8 编码,也就是字符串中的字符所占的字节数是变化的(1 - 4)str类型是硬编码进可执行文件,也无法被修改,但是String则是一个可增长、可改变且具有所有权的 UTF-8 编码字符串当 Rust 用户提到字符串时,往往指的就是String类型和&str字符串切片类型,这两个类型都是 UTF-8 编码。
2024-12-08 16:58:45
1288
原创 Rust快速入门(二)
在Cargo.toml中,主要通过各种依赖段落来描述该项目的各种依赖项:基于Rust官方仓库crates.io,通过版本说明来描述基于项目源码的git仓库来描述基于本地项目的绝对路径或者相对路径,通过类 Unix 模式的路径来描述使用下划线开头忽略未使用的变量。同一时刻,你只能拥有要么一个可变引用,要么任意多个不可变引用引用必须总是有效的。
2024-12-08 16:46:13
1165
原创 使用Python编写脚本,为Excel表格添加水印
与PDF,Word文件不同,由于Excel没有直接提供水印添加功能,所以目前而言在Excel中添加水印实际上就是为excel文件添加背景。所以我们目前要做的其实就是如何将图片设置为excel背景。
2024-11-20 14:55:10
1354
原创 基于Kratos+ent+postgreSQL构建简单的CRUDapi
官方文档:简介 | Kratos (go-kratos.dev)首先我们要知道Kratos 是一套轻量级 Go 微服务框架,这里附一个架构图: 根据官方文档的要求,我们可以先开启GO111MODULE然后我们需要下载以下工具:make命令工具用于在我们构建好 文件后,使用 指令就可以将 protobuf 文件中定义的服务和消息转换为 HTTP 接口,使得服务可以通过 HTTP/JSON 进行通信。先下载Chocolatey 然后通过Chocolatey下载make 下载完成后我们
2024-10-23 16:54:16
907
原创 身份认证方法
认证:Authentication授权:Authorization他们是两个不同的概念,的目的是要认出用户是谁,的目的是决定用户能够做什么。再诸多的应用程序中,通常基于如下几个因素做身份认证:用户知道的东西(密码,PIN码)用户拥有的东西(不容易复制的东西,手机,U盾)用户生物特征(指纹,人脸等特征)用户所在位置(通常是指接入特定网络环境,少数情况下也有基于GPS位置的)
2024-10-08 15:54:11
796
原创 Rust 快速入门(一)
cargo:Rust的编译管理器、包管理器、通用工具。可以用Cargo启动新的项目,构建和运行程序,并管理代码所依赖的所有外部库。Rustc:Rust的编译器。通常Cargo会替我们调用此编译器。Rustdoc:是Rust的文档工具。
2024-10-06 16:39:20
1151
4
原创 计算机网络通关学习(二)
TCP通过检验和(类似于一个标记,接收方通过校验这个标志位来判断数据是否被损坏),序列号,确认应答(ACK),重发控制(超时重传),连接管理(三次握手,四次挥手),窗口控制来来实现可靠性传输。OSI七层模型,注意TCP/IP为协议簇,即TCP/IP并不单单指TCP、IP两个协议,其也包括了ARP,RARP,ICMP,SNMP,DNS等等一系列协议。IP是实现多个数据链路之间通信的协议。数据链路根据种类不同各有各的特点,针对这些不同的数据链路的相异性,进行抽象化也是IP重要的作用之一。注:路由器仅有三层。
2024-09-17 17:55:51
1347
原创 计算机网络通关学习(一)
HTTP协议用于客户端与服务端之间的通信。通过请求和响应的交换达成通信。HTTP是不保存状态的协议(即:HTTP是无状态协议)思考:这里对于1,2点,其实没有什么过多的解释了。但是对于第三点,我们需要自己的独立思考参与进来,为什么HTTP是无状态协议呢?目的是为了更快的处理大量事务,确保协议的可伸缩性。
2024-09-16 17:18:54
2201
2
原创 如何将neo4j,4.x版本部署到服务器上
当我们使用neo4j构建知识图谱时,我们希望让别人能和我们共用neo4j进行知识图谱的构建,我们的方法之一就是将neo4j部署到我们的服务器上,然后将7474,7687端口暴露出来,这样就可以通过访问服务器公网IP的7474端口来操作我们的数据库。
2024-08-06 00:03:55
1590
原创 Agile Software Development
Individuals and interactions over processes and tools.(个人和协作超过过程和工具)working software over comprehensive documentation.(工作软件超过完全文档)Customer collaboration over contract negotiation.(客户协作超过合同谈判)Responding to change over following a plan.(随机应变)
2024-06-23 11:11:43
895
原创 数据结构复习
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。在进行算法分析时,语句总的执行次数T(n)是关于问题规模 n 的函数,进而分析T(n)随n的变化并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作。他表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,乘坐算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
2024-06-06 16:00:42
815
原创 如何在JVM中基于引用计数法实现GC
而为什么我使用引用计数来实现gc呢?所以根集的收集是十分麻烦的。同时由于可达性分析法实际上是一种标记算法,即会标注每个对象是否死亡。而后续的内存释放一系列工作则需要使用抽象的分区概念(青年代,老年代,其他书也有伊甸园代等等对分区的称谓)使用标记-清除,复制-清除,标记整理法来进行处理。所以整体实现比较麻烦,然后也会存在 stop the world 来进行暂停gc,此时需要涉及到gc线程,而我的虚拟机并未实现多线程,所以这是其二原由。
2024-06-02 17:46:35
1006
原创 HashMap在Go与Java的底层实现与区别
在Java中hash表的底层数据结构与扩容等已经是面试集合类问题中几乎必问的点了。网上有对源码的解析已经非常详细了我们这里还是说说其底层实现。
2024-05-27 23:30:48
1270
原创 基于树的存储数据结构demo
由于之前博主尝试Java重构redis,在redis中的的字典数据结构底层也是采用数组实现,字典中存在两个hash表,一个是用于存储数据,另一个被用于rehash扩容为前者两倍。但是我注意到了在redis的数据结构中,并没有像Java集合类中的hashmap一样的树化机制,即当链表数大于8,且通过线性搜索法查找后续hash槽,发现占用了64个了,就会将拉链上的链表转化为红黑树,涉及到自平衡等等操作。是比较麻烦的,于是博主尝试使用二叉搜索树来实现一个基础的树的存储数据的数据结构。
2024-05-23 22:13:16
1197
1
原创 双亲委派类加载机制和java类加载当前类必须先加载父类有什么联系和区别
本文是作者在学习了jvm虚拟机的一些疑问解决:类加载机制和类加载时先加载父类之间有什么联系?因为类加载机制也是先加载启动类然后加载扩展类,然后是用户类。
2024-04-10 20:47:54
457
原创 说说JVM的class文件(二)
在前文中我们已经简单说了说class类文件的结构,但是由于我是根据JVM规范进行快速学习解释所以部分的并不是很清楚,这篇文章是在我阅读了多本数有关类结构的部分后总结出的文章或者可以叫做读书笔记。
2024-03-15 18:23:34
682
原创 详细说说JVM的class文件(一)
class虚拟机实现可以从文件系统(环境变量)读取也可以从JAR(或者ZIP)包提取,也可以从网上下载,从数据库加载,甚至在运行中直接生成class文件。文件由8位字节流组成。16位和32位的数量分别通过读入两个和四个连续的8位字节来构造。多字节数据项总是以大端顺序存储,其中高字节放在前面。
2024-03-11 21:30:32
891
原创 说说Java三种启动类路径
在Java中,类路径(Classpath)是用来告诉Java虚拟机(JVM)在哪里查找类文件的路径。类路径可以分为三种不同的类型:启动类路径(Bootstrap Classpath)、扩展类路径(Extension Classpath)和用户类路径(User Classpath)。 启动类路径(Bootstrap Classpath): 启动类路径是用来加载Java核心类库(如java.lang、java.util等)的路径。 JVM在启动时会加载这些核心类,这些类通常位于JRE的lib目录下
2024-03-10 16:33:56
522
原创 GO语言学习笔记(与Java的比较学习)(十一)
一个应用程序是运行在机器上的一个进程;进程是一个运行在自己内存地址空间里的独立执行体。一个进程由一个或多个操作系统线程组成,这些线程其实是共享同一个内存地址空间的一起工作的执行体。并行是一种通过使用多处理器以提高速度的能力。所以并发程序可以是并行的,也可以不是。公认的,使用多线程的应用难以做到准确,最主要的问题是内存中的数据共享,它们会被多线程以无法预知的方式进行操作,导致一些无法重现或者随机的结果(称作 竞态)。不要使用全局变量或者共享内存,它们会给你的代码在并发运算的时候带来危险。
2024-03-04 00:03:05
1137
原创 GO语言学习笔记(与Java的比较学习)(十)
这是所有自定义包实现者应该遵守的最佳实践:1)在包内部,总是应该从 panic 中 recover:不允许显式的超出包范围的 panic ()2)向包的调用者返回错误值(而不是 panic)。
2024-03-03 23:59:23
706
原创 GO语言学习笔记(与Java的比较学习)(九)
最简单的办法是使用fmt包提供的 Scan 和 Sscan 开头的函数。Scanln 扫描来自标准输入的文本,将空格分隔的值依次存放到后续的参数内,直到碰到换行。Scanf 与其类似,除了 Scanf 的第一个参数用作格式字符串,用来决定如何读取。Sscan 和以 Sscan 开头的函数则是从字符串读取,除此之外,与 Scanf 相同。
2024-03-03 23:57:01
1108
原创 GO语言学习笔记(与Java的比较学习)(八)
Go 语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 说明 对象的行为:如果谁能搞定这件事,它就可以用在这儿。接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。
2024-03-03 00:10:44
1061
原创 GO语言学习笔记(与Java的比较学习)(七)
当你在值类型上定义方法时,方法接收的是该值的副本。这意味着在方法内部对接收者的修改不会影响原始值。这种方式适用于不需要在方法内部修改接收者数据的情况,或者对数据的修改是独立于原始数据的。
2024-02-29 11:01:55
951
原创 GO语言学习笔记(与Java的比较学习)(六)
当写自己包的时候,要使用短小的不含有(下划线) 的小写单词来为文件命名。包的初始化:程序的执行开始于导入包,初始化 main 包然后调用 main 函数。一个没有导入的包将通过分配初始值给所有的包级变量和调用源码中定义的包级 init 函数来初始化。一个包可能有多个 init 函数,它们甚至可以存在于同一个源码文件中。它们的执行是无序的。这是测定包的值是否只依赖于相同包下的其他值或者函数的最好的例子。init 函数是不能被调用的。
2024-02-28 19:30:13
882
原创 GO语言学习笔记(与Java的比较学习)(五)
在声明的时候不需要知道 map 的长度,map 是可以动态增长的。未初始化的 map 的值是 nil(即零值为nil),nil映射既没有键,也不能添加键。key 可以是任意可以用 == 或者!= 操作符比较的类型,比如 string、int、float。所以切片和结构体不能作为 key ,但是指针和接口类型可以。(含有数组切片的结构体不能作为 key,只包含内建类型的 struct 是可以作为 key 的)如果要用结构体作为 key 可以提供Key()和Hash()
2024-02-28 19:29:19
796
1
原创 GO语言学习笔记(与Java的比较学习)(三)
Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量。如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加 & 符号,比如 &variable)传递给函数,这就是按引用传递,如果传递给函数的是一个指针,指针的值(一个地址)会被复制,但指针的值所指向的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。(译者注:指针也是变量类型,有自己的地址和值,通
2024-02-28 15:51:33
1102
原创 GO语言学习笔记(与Java的比较学习)(二)
关键字 if 和 else 之后的左大括号 { 必须和关键字在同一行,如果你使用了 else-if 结构,则前段代码块的右大括号 } 必须和 else-if 关键字在同一行。这两条规则都是被编译器强制规定的。if 可以包含一个初始化语句(如:给一个变量赋值)。使用简短方式 := 声明的变量的作用域只存在于 if 结构中(在 if 结构的大括号之间,如果使用 if-else 结构则在 else 代码块中变量也会存在)。如果变量在 if 结构之前就已经存在,那么在 if 结构中,该变量原来的值会被隐藏。
2024-02-28 15:48:01
926
原创 GO语言学习笔记(与Java的比较学习)(一)
一个应用程序可以包含不同的包,而且即使你只使用 main 包也不必把所有的代码都写在一个巨大的文件里:你可以用一些较小的文件,并且在每个文件非注释的第一行都使用 package main 来指明这些文件都属于 main 包。同时,带有 ++ 和 -- 的只能作为语句,而非表达式,因此 n = i++ 这种写法是无效的,其它像 f(i++) 或者 a[i]=b[i++] 这些可以用于 C、C++ 和 Java 中的写法在 Go 中也是不允许的。否则,如果这个指针为空,你使用它的话,会Crash。
2024-02-28 15:42:40
1818
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人