Hi there, I’m Whitea 👋

👨🏻‍💻I’m passionate about web development, open source, and sharing knowledge.
🏸Outside of coding, I enjoy playing badminton and embracing challenges.
🐼Let’s connect, exchange ideas, and grow together!

硬核——你真的搞定Golang接口了么

编译阶段有变量、类型、方法等,那在运行阶段反射、接口、类型断言这些语言特性或机制是怎么动态的获取数据类型信息呢?今天我们就来聊聊这些问题吧😀 类型系统 首先我们要知道在Go中,这些属于内置类型: 1 2 3 4 5 6 7 8 9 10 bool int(32 or 64), int8, int16, int32, int64 uint(32 or 64), uint8(byte), uint16, uint32, uint64 float32, float64 string complex64, complex128 array -- 固定长度的数组 slice -- 序列数组 map -- 映射 chan -- 管道 当然还有自定义类型,比如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // custom type based on int type T int // that is different from the one below // type T = int // that just a alias for T, it's type is still int // struct type T struct { name string } // interface type T interface { Name() string } Go不允许为内置类型添加方法,同时接口类型是无效的方法接收者。 ...

March 16, 2025 · 4 min · 809 words · Whitea

SAST授课-从HTTP到RPC & 服务发现与注册

我想先说说 TCP 大家如果在开发时候遇到希望不同进程可以通讯,常用到的就是 Socket 编程,这是一种面向传输层的网络编程方式,无非就是 TCP 或者 UDP。 大部分人无脑选择 TCP 就好了 这是一种基于字节流的传输方式,就这样一个裸的TCP就可以解决我们收发数据的全部问题了么? 裸TCP的问题 八股文常背,TCP 是有三个特点,面向连接、可靠、基于字节流 我们今天重点关注的是基于字节流这个特点 字节流可以理解成一个双向通道里面流淌的数据,也就是我们常说的二进制数据,说白了也就是一串01串,纯裸 TCP 在收发这一堆 01 串的时候是没有任何边界的, 它根本不知道从哪到哪才是一条完整的消息。 上面这张图就是粘包问题 因此很显然,纯裸的 TCP 是不适合直接拿过来用的,需要制定一些规则用于区分消息的边界 比如我们可以把消息封装一下,分为 Header 和 Body, Header 用于存放一些元数据,比如这个消息有多长, Body 用于存放真正的消息 这样封装方式,只要收发信息的上下游约定好,这就是所谓的协议 因此基于 TCP 就衍生出很多的协议,比如 HTTP 和 RPC HTTP 和 RPC HTTP协议:超文本传输协议 (HTTP) 是一种用于传输超媒体文档(如 HTML)的应用层协议。它专为 Web 浏览器和 Web 服务器之间的通信而设计,但也可用于其他目的,例如机器对机器通信、对 API 的编程访问等 RPC:RPC协议是一种通过网络调用远程服务的方法,使得不同系统间可以像调用本地方法一样进行通信 这两个都是应用层协议,了解微服务的同学应该知道,常常在服务内部一般都会使用 RPC 协议进行服务间通讯,而不是使用 HTTP。要弄懂这个需要从这两个协议的设计原理出发了。 HTTP 协议 HTTP的请求报文由四部分组成:请求行(request line)、请求头部(header)、空行和请求数据(request data) 不过 HTTP 协议不是我们今天的重点 更多内容可以看 MDN文档 ...

March 5, 2025 · 3 min · 560 words · Whitea

SAST授课-入门Redis&了解云原生

入门Redis & 了解云原生 第一部分:Redis快速入门 初步认识 Redis 是一个开源(BSD 许可)的,内存中的键值对(K-V)存储系统,它可以用作 数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings),散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询 bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability) 你得知道: Redis是Nosql型的非关系型数据库(Nosql:Not Only sql) Redis是基于内存存储的,速度快,当然也支持数据的持久化 Redis是在处理客户端请求的时候是单线程的,在处理客户端连接时候使用IO多路复用技术 Redis其实是支持事务的,但是一次性、顺序性、排他性的执行队列中的命令,是不支持回滚的,缺乏传统ACID事务的隔离性和持久性 安装 Windows: 官方推荐使用WSL2官网指南,当然也可以在Github上下载Zip,解压缩到本地,然后在安装目录执行redis-server.exe redis.windows.conf即可临时启动 Linux & Mac: 使用包管理器安装即可 但待会我们会讲容器技术,这会让Redis的安装使用更加方便😀 常用命令 使用select切换数据库:select [number] (redis共16个数据库) 查看数据库大小:DBSIZE 查看库内容:keys * 判断某个值存在:exists key 存储数据:set key value云 数据限时:expire key number\setex key number value限时多少秒后数据失效,ttl key查询还有多久截止 查看key类型:type key 删除数据库:flushall or flushdb DbName 批量插入、获取:mset k1 v1 k2 v2...\mget k1 k2 k3... 五大基本数据类型 不用记,用的时候查就行🤣 ...

February 27, 2025 · 3 min · 620 words · Whitea

SAST授课-SpringBoot入门

前言 Spring Boot是一个流行的Java框架,用于简化Spring应用程序的创建和部署。它通过提供一个集成的开发环境,使得开发人员能够快速构建高效的应用程序。同时本节课的目的主要在于编码的实践,概念很多,一开始记不住没关系,但一定要跟着写一写! 为什么要面向接口编程 面向接口编程(Programming to an Interface)是一种设计理念,在Spring Boot等框架中广泛应用。以下是Spring Boot中面向接口编程的几个重要原因: 降低耦合度:面向接口编程可以减少模块之间的耦合。通过依赖接口而非具体实现,系统的不同部分可以独立开发和修改,降低了修改某一部分时对其他部分的影响。 增强可测试性:使用接口可以方便地进行单元测试。因为可以轻松地创建接口的模拟实现(Mock),在测试中可以用这些模拟对象替代真实对象,从而隔离测试环境,确保测试的独立性。 提高灵活性,扩展性和可维护性:面向接口编程允许在不改变客户端代码的情况下,轻松替换或扩展实现。只需提供新的实现类,而不必修改使用该接口的代码,使得系统更具灵活性。同时当系统的实现细节被封装在接口后,未来的维护和改进工作将更加简单。修改实现不影响接口的定义,减少了维护成本。 清晰的设计架构:接口提供了清晰的契约,使得开发人员能够明确各个模块的功能和责任。这种设计方式也使得团队协作变得更加简单,便于不同开发人员理解系统的整体架构。 那跟new一个对象有什么区别呢? 直接使用具体实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class EmailService { public void sendEmail(String message) { // 发送邮件逻辑 } } public class UserService { private EmailService emailService = new EmailService(); public void registerUser(String email) { // 注册用户逻辑 emailService.sendEmail("欢迎注册: " + email); } } 使用接口: ...

November 21, 2024 · 6 min · 1090 words · Whitea

SAST授课-啥是后端,如何学呢 🤔

碎碎念 首先欢迎大家成功通过笔试面试亦或者是免试进入到SASTWeb研发组,祝愿大家在这里能够学习到自己感兴趣的知识,结识更多志同道合的朋友。但是要记住,加入SAST,意味着更大的舞台,更多的资源,但并不代表你很厉害。 沉下心去学,学习的路真的还挺长的。😵 什么是后端 后端是指一个软件系统的服务器端,也称作服务器端。 它是指在一个软件系统中,负责处理数据存储、业务逻辑处理和与前端交互的一部分。 后端通常包括数据库、服务器、应用程序和其他相关组件。 比如: b站这个页面就是前端展示出来的,但是着其中的每一个词条,视频,数据来源都是来源于后端数据库,然后经过后端程序一些算法逻辑传递给前端进行展示。 GitHub(全球最大同性交友平台)的登录界面,这个界面就是前端展示的,而当我们输入Username和Password并点击Sign in之后,数据会传递给后端服务器处理,只有当后端服务器校验通过后,才会给前端返回正确的信息,前端才会跳转主页。 后端开发用什么语言 TIOBE Index - TIOBE 在国内,Java仍是后端开发的主流语言,凭借其成熟的生态和广泛的社区支持,成为众多企业的首选。在招聘市场上,Java技能依然是后端开发岗位的主要要求。然而,随着云原生技术的发展,Go和Rust等新兴语言也逐渐崛起,特别是在字节跳动、腾讯等大厂,GoLang已经被广泛应用于后端开发。同时,Python、C#和Node.js等语言在特定场景下也发挥着重要作用,丰富了后端开发的语言选择。 主流后端开发语言:JAVA、C、C++、GO、PYTHON对比 Top 7 Programming Languages for Backend Web Development - GeeksforGeeks 我们目前的授课计划前期依旧是以Java为主。 学习后端然后干嘛 这里有两种不同的情况:一种是你对后端开发感兴趣,想初步了解后端开发的实际工作内容;另一种是你计划在大学期间持续深入学习后端开发,最终达到企业招聘的标准,未来寻找后端开发相关的岗位。 强烈建议大家尽早规划好自己的大学四年和职业发展方向,无论是考研、保研、本科就业、研究生就业,还是考公、从事科研。目前大部分人最终都会走向就业市场,因此在大学四年内,专注于一个垂直领域并持续深入学习,会让你在校招中更具竞争力。(不要以为找工作还很遥远,现实是如果你仅仅按部就班跟随学校课程,毕业后找到理想工作的难度会非常大。很多人选择考研,其实只是为了暂时逃避就业的压力) 此外,建议大家了解一下当前后端开发工程师的行业薪资水平,以便更好地衡量自己的目标和努力方向。 南京Java工资待遇_收入水平-BOSS直聘 (zhipin.com) 根据许多学长的经验,对于前后端开发方向的同学来说,考研的意义并不如就业那么明显(考研三年所积累的知识和三年实际工作经验相比,差距较大)。很多学长在大三时会主动寻找相关岗位的实习机会,这段实习经历往往会让他们在大四的秋招中对那些没有实习经历的同学形成降维打击,因为企业更倾向于招聘有实习经验的学生。 但无论你是打算简单了解后端开发的工作流程,还是计划深入学习并以此为职业发展方向,跟着我们的课程学习都是非常合适的选择!通过这些课程,你可以逐步积累专业知识,为未来的实习或就业打下坚实基础。 你可以不来上课,可以自学,但是你的进度不可以比我们的课程进度慢,否则你就慢了( 学习路线 这里粘贴一份网上的学习路线,还比较全,里面也给到了很多学习资料的推荐。 对于纯小白而言(比如我)刚开始是不适合看文档进行学习的,推荐大家跟着一门视频课程进行学习,但在后期要逐渐拓宽自己接受知识的途径,学会看文档高效学习。 codefather/学习路线/Java学习路线(github.com) The Roadmap to Becoming a Backend Java Developer | by Hussein Shamas | Medium 计算机教育中缺失的一课 · the missing semester of your cs education (missing-semester-cn.github.io) ...

October 15, 2024 · 2 min · 227 words · Whitea

KMP算法-来自leetcode-28的思考

本文的思考来自于leetcode-28.找出字符串中第一个匹配项的下标leetcode链接 什么是KMP算法 在计算机科学中,克努斯-莫里斯-普拉特字符串查找算法(英语:Knuth–Morris–Pratt algorithm,简称为KMP算法)可在一个字符串S内查找一个词W的出现位置。一个词在不匹配时本身就包含足够的信息来确定下一个匹配可能的开始位置,此算法利用这一特性以避免重新检查先前配对的字符。(引用维基百科) ...

June 20, 2024 · 3 min · 574 words · Whitea