如何在 golang 中上下对齐打印字符串 在一些场景中,我们需要像表格一样整齐地打印一些信息,比如一个人的姓名,家庭地址和联系方式,我希望打印的格式像下面这样: 123Name : BobAddress : New York AvenuePhone : 12345674567 这个问题听上去非常简单,简单到似乎不该成为一个问题,我们很容易地给出下面这段代码: 12345678information := map[string] 2023-02-02 golang #golang
使用 Golang 实现 AES 加密算法 写在之前定位本文无意于介绍对称加密和非对称加密算法的区别,也无意于从底层来讲解 AES 算法的加密原理以及一步步实现,可能会有人注意到 Golang 实际上内置了 cypto/aes 这个包,但它的抽象程度还没有那么高(比如提供像Encrypt(key, plainText) 以及 Decrypt(key, cipherText)这样的接口),所以到我们真正使用间还隔着一道沟壑,所以本文就是在讲如 2022-12-26 golang #golang
Goroutine 使用的一些经验谈 在工作中 Goroutine 使用得相当多,积累了不少经验,也逐渐学习了一些小 tricks,在此进行一些总结 。 如何控制 Goroutine 的数量关于 Goroutine 的语法不做赘述。 首先,使用协程池还是直接创建新的 Goroutine 并限制数量(协程池会尽可能复用而不是创建)仁者见仁,智者见智,由于 Goroutine 比较轻量级,即便创建新的 Routine 资源消耗也不会很大, 2022-11-28 #golang #goroutine
golang file permission mode 导言在自己实现简易版容器时,出现了一些跟文件权限的相关问题,用到了跟chmod和chown相关的指令,在这里做一个简单的梳理 permission mode in chmod简要介绍我的环境下是 WSL ubuntu 20.04,一般来说使用touch创建文件以及使用mkdir创建的文件夹的默认权限如下: 12345678910111213# zyc @ DESKTOP-KK42M35 in ~/ 2021-10-28
MyDocker 实现踩坑指南 背景《自己动手写 Docker》成书是在数年前,也一直没有更新,而且相关项目仓库的 Issues 板块也不是十分活跃,期间自己也遇到了一些问题,而通过搜寻阅读资料,对于部分知识的理解也有所加深,在这里做一些简单的整理。 环境如下: Golang: 1.17 Host: WSL Ubuntu 20.04 CLONE_NEWUSER关于 namespace 的问题可以参考一下这一系列的文章[1], 2021-10-17 golang #golang
如何在Golang中实现Fork() 背景最近在跟随《自己动手写 Docker》实现一个简易版本的 docker 时,注意到书中创建容器进程时采取了一种很 weird 的方法。mydocker run Command后使用exec.Command调用/proc/self/exe(即进程本身),但会修改参数,使得其相当于调用了mydocker init Command,然后再完成与容器相关的初始化工作。 书中使用了cli库来编写命令行相 2021-10-16 golang #golang
UniquePtr C++ implementation 在之前的文章中我实现了 SharedPtr,而为了实现 UniquePtr 我阅读了一些文章[1],意识到我之前的实现存在了大量的问题。正如文章作者所言,智能指针的实现并不适合作为学习材料,它看上去很简单,却存在着大量的陷阱。而 Boost 库的实现直到其成为 C++ 11 的标准,大概有九年的时间。 不过既然开了坑,姑且硬着头皮写下去吧,毕竟也算作学习的一个过程。 先给出代码: 12345678 2021-10-02 C++ #C++ #interview
RWLock C++ implementation 其实 boost 库已经有相关的实现,在实际工程中使用 boost 库的实现可能会使得我们程序更加健壮。 这边展示的是一个比较 naive 的实现,逻辑上也并不复杂。 成员变量readerCount记录正在临界区的读者数量,mutexReader以及mutexWriter实现相应的控制逻辑 WLock和WUnlock比较简单,就是直接对mutexWriter进行加锁和放锁 而在RLock中,首先会 2021-09-30 C++ #C++ #interview
Vector C++ implementation 成员变量cap_记录了容量大小,而size_则记录了实际存储的元素的数量,iniVal作为const值表示MyVector对象创建时为其预分配的容量大小,vector则是指针,其指向的应该是对象数组的起始地址 12345private: T *vector = nullptr; size_t cap_; size_t size_; const int iniVal = 20 2021-09-29 C++ #C++ #interview
Sharedptr C++ implementation 前言回望最初版本的shared_ptr,其实存在着很多问题,比如没有考虑 Constructor Failure以及未使用 copy-and-swap idiom来解决 code duplicate 等. 在这里我打算保留最初的版本,并添加说明对此进行更正 Old Version成员变量ptr用于保存共享的指针,而 refCount则是计数器,在这里注意 refCount是指针,这样的话可以做到多 2021-09-29 C++ #C++ #interview