<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Go 语言 on roseduan</title><link>https://blog.roseduan.cn/categories/go-%E8%AF%AD%E8%A8%80/</link><description>Recent content in Go 语言 on roseduan</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 24 Mar 2024 10:51:56 +0800</lastBuildDate><atom:link href="https://blog.roseduan.cn/categories/go-%E8%AF%AD%E8%A8%80/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 语言最全学习路径、资料汇总！</title><link>https://blog.roseduan.cn/p/go-%E8%AF%AD%E8%A8%80%E6%9C%80%E5%85%A8%E5%AD%A6%E4%B9%A0%E8%B7%AF%E5%BE%84%E8%B5%84%E6%96%99%E6%B1%87%E6%80%BB/</link><pubDate>Sun, 24 Mar 2024 10:51:56 +0800</pubDate><guid>https://blog.roseduan.cn/p/go-%E8%AF%AD%E8%A8%80%E6%9C%80%E5%85%A8%E5%AD%A6%E4%B9%A0%E8%B7%AF%E5%BE%84%E8%B5%84%E6%96%99%E6%B1%87%E6%80%BB/</guid><description>&lt;h2 id="go-语言语法"&gt;Go 语言语法
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;基础语法
&lt;ul&gt;
&lt;li&gt;数据类型&lt;/li&gt;
&lt;li&gt;变量声明&lt;/li&gt;
&lt;li&gt;错误处理&lt;/li&gt;
&lt;li&gt;函数，多返回值&lt;/li&gt;
&lt;li&gt;接口/结构体&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;进阶
&lt;ul&gt;
&lt;li&gt;泛型&lt;/li&gt;
&lt;li&gt;数据结构 array slice map heap&lt;/li&gt;
&lt;li&gt;并发 goroutine、channel、context&lt;/li&gt;
&lt;li&gt;反射&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在线资源
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.runoob.com/go/go-tutorial.html" target="_blank" rel="noopener"
&gt;https://www.runoob.com/go/go-tutorial.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.w3cschool.cn/go/" target="_blank" rel="noopener"
&gt;https://www.w3cschool.cn/go/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go by Example 中文版 &lt;a class="link" href="https://gobyexample-cn.github.io/" target="_blank" rel="noopener"
&gt;https://gobyexample-cn.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;基础书籍
&lt;ul&gt;
&lt;li&gt;Go 程序设计语言 &lt;a class="link" href="https://book.douban.com/subject/27044219/" target="_blank" rel="noopener"
&gt;https://book.douban.com/subject/27044219/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go 并发编程实战&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;进阶书籍：
&lt;ul&gt;
&lt;li&gt;Go 语言设计与实现 &lt;a class="link" href="https://draveness.me/golang/" target="_blank" rel="noopener"
&gt;https://draveness.me/golang/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go 语言高级编程 &lt;a class="link" href="https://chai2010.cn/advanced-go-programming-book/" target="_blank" rel="noopener"
&gt;https://chai2010.cn/advanced-go-programming-book/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go 语言原本 &lt;a class="link" href="https://golang.design/under-the-hood/" target="_blank" rel="noopener"
&gt;https://golang.design/under-the-hood/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;巩固基础，项目推荐
&lt;ul&gt;
&lt;li&gt;数据库/存储小项目 &lt;a class="link" href="https://www.bilibili.com/video/BV1qW421c7kY" target="_blank" rel="noopener"
&gt;https://www.bilibili.com/video/BV1qW421c7kY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;极客兔兔 &lt;a class="link" href="https://github.com/geektutu/7days-golang" target="_blank" rel="noopener"
&gt;https://github.com/geektutu/7days-golang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/muesli/cache2go" target="_blank" rel="noopener"
&gt;https://github.com/muesli/cache2go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常用框架"&gt;常用框架
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;web 框架、orm 框架：gin、echo、gorm
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://echo.labstack.com/docs/quick-start" target="_blank" rel="noopener"
&gt;https://echo.labstack.com/docs/quick-start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gin-gonic.com/zh-cn/docs/" target="_blank" rel="noopener"
&gt;https://gin-gonic.com/zh-cn/docs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;从零设计一个 web 框架 &lt;a class="link" href="https://github.com/astaxie/build-web-application-with-golang/tree/master" target="_blank" rel="noopener"
&gt;https://github.com/astaxie/build-web-application-with-golang/tree/master&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;书籍
&lt;ul&gt;
&lt;li&gt;《Go Web 编程》&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="微服务"&gt;微服务
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;微服务
&lt;ul&gt;
&lt;li&gt;gRPC
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grpc.io/docs/languages/go/quickstart/" target="_blank" rel="noopener"
&gt;https://grpc.io/docs/languages/go/quickstart/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;《gRPC 与云原生应用开发》&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;go-zero
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zeromicro/zero-examples" target="_blank" rel="noopener"
&gt;https://github.com/zeromicro/zero-examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Mikaelemmmm/go-zero-looklook" target="_blank" rel="noopener"
&gt;https://github.com/Mikaelemmmm/go-zero-looklook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kratos
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/go-kratos/examples" target="_blank" rel="noopener"
&gt;https://github.com/go-kratos/examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/go-kratos/beer-shop" target="_blank" rel="noopener"
&gt;https://github.com/go-kratos/beer-shop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实战项目：写一个极简 RPC 框架 &lt;a class="link" href="https://github.com/zehuamama/tinyrpc" target="_blank" rel="noopener"
&gt;https://github.com/zehuamama/tinyrpc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="面试突击"&gt;面试突击
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/lifei6671/interview-go" target="_blank" rel="noopener"
&gt;https://github.com/lifei6671/interview-go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.topgoer.cn/docs/gomianshiti/mianshiti" target="_blank" rel="noopener"
&gt;https://www.topgoer.cn/docs/gomianshiti/mianshiti&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.topgoer.cn/docs/interview/interview-1dks7os61lo44" target="_blank" rel="noopener"
&gt;https://www.topgoer.cn/docs/interview/interview-1dks7os61lo44&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/mao888/golang-guide" target="_blank" rel="noopener"
&gt;https://github.com/mao888/golang-guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="其他书籍资料"&gt;其他书籍、资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;《Head First Go》&lt;/li&gt;
&lt;li&gt;《Go 语言学习笔记》&lt;/li&gt;
&lt;li&gt;《Go 网络编程》&lt;/li&gt;
&lt;li&gt;《Go 语言从入门到进阶实战》&lt;/li&gt;
&lt;li&gt;《Mastering Go》中文翻译 &lt;a class="link" href="https://www.bookstack.cn/read/Mastering_Go_ZH_CN/README.md" target="_blank" rel="noopener"
&gt;https://www.bookstack.cn/read/Mastering_Go_ZH_CN/README.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go 语言常见面试题 &lt;a class="link" href="https://www.topgoer.cn/docs/gomianshiti/mian1" target="_blank" rel="noopener"
&gt;https://www.topgoer.cn/docs/gomianshiti/mian1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Uber 出品的 Go 语言编码风格指南 &lt;a class="link" href="https://github.com/uber-go/guide/blob/master/style.md" target="_blank" rel="noopener"
&gt;https://github.com/uber-go/guide/blob/master/style.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Awesome-go go 语言相关的资料、三方库列表 &lt;a class="link" href="https://awesome-go.com/" target="_blank" rel="noopener"
&gt;https://awesome-go.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="书籍领取方式"&gt;书籍领取方式
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://camo.githubusercontent.com/80fe53a476f49da37134296eb2f2b55c8d5070e84595d05c955a3ed99347bc19/68747470733a2f2f63646e2e6e6c61726b2e636f6d2f79757175652f302f323032342f706e672f31323932353934302f313731313234333931333039392d31633035653539362d353866382d343737362d613462612d6539303466303266623064652e706e6723617665726167654875653d25323366336632656626636c69656e7449643d7538363132306662302d623936392d342666726f6d3d75692669643d753861643264643136266f726967696e4865696768743d383936266f726967696e57696474683d32333738266f726967696e616c547970653d62696e61727926726174696f3d3226726f746174696f6e3d302673686f775469746c653d66616c73652673697a653d373238343233267374617475733d646f6e65267374796c653d6e6f6e65267461736b49643d7539623039316663642d623134662d343139612d383763352d3064356362626236636134267469746c653d"
loading="lazy"
alt="Snipaste_2024-03-24_09-31-12.png"
&gt;
文中提到的所有书籍，都可以直接领取：
&lt;img src="https://camo.githubusercontent.com/e66e8a9a7189e13ffb087873cb2516941acfd607856636be1a9237bdc5f977ff/68747470733a2f2f63646e2e6e6c61726b2e636f6d2f79757175652f302f323032332f706e672f31323932353934302f313637353231363731333638322d61336361623666372d393363612d343639392d393939642d3232336261373763626339372e706e673f782d6f73732d70726f636573733d696d616765253246726573697a65253243775f313530302532436c696d69745f30"
loading="lazy"
alt="扫码_搜索联合传播样式-标准色版.png"
&gt;
公众号「roseduan写字的地方」，后台回复「Go」&lt;/p&gt;</description></item><item><title>Go 语言数据库/存储项目推荐</title><link>https://blog.roseduan.cn/p/go-%E8%AF%AD%E8%A8%80%E6%95%B0%E6%8D%AE%E5%BA%93/%E5%AD%98%E5%82%A8%E9%A1%B9%E7%9B%AE%E6%8E%A8%E8%8D%90/</link><pubDate>Wed, 06 Mar 2024 21:07:56 +0800</pubDate><guid>https://blog.roseduan.cn/p/go-%E8%AF%AD%E8%A8%80%E6%95%B0%E6%8D%AE%E5%BA%93/%E5%AD%98%E5%82%A8%E9%A1%B9%E7%9B%AE%E6%8E%A8%E8%8D%90/</guid><description>&lt;p&gt;大家好，今天给大家分享一些使用 Go 语言编写的数据库/存储项目。&lt;/p&gt;
&lt;p&gt;因为我的两个存储引擎开源项目 &lt;code&gt;rosedb&lt;/code&gt; 和 &lt;code&gt;lotusdb&lt;/code&gt; 都是使用 Go 语言编写的，所以这几年在这方面也有很多的积累，今天就把自己压箱底的干货分享给大家。&lt;/p&gt;
&lt;p&gt;首先需要说明的是，像 &lt;code&gt;TiDB&lt;/code&gt;、&lt;code&gt;CockroachDB&lt;/code&gt;、&lt;code&gt;etcd&lt;/code&gt; 这些大型的项目我就不再列举了，因为这些项目都耳熟能详，公开的资料也很多，不需要我再多说什么了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;今天想给大家分享的是，一些比较小众的，代码量在 1w 行以内，适合大家去学习上手的一些项目。如果你想入门数据库/存储领域，这些项目其实都非常适合你去研究学习，能够让你对数据库/存储领域有一个更深入的了解。如果你是学习了 Go 语言，想找一个小项目来练手，这些项目也是非常适合你。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这次分享的项目主要分为了两个大的类型，一是一些基础类型的教程，二是一些比较完整的项目。 最后也会分享我自己推荐的学习方式。&lt;/p&gt;
&lt;h2 id="基础类型的教程"&gt;基础类型的教程
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;第一个是我自己写的 mini-bitcask 教程 &lt;a class="link" href="https://github.com/rosedblabs/mini-bitcask" target="_blank" rel="noopener"
&gt;https://github.com/rosedblabs/mini-bitcask&lt;/a&gt;，300 多行代码实现了一个极简的 bitcask 存储引擎，可以看做是 rosedb 的 mini 版本，对于你学习存储引擎的原理和实现有很大的帮助。我之前还专门写了一篇文章来介绍这个项目，可以结合起来观看效果更佳。&lt;/li&gt;
&lt;li&gt;两百行代码实现基于 paxos 的分布式 KV &lt;a class="link" href="https://github.com/openacid/paxoskv" target="_blank" rel="noopener"
&gt;https://github.com/openacid/paxoskv&lt;/a&gt;，也有一个专门讲解的博客文章，非常值得学习。&lt;/li&gt;
&lt;li&gt;从零开始写时序数据库 &lt;a class="link" href="https://github.com/chenjiandongx/mandodb" target="_blank" rel="noopener"
&gt;https://github.com/chenjiandongx/mandodb&lt;/a&gt;。这个项目是一个时序数据库，作者从零开始写了一个简单的时序数据库，代码量不大，适合新手学习。&lt;/li&gt;
&lt;li&gt;Go 语言实现的易于学习的 sql 数据库 &lt;a class="link" href="https://github.com/qw4990/NYADB2" target="_blank" rel="noopener"
&gt;https://github.com/qw4990/NYADB2&lt;/a&gt;，参考了很多 boltdb 的实现。&lt;/li&gt;
&lt;li&gt;1k 行代码的极简分布式 kv 数据库 &lt;a class="link" href="https://github.com/geohot/minikeyvalue" target="_blank" rel="noopener"
&gt;https://github.com/geohot/minikeyvalue&lt;/a&gt;，并且用于了生产环境。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="进阶类型的项目"&gt;进阶类型的项目
&lt;/h2&gt;&lt;h3 id="关系型数据库"&gt;关系型数据库
&lt;/h3&gt;&lt;p&gt;关系型数据库这里推荐几个我觉得还不错的，但是关系型 DB 难度肯定比 KV 更大，因为关系型 DB 包含了多个组件比如 parser、执行器、事务、存储等模块，感兴趣的同学可以参考。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/chaisql/chai" target="_blank" rel="noopener"
&gt;https://github.com/chaisql/chai&lt;/a&gt;，嵌入式 SQL 数据库，兼容 Postgres 的 sql，支持持久化存储。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/codenotary/immudb" target="_blank" rel="noopener"
&gt;https://github.com/codenotary/immudb&lt;/a&gt;，支持文档、SQL、KV 的多模数据库。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/auxten/go-sqldb" target="_blank" rel="noopener"
&gt;https://github.com/auxten/go-sqldb&lt;/a&gt;，简单的 sql 数据库，使用 B+ 树存储数据，实现了 parser 和 executor。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/rqlite/rqlite" target="_blank" rel="noopener"
&gt;https://github.com/rqlite/rqlite&lt;/a&gt;，基于 sqlite 的分布式数据库，可以认为是 raft+sqlite。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/hashicorp/go-memdb" target="_blank" rel="noopener"
&gt;https://github.com/hashicorp/go-memdb&lt;/a&gt;，hashicorp 的内存型嵌入式数据库，比较轻量级。&lt;/p&gt;
&lt;h3 id="kv-数据库"&gt;KV 数据库
&lt;/h3&gt;&lt;h4 id="bitcask"&gt;Bitcask
&lt;/h4&gt;&lt;p&gt;rosedb &lt;a class="link" href="https://github.com/rosedblabs/rosedb" target="_blank" rel="noopener"
&gt;https://github.com/rosedblabs/rosedb&lt;/a&gt;，基于 bitcask 的 KV 存储引擎，轻量级，支持 WriteBatch、TTL、Scan 等功能，目前是被应用到了生产环境中。&lt;/p&gt;
&lt;p&gt;nutsdb &lt;a class="link" href="https://github.com/nutsdb/nutsdb" target="_blank" rel="noopener"
&gt;https://github.com/nutsdb/nutsdb&lt;/a&gt;，同样也是基于 bitcask 的 KV 存储引擎，支持类似 Redis 的数据结构，国人开发和维护。&lt;/p&gt;
&lt;h4 id="btree"&gt;B+Tree
&lt;/h4&gt;&lt;p&gt;boltdb &lt;a class="link" href="https://github.com/etcd-io/bbolt" target="_blank" rel="noopener"
&gt;https://github.com/etcd-io/bbolt&lt;/a&gt;, Go 语言领域知名的存储引擎，B+ 树实现，支持一写多读的事务，广泛运用于生产环境，etcd 就是使用了 boltdb 作为持久化存储引擎。&lt;/p&gt;
&lt;h4 id="lsm-tree"&gt;LSM Tree
&lt;/h4&gt;&lt;p&gt;goleveldb &lt;a class="link" href="https://github.com/syndtr/goleveldb" target="_blank" rel="noopener"
&gt;https://github.com/syndtr/goleveldb&lt;/a&gt;，leveldb 的 Go 语言实现，学习 LSM Tree 实现细节的好项目。&lt;/p&gt;
&lt;p&gt;badger &lt;a class="link" href="https://github.com/dgraph-io/badger" target="_blank" rel="noopener"
&gt;https://github.com/dgraph-io/badger&lt;/a&gt;，wisckey 的实现，LSM Tree KV 分离。&lt;/p&gt;
&lt;p&gt;pebble &lt;a class="link" href="https://github.com/cockroachdb/pebble" target="_blank" rel="noopener"
&gt;https://github.com/cockroachdb/pebble&lt;/a&gt;，CockroachDB 的底层存储引擎，目前 Go 领域最难的 KV 存储引擎了，设计非常精细，代码量也比较大，主要参考了 RocksDB。&lt;/p&gt;
&lt;h4 id="hybridlsmbptree"&gt;Hybrid（LSM+BPTree）
&lt;/h4&gt;&lt;p&gt;lotusdb &lt;a class="link" href="https://github.com/lotusdblabs/lotusdb" target="_blank" rel="noopener"
&gt;https://github.com/lotusdblabs/lotusdb&lt;/a&gt;，结合 LSM 和 B+Tree 的存储引擎，架构较为新颖。&lt;/p&gt;
&lt;h2 id="学习建议"&gt;学习建议
&lt;/h2&gt;&lt;p&gt;最后，针对 KV 数据库的学习，这里给出我的一些小的建议。&lt;/p&gt;
&lt;p&gt;从存储模型上来说，主流的 KV 存储模型有两种，分别是 &lt;code&gt;B+Tree&lt;/code&gt; 和 &lt;code&gt;LSM Tree&lt;/code&gt;，当然后来也出现了很多基于此的变种和优化，但最基本的还是这两个。&lt;/p&gt;
&lt;p&gt;bitcask 可以看做是一个简化版的 LSM Tree，它大致只包含 LSM 中的 wal 和 memtable 组件，LSM 中最复杂的 SSTable 组件被省略了。&lt;/p&gt;
&lt;p&gt;所以在学习上，建议先从 bitcask 学起，可以参考我的那个 mini-bitask 教程，结合文章，很容易就能够理解了，代码也只有 300 多行。&lt;/p&gt;
&lt;p&gt;然后再看看我的 rosedb 项目，就基本上能够理解 bitcask 存储模型了。&lt;/p&gt;
&lt;p&gt;有了这个基础之后，可以再学习 B+树或者 LSM Tree，倒也不用两个都学，可以挑选一个自己感兴趣的去学习。&lt;/p&gt;
&lt;p&gt;B+树的话就去看 boltdb，网上也有很多 boltdb 源码解析的文章。LSM Tree 的话推荐 goleveldb，结合 leveldb 一些资料和原理，应该理解起来也不难。&lt;/p&gt;
&lt;p&gt;当然，看代码学习也只是迈出了第一步，想要更加深入的话，比如自己去撸一个出来，就需要花费更多的时间和精力了。&lt;/p&gt;</description></item></channel></rss>