7 days golang programs from scratch (web framework Gee, distributed cache GeeCache, object relational mapping ORM framework GeeORM, rpc framework GeeRPC etc) 7天用Go动手写/从零实现系列

Overview

7 days golang programs from scratch

CodeSize LICENSE

README 中文版本

7天用Go从零实现系列

7天能写什么呢?类似 gin 的 web 框架?类似 groupcache 的分布式缓存?或者一个简单的 Python 解释器?希望这个仓库能给你答案。

推荐先阅读 Go 语言简明教程,一篇文章了解Go的基本语法、并发编程,依赖管理等内容。

推荐 Go 语言笔试面试题,加深对 Go 语言的理解。

推荐 Go 语言高性能编程(项目地址),写出高性能的 Go 代码。

期待关注我的「知乎专栏」和「微博」,查看最近的文章和动态。

7天用Go从零实现Web框架 - Gee

Gee 是一个模仿 gin 实现的 Web 框架,Go Gin简明教程可以快速入门。

7天用Go从零实现分布式缓存 GeeCache

GeeCache 是一个模仿 groupcache 实现的分布式缓存系统

7天用Go从零实现ORM框架 GeeORM

GeeORM 是一个模仿 gormxorm 的 ORM 框架

gorm 准备推出完全重写的 v2 版本(目前还在开发中),相对 gorm-v1 来说,xorm 的设计更容易理解,所以 geeorm 接口设计上主要参考了 xorm,一些细节实现上参考了 gorm。

7天用Go从零实现RPC框架 GeeRPC

GeeRPC 是一个基于 net/rpc 开发的 RPC 框架 GeeRPC 是基于 Go 语言标准库 net/rpc 实现的,添加了协议交换、服务注册与发现、负载均衡等功能,代码约 1k。

WebAssembly 使用示例

具体的实践过程记录在 Go WebAssembly 简明教程

  • 示例一:Hello World | Code
  • 示例二:注册函数 | Code
  • 示例三:操作 DOM | Code
  • 示例四:回调函数 | Code

What can be accomplished in 7 days? A gin-like web framework? A distributed cache like groupcache? Or a simple Python interpreter? Hope this repo can give you the answer.

Web Framework - Gee

Gee is a gin-like framework

  • Day 1 - http.Handler Interface Basic Code
  • Day 2 - Design a Flexiable Context Code
  • Day 3 - Router with Trie-Tree Algorithm Code
  • Day 4 - Group Control Code
  • Day 5 - Middleware Mechanism Code
  • Day 6 - Embeded Template Support Code
  • Day 7 - Panic Recover & Make it Robust Code

Distributed Cache - GeeCache

GeeCache is a groupcache-like distributed cache

  • Day 1 - LRU (Least Recently Used) Caching Strategy Code
  • Day 2 - Single Machine Concurrent Cache Code
  • Day 3 - Launch a HTTP Server Code
  • Day 4 - Consistent Hash Algorithm Code
  • Day 5 - Communication between Distributed Nodes Code
  • Day 6 - Cache Breakdown & Single Flight | Code
  • Day 7 - Use Protobuf as RPC Data Exchange Type | Code

Object Relational Mapping - GeeORM

GeeORM is a gorm-like and xorm-like object relational mapping library

Xorm's desgin is easier to understand than gorm-v1, so the main designs references xorm and some detailed implementions references gorm-v1.

  • Day 1 - database/sql Basic | Code
  • Day 2 - Object Schame Mapping | Code
  • Day 3 - Insert and Query | Code
  • Day 4 - Chain, Delete and Update | Code
  • Day 5 - Support Hooks | Code
  • Day 6 - Support Transaction | Code
  • Day 7 - Migrate Database | Code

RPC Framework - GeeRPC

GeeRPC is a net/rpc-like RPC framework

Based on golang standard library net/rpc, GeeRPC implements more features. eg, protocol exchange, service registration and discovery, load balance, etc.

  • Day 1 - Server Message Codec | Code
  • Day 2 - Concurrent Client | Code
  • Day 3 - Service Register | Code
  • Day 4 - Timeout Processing | Code
  • Day 5 - Support HTTP Protocol | Code
  • Day 6 - Load Balance | Code
  • Day 7 - Discovery and Registry | Code

Golang WebAssembly Demo

  • Demo 1 - Hello World Code
  • Demo 2 - Register Functions Code
  • Demo 3 - Manipulate DOM Code
  • Demo 4 - Callback Code
Issues
  • 如果能出个 fasthttp 库的实现就更好了!

    如果能出个 fasthttp 库的实现就更好了!

    如果能出个 fasthttp 库的实现就更好了!

    opened by leffss 9
  • gee-rpc day1 通信过程

    gee-rpc day1 通信过程

    有点不懂的是:GobType中为什么要使用json做解码编码? 或者说为什么直接默认使用JsonType? 感觉形式上有点不统一。

    opened by hanxuanliang 6
  • day4 启动报错 panic: runtime error: invalid memory address or nil pointer dereference

    day4 启动报错 panic: runtime error: invalid memory address or nil pointer dereference

    day4 启动报错:

    panic: runtime error: invalid memory address or nil pointer dereference
    [signal 0xc0000005 code=0x0 addr=0x8 pc=0x66dfda]
    
    goroutine 1 [running]:
    gee/gee.getNestPrefix(0x0, 0x0, 0x0, 0x8, 0x6a3440)
            E:/go_project/src/gee/gee/gee.go:88 +0x3a
    gee/gee.(*RouterGroup).addRoute(0xc0000562c0, 0x711e2d, 0x3, 0x7123d1, 0x6, 0x72
    ab98)
            E:/go_project/src/gee/gee/gee.go:63 +0x4b
    gee/gee.(*RouterGroup).GET(...)
            E:/go_project/src/gee/gee/gee.go:69
    main.main()
            E:/go_project/src/gee/main.go:45 +0x185
    

    在 gee.go 添加以下方法后就可以了:

    func (engine *Engine) addRoute(method string, pattern string, handler HandlerFunc) {
    	engine.router.addRoute(method, pattern, handler)
    }
    
    // GET defines the method to add GET request
    func (engine *Engine) GET(pattern string, handler HandlerFunc) {
    	engine.addRoute("GET", pattern, handler)
    }
    
    // POST defines the method to add POST request
    func (engine *Engine) POST(pattern string, handler HandlerFunc) {
    	engine.addRoute("POST", pattern, handler)
    }
    

    但是在 day5 没有这三个方法也正常运行,请问为什么呢? 还有非常喜欢大佬的教程,就是 day3 的 trie 树目前也不是特别懂

    opened by leffss 4
  • 在模糊匹配下再次插入节点到同样树高,会被替换掉 handler

    在模糊匹配下再次插入节点到同样树高,会被替换掉 handler

    https://github.com/geektutu/7days-golang/blob/398679493db818265551707db70969a0e9e64529/gee-web/day3-router/gee/trie.go#L27

    maybe:

        if child == nil || child.isWild {
    
    opened by AcidGo 4
  • 前缀树名称应该是 trie-tree

    前缀树名称应该是 trie-tree

    目前文章里用的是 tire-tree,i 和 r 的顺序反了

    博主写的很好,赞

    opened by Lobshunter86 3
  • 小白求问 缓存day2不加锁的话 会出现什么问题呀

    小白求问 缓存day2不加锁的话 会出现什么问题呀

    image 就是类似框里的代码会被打乱执行顺序吗,好像其实影响也不是特别大?

    因为如果put和get如果外层逻辑上不加控制的话 也不太能保证get读到的值是在put之前还是put之后的吗? 我在想测试用例里加一些体现加锁不加锁表现上区别的是不是更容易理解点

    opened by wfnuser 3
  • 类似var _ PeerPicker = (*HTTPPool)(nil)这种设计目的是什么

    类似var _ PeerPicker = (*HTTPPool)(nil)这种设计目的是什么

    首先感谢博主能写出这么好的文章,受益匪浅 然后就是在GeeCache中我看到有类似于 var _ PeerPicker = (*HTTPPool)(nil) 和 var _ PeerGetter = (*httpGetter)(nil) 请问这种设计的意义是什么,我把这一行代码去了也并没有看到报错,有点疑惑,向博主请教

    opened by catwithtudou 3
  • 为什么cache需要设计成自动回源的?

    为什么cache需要设计成自动回源的?

    你好,我最近在看geeCache的实现,有些不明白地方想请教一下

    // Get value for a key from cache
    func (g *Group) Get(key string) (ByteView, error) {
    	if key == "" {
    		return ByteView{}, fmt.Errorf("key is required")
    	}
    
    	if v, ok := g.mainCache.get(key); ok {
    		log.Println("[GeeCache] hit")
    		return v, nil
    	}
    
    	return g.load(key)
    }
    

    比如这段函数的末尾,在cache未命中的情况下,会自己fallback去load缓存

    我没有理解这里的逻辑,为什么缓存需要自己去fallbak?难道不应该直接返回未命中么? 如果涉及成这样,那缓存岂不是永远是命中的?

    opened by Ehco1996 2
  • fix typo nBytes"">

    fix typo "nbytes=>nBytes"

    opened by caixiangyue 2
  • 第6天的代码,解析css文件,浏览器看到的内容和css文件内容不一致?

    第6天的代码,解析css文件,浏览器看到的内容和css文件内容不一致?

    golang版本 1.14.10 .

    test.css 文件内容是:

    body{background-color: aquamarine}
    

    浏览器解析出来的css内容是: {"filepath":"css/test.css"}

    opened by dafa168 2
  • 中间件源码有个疑问

    中间件源码有个疑问

    func (c *Context) Next() { c.index++ s := len(c.handlers) for ; c.index < s; c.index++ { c.handlers[c.index](c) } }

    这里的for循环是不是应该改为直接调用下一个Handler

    func (c *Context) Next() { c.index++ s := len(c.handlers) if c.index < s { c.handlers[c.index](c) } }

    opened by sportwxp 0
  • 请问博主的博客左侧菜单栏导航是怎么做的呢,好看的!

    请问博主的博客左侧菜单栏导航是怎么做的呢,好看的!

    https://geektutu.com/post/gee.html

    opened by yudidi 0
  • CallMethod无需返回

    CallMethod无需返回

    CallMethod无需返回

    opened by Gitronlee 0
  • rpc多次调用close

    rpc多次调用close

    func (server *Server) ServeConn(conn io.ReadWriteCloser) {
    	defer func() { _ = conn.Close() }()
        // ....
    
    }
    func (server *Server) serveCodec(cc codec.Codec) {
    	sending := new(sync.Mutex) // make sure to send a complete response
    	wg := new(sync.WaitGroup)  // wait until all request are handled
    	for {
    		//...
    	}
    	wg.Wait()
    	_ = cc.Close() // 这里
    }
    

    gobCodec的close 直接调用了conn.close 这里好像多次调用了conn的close?

    stackOverflow的讨论

    似乎这样会出问题,我想应该有两种解决方案

    1. 把codec的close都实现成幂等的
    2. 把ServeConn的Close去掉

    希望解惑 谢谢

    opened by kysshsy 0
  • 序列化和反序列化问题

    序列化和反序列化问题

    我在写demo时,向一个网络连接中先发送一个json的数据,再发送一个gob的数据。 然后使用json解码器进行解码,json解码器这时会把两个数据都从网络连接中读出来,存在json解码器解码后,造成gob解码器无法获取到对应的数据,作者的rpc框架也是用的json解码器和gob解码器,并且也是先发送json数据,再发送gob数据,在测试中没有发现这个问题,请问是如何避免的?

    opened by shangxiaomi 3
  • url动态参数与固定参数冲突

    url动态参数与固定参数冲突

    // 1
    	r.GET("/hello/cool", func(c *gee.Context) {
    		c.String(http.StatusOK, "cool cool, you're at %s", c.Path)
    	})
    	r.GET("/hello/:name", func(c *gee.Context) {
    		// expect /hello/geektutu
    		c.String(http.StatusOK, "hello %s, you're at %s\n", c.Param("name"), c.Path)
    	})
    //2 
    	r.GET("/hello/:name", func(c *gee.Context) {
    		// expect /hello/geektutu
    		c.String(http.StatusOK, "hello %s, you're at %s\n", c.Param("name"), c.Path)
    	})
    	r.GET("/hello/cool", func(c *gee.Context) {
    		c.String(http.StatusOK, "cool cool, you're at %s", c.Path)
    	})
    

    上面两种设置路由的形式会得到不同的效果: 1的方式可以正常访问/hello/cool/hello/:name. 2的形式,当设置/hello/cool的时候会将原来的:name节点的pattern换成/hello/cool, 导致后续/hello/:name无法继续正常工作。 修改改的方式就是: 添加cool这个节点的时候新建节点。并且将动态参数的优先级降低(排到数组的后面)。

    opened by 0xff-dev 0
  • GeeRPC day1 bug

    GeeRPC day1 bug

    GeeRPC day1的代码会有概率阻塞在futex或者epoll_wait系统调用上, 不知道怎么修复, 是不是sleep时间不太够?

    strace go run main.go

    Ubuntu 18.04 Go 1.15.6

    opened by xinwen-cs 0
high performance coding with golang(Go 语言高性能编程,Go 语言陷阱,Gotchas,Traps)

Go 语言高性能编程 订阅 最新动态可以关注:知乎 Go语言 或微博 极客兔兔 订阅方式:watch geektutu/blog ,每篇文章都能收到邮件通知,或通过 RSS 订阅。

Dai Jie 2.5k Oct 22, 2021
架构师技术图谱,助你早日成为架构师

架构师技术图谱,助你早日成为架构师 本项目是《码农周刊》架构学习资料精选,码农周刊团队官方出品。架构师必读,助你早日成为架构师! 架构师技术图谱包括:分布式、前端、大数据、存储、微服务、推荐系统、框架 、消息队列、编程语言、设计模式、重构、集群等内容。 码农周刊 VIP 会员 = 全年 52 期「V

ToutiaoIO 8.8k Oct 21, 2021
Contains hundreds of samples for learning Go.

Get Started introduction installation Basics hello scopes imports simple multiple alias lifecycle comments simple multiline documentation semicolons v

Oguzhan Kiyar 64 Oct 19, 2021
100 days of Go learning

This repository is a journal of my path to learning GO. By the end of the 100 days, you should be able to follow along by day and learn Go as well.

Cobra 24 Sep 27, 2021
互联网上的免费书籍

免费计算机书籍汇总。 没有注明语种的,都为英语资源。 目录 一、Web 开发 二、系统管理 三、编程语言 四、数据库 五、软件开发 六、人工智能 七、数学理论 八、其他 一、Web 开发 1.1 JavaScript 语言 The Modern JavaScript Tutorial(中文,英文)

Ruan YiFeng 12.1k Oct 16, 2021
Go语言学习笔记

Go语言学习教程 Go 编程语言是一个开源项目,它使程序员更具生产力。 Go 语言具有很强的表达能力,它简洁、清晰而高效。得益于其并发机制, 用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。 Go 代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机

鹏 17 Feb 6, 2021
Golang && Back-end Stack , Continually updated

Stack Here Golang OS Net Note Tool Delve Authentication Paper Paper ?? Link GO官方文档 GO Official Doc GO官方博客 GO Official Blog GO官方仓库

G 207 Sep 28, 2021
DCI Architecture Implementation

前言 在面向对象编程的理念里,应用程序是对现实世界的抽象,我们经常会将现实中的事物建模为编程语言中的类/对象(“是什么”),而事物的行为则建模为方法(“做什么”)。面向对象编程有三大基本特性(封装、继承/组合、多态)和五大基本原则(单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口分离原则

元闰子 2 Oct 12, 2021
超全golang面试题合集+golang学习指南+golang知识图谱+入门成长路线

golangFamily 【超全golang面试题合集+golang学习指南+golang知识图谱+成长路线】 一份涵盖大部分golang程序员所需要掌握的核心知识。 脑图持续不断更新中,在线查看地址 后续文章和内容会不断更新到 github项目 中,欢迎关注。

xiaobai-tech 1.3k Oct 15, 2021
Examples of Golang compared to Node.js for learning

This guide full of examples is intended for people learning Go that are coming from Node.js, although the vice versa can work too. This is not meant to be a complete guide and it is assumed that you've gone through the Tour of Go tutorial. This guide is meant to be barely good enough to help you at a high level understand how to do X in Y and doing further learning on your own is of course required.

Miguel Mota 2.6k Oct 25, 2021
Roadmap to becoming a Go developer in 2020

Go Developer Roadmap Roadmap to becoming a Go developer in 2020: Below you can find a chart demonstrating the paths that you can take and the librarie

Ali Khalili 12.7k Oct 22, 2021
Axon (spiking) version of the sims

Computational Cognitive Neuroscience Simulations This repository contains the neural network simulation models for the CCN Textbook, managed on a GitH

Computational Cognitive Neuroscience 3 May 6, 2021
Learning GO language by building projects

GoLangProjects Projects list Helloworld Variables Userinput Conversion Math, crypto & random Time & Date Pointers Arrays Slices Maps Structures If-Els

Kishan Kr Sharma 1 Oct 17, 2021
Golang后端开发知识图谱,含学习路线,面试题汇总,成为更好的golang工程师

Go基础 Go内存管理 Go并发编程 Go网络编程 Go RPC Go工程化 Go面试题 1. Go基础 Go语言中的nil 类型内嵌 slice切片源码 unsafe.Pointer非类型安全指针使用情景 2. Go内存管理 happens-before原则 垃圾收集器 3. Go并发编程 并发同

NoOoOoOo 6 Oct 18, 2021
Open-Falcon-Agent的源码解析

open-falcon agent源码阅读及二次开发 关于open-falcon的架构及说明可参考open-falcon官方网站。 目前小米、美团、滴滴、360、金山云、新浪微博、京东、爱奇艺等都在使用open-falcon或者基于open-falcon的二次开发。open-falcon的架构清晰,

null 50 Aug 3, 2021
Tool to modify Snapmaker laser GCode for a rotary module to include z movements

lasery2z Tool to modify Snapmaker laser GCode for a rotary module to include z movements. Background Snapmaker's Luban tool to generate 4D laser proje

null 3 Sep 13, 2021
A course to build distributed key-value service based on TiKV model

The TinyKV Course This is a series of projects on a key-value storage system built with the Raft consensus algorithm

TiDB Incubator 943 Oct 14, 2021
《Go语言四十二章经》详细讲述Go语言规范与语法细节及开发中常见的误区,通过研读标准库等经典代码设计模式,启发读者深刻理解Go语言的核心思维,进入Go语言开发的更高阶段。

《Go语言四十二章经》 作者:ffhelicopter(李骁) 时间:2018-04-15 前言 写《Go语言四十二章经》,纯粹是因为开发过程中碰到过的一些问题,踩到过的一些坑,感觉在Go语言学习使用过程中,有必要深刻理解这门语言的核心思维、清晰掌握语言的细节规范以及反复琢磨标准包代码设计模式,于是

ffhelicopter 4.1k Oct 22, 2021
Collection of awesome interview references.

Awesome Interview Collection of awesome interview reference

Awesome Interview 1.7k Oct 11, 2021