狠狠撸

狠狠撸Share a Scribd company logo
如何用春节假期造一个最快的
泛型Go ORM?
翁伟 Wuvist @ Ola Chat
对于我
? 85前+、居住新加坡、追求极致的处女座
? 搞过 .net / python / php / go等等
? https://github.com/olachat/gola
? 基于Go 1.18实现
? 已经是我在不同语言下搞的第N个ORM
? 最近问了下前司的同事,之前的两个Go ORM还一直在线
上使用,并团队有持续改进
春节就搞定?
当然只是搞定了初版 POC
距离功能“完备”,还有十几个todo
但确实应该是“世界最快”。。。
Go与泛型
知乎不是一个技术网站,技术内容质
量参差不齐
“Go不需要泛型”
“有interface就够了”
“大道至简 ”
什么是泛型 generic?
? Generic programming is a style of computer
programming in which algorithms are written in terms of
types to-be-specified-later that are then instantiated
when needed for specific types provided as parameters.
? 泛型是程序设计语言的一种风格或范式。泛型允许程序员
在实现算法逻辑时,延迟声明具体的数据类型,即实例化
时才把具体类似作为参数传递。
? 泛型解决的是将固定算法作于于不同类型的问题
? 这于接口:不同类型提供同一接口有本质不同
? 算法的可复用性其实非常重要
? 最典型的例子是数组排序
? 序列化marshal等等也是
? https://docs.google.com/document/d/1vrAy9gMpMoS3uaV
phB32uVXX4pi-
HnNjkMEgyAHX4N4/view#heading=h.7hy69baqv6xo
骋辞当然需要泛型!优先级的问题
Fastest golang ORM implemented with generic
Fastest golang ORM implemented with generic
Fastest golang ORM implemented with generic
那有泛型加持的gola是怎么样?
? select id, title from blogs
? 能够以强类型的方式指定select字段
? 无需使用字符串形式去指定select字段名
? inline的声明匿名类型,并使用
? 彻底杜绝调用了未被select字段的可能
? 应该没有别的ORM实现了这两点
有没有LINQ的感觉?
? select * from blogs where user_id = 123 and is_pinned =
true order by id desc limit 10
Fastest golang ORM implemented with generic
感知索引以提供函数补全
? blogs.Select[blogs.Blog]().WhereUserIdEQ(123)
.AndIsPinnedEQ(true).OrderBy(blogs.IdDesc)
.Limit(10, 0)
? 源自于:
? KEY `user_pinned` (`user_id`, `is_pinned`)
索引 与 补全
? 能够“面向编辑器补全”写出来的强类型查询,必然有索引
支持
? 彻底规避“忘了建索引”的线上故障
? 发现查询写不了?
? 考虑一下是否要增加索引?
? 确实建了索引,那就手写SQL
? 彻底强类型,规避低级错误
+
? 面向编辑器补全开发,愉快编码
+
? 查询必有索引,减少线上问题烦恼
=
? 少加班
gola 与 索引
? 索引对于数据库使用极其重要
? 数据库其实可以没有表结构schema
? https://backchannel.org/blog/friendfeed-schemaless-
mysql
? 但OLTP数据库不可以没有索引!
看回行业历史发展
各种数据库使用范式,均没有针对索
引提供支持:
* Transaction Script
* Table Module
* Domain Model
* ActiveRecord
Source: Patterns of Enterprise Application Architecture by Martin Fowler
IAQ: Index-Aware Query
索引感知查询
希望gola提供的索引感知查询能够成
为新的范式
IAQ其实才是整个gola实现最难的部分
耗费了我整个春节…
Fastest golang ORM implemented with generic
gola大量依赖于代码生成
? blogs.Id / blogs.Title 实际上是生成出来的类型struct
? 黑魔法?
Fastest golang ORM implemented with generic
影响性能的不是泛型,而是接口设计
用了反射还快?
? 使用读取对象类型、属性、判断接口是很快的
? 反射的读往往是简单的unsafe包操作
? 还可以基于类型做缓存
? 使用反射做赋值才慢
性能其实不重要
? 重要的是开发效率
? 强类型补全有能带来极大的愉悦
? 重要的是代码质量
? SQL不能瞎写,要考虑索引
? 极致性能与高效率的功能并不冲突
? 相反可以相辅相成
? 设计做得好,性能自然极致
与1000位技术大咖同行
结交全球大咖 拓展业务合作 缓解中年焦虑 生活多样精彩
加入小红花,你可以
把握技术潮流 打造个人品牌
https://github.com/olachat/gola
火热填坑中~求Star~求关注~
Q & A

More Related Content

Similar to Fastest golang ORM implemented with generic (13)

与笔测迟丑辞苍一路走来
与笔测迟丑辞苍一路走来与笔测迟丑辞苍一路走来
与笔测迟丑辞苍一路走来
leejd
?
如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱
84zhu
?
Grpc + python.key
Grpc + python.keyGrpc + python.key
Grpc + python.key
Andy Dai
?
构建网络工具箱
构建网络工具箱构建网络工具箱
构建网络工具箱
Lv Jian
?
如何使用工具提高笔贬笔项目的生产力
如何使用工具提高笔贬笔项目的生产力如何使用工具提高笔贬笔项目的生产力
如何使用工具提高笔贬笔项目的生产力
Scourgen Hong
?
Golang
GolangGolang
Golang
偉君 方
?
優雅的在 Emacs 中使用 git
優雅的在 Emacs 中使用 git優雅的在 Emacs 中使用 git
優雅的在 Emacs 中使用 git
Kai-Yuan Cheng
?
Ping Pong 2012/11/29 @NTU博理館
Ping Pong 2012/11/29 @NTU博理館Ping Pong 2012/11/29 @NTU博理館
Ping Pong 2012/11/29 @NTU博理館
火 鄭
?
不妥协的河蟹之道
不妥协的河蟹之道不妥协的河蟹之道
不妥协的河蟹之道
Ken Kuan
?
Ping pong
Ping pongPing pong
Ping pong
火 鄭
?
Phonagp 介绍
Phonagp 介绍Phonagp 介绍
Phonagp 介绍
dong yuwei
?
01.辫测迟丑辞苍.开发最佳实践
01.辫测迟丑辞苍.开发最佳实践01.辫测迟丑辞苍.开发最佳实践
01.辫测迟丑辞苍.开发最佳实践
Na Lee
?
与笔测迟丑辞苍一路走来
与笔测迟丑辞苍一路走来与笔测迟丑辞苍一路走来
与笔测迟丑辞苍一路走来
leejd
?
如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱
84zhu
?
Grpc + python.key
Grpc + python.keyGrpc + python.key
Grpc + python.key
Andy Dai
?
构建网络工具箱
构建网络工具箱构建网络工具箱
构建网络工具箱
Lv Jian
?
如何使用工具提高笔贬笔项目的生产力
如何使用工具提高笔贬笔项目的生产力如何使用工具提高笔贬笔项目的生产力
如何使用工具提高笔贬笔项目的生产力
Scourgen Hong
?
優雅的在 Emacs 中使用 git
優雅的在 Emacs 中使用 git優雅的在 Emacs 中使用 git
優雅的在 Emacs 中使用 git
Kai-Yuan Cheng
?
Ping Pong 2012/11/29 @NTU博理館
Ping Pong 2012/11/29 @NTU博理館Ping Pong 2012/11/29 @NTU博理館
Ping Pong 2012/11/29 @NTU博理館
火 鄭
?
不妥协的河蟹之道
不妥协的河蟹之道不妥协的河蟹之道
不妥协的河蟹之道
Ken Kuan
?
01.辫测迟丑辞苍.开发最佳实践
01.辫测迟丑辞苍.开发最佳实践01.辫测迟丑辞苍.开发最佳实践
01.辫测迟丑辞苍.开发最佳实践
Na Lee
?

More from Weng Wei (14)

Migrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to GoMigrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to Go
Weng Wei
?
About Caching
About CachingAbout Caching
About Caching
Weng Wei
?
Metaprogramming Go
Metaprogramming GoMetaprogramming Go
Metaprogramming Go
Weng Wei
?
Why use Go for web development?
Why use Go for web development?Why use Go for web development?
Why use Go for web development?
Weng Wei
?
谈谈缓存
谈谈缓存谈谈缓存
谈谈缓存
Weng Wei
?
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
Weng Wei
?
Go for web
Go for webGo for web
Go for web
Weng Wei
?
Python to go
Python to goPython to go
Python to go
Weng Wei
?
论使用笔测迟丑辞苍开发推荐引擎的优越性
论使用笔测迟丑辞苍开发推荐引擎的优越性论使用笔测迟丑辞苍开发推荐引擎的优越性
论使用笔测迟丑辞苍开发推荐引擎的优越性
Weng Wei
?
Zalora php to_go
Zalora php to_goZalora php to_go
Zalora php to_go
Weng Wei
?
A byte of git
A byte of gitA byte of git
A byte of git
Weng Wei
?
My understanding of Git
My understanding of GitMy understanding of Git
My understanding of Git
Weng Wei
?
Sharding
ShardingSharding
Sharding
Weng Wei
?
Inside Zend Framework
Inside Zend FrameworkInside Zend Framework
Inside Zend Framework
Weng Wei
?
Migrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to GoMigrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to Go
Weng Wei
?
About Caching
About CachingAbout Caching
About Caching
Weng Wei
?
Metaprogramming Go
Metaprogramming GoMetaprogramming Go
Metaprogramming Go
Weng Wei
?
Why use Go for web development?
Why use Go for web development?Why use Go for web development?
Why use Go for web development?
Weng Wei
?
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
用笔驰实现&辩耻辞迟;骋辞元编程&辩耻辞迟;
Weng Wei
?
论使用笔测迟丑辞苍开发推荐引擎的优越性
论使用笔测迟丑辞苍开发推荐引擎的优越性论使用笔测迟丑辞苍开发推荐引擎的优越性
论使用笔测迟丑辞苍开发推荐引擎的优越性
Weng Wei
?
Zalora php to_go
Zalora php to_goZalora php to_go
Zalora php to_go
Weng Wei
?
A byte of git
A byte of gitA byte of git
A byte of git
Weng Wei
?
My understanding of Git
My understanding of GitMy understanding of Git
My understanding of Git
Weng Wei
?
Inside Zend Framework
Inside Zend FrameworkInside Zend Framework
Inside Zend Framework
Weng Wei
?

Fastest golang ORM implemented with generic