some tips for golang range

There are 2 types of range, with index and without index. Let’s see an example for range with index. func TestRangeWithIndex(t *testing.T) { rows := []struct{ index int }{{index: 0}, {index: 1}, {index: 2}} for _, row := range rows { row.index += 10 } for i, row := range rows { require.Equal(t, i+10, row.index) } } the output is: Error Trace: version_test.go:39 Error: Not equal: expected: 10 actual : 0 Test: TestShowRangeWithIndex Above test fails since when range with index, the loop iterator variable is the same instance of the variable with a clone of iteration target value....

September 17, 2021 · 3 分钟 · ming

来自新手的 tidb 贡献指南

学习 go 之后常年关注 go 生态, 除了 docker, k8s 这些云原生领域的顶梁柱, 国内的 newsql 数据库 tidb 也很快进入关注列表。 在对 tidb 有了更多的了解之后, 对它的兴趣也越大, 如: 云原生的 newsql 解决方案 完全开源,开放的生态和社区 在几年前选型时,就选择了 sql 层 go, 存储层 rust 的双语方案,魄力 国人做的。 终于有国人在 操作系统, 数据库, 编译器 这 3 大基础软件领域做出了有一定成绩,且有完全自主知识产权的产品了(而不是各种魔改)! 虽然我对它兴趣浓厚, 想深入的了解学习一下, 却没有想过要参与到它的开发中去, 最大的原因可能是认为数据库的开发很难,我的 go 也刚学不久 等, 直到我看到 tison 的一篇 vlog 一分钟成为 TiDB 贡献者, 我抱着试试的态度,开始了 tidb 的 contribute 之旅。 虽然只是开始,但也涨了不少知识,踩了一些坑,趁热写这么一篇文章,希望对后来的新人有帮助。 概述 tidb 分布式数据库是个庞大的系统,从核心到外围,可以大概分为: tidb(go) + tikv(rust),除了同名主仓库,还有好些依赖组件在他们各自的仓库 安装,监控,数据迁移等官方工具, 如 tiup, dm 等 文档 客户服务,论坛等 一个庞大的系统必然有各种各样任务,他们的难度是不一样的,小到修改一个错别字,写一篇使用心得,都可以算是贡献。 我的 contribute 之路也是从一个小小的测试重构开始的。...

August 8, 2021 · 2 分钟 · ming

golang i18n的不同思路

传统的解决方案 i18n是软件开发中常见的一个需求, 很多流行的开发框架如 ruby on rails, springboot 对它有内置的支持。 rails 的 i18n 是其中的佼佼者, 我们看看它解决了哪些问题,是如何解决的。 i18n 资源文件 通常开发者需要按照框架的约定创建资源文件,一般会在目录或文件名中包含如 es, en 等 locale 信息,方便框架按需加载。 |---books |-----es.yml |-----en.yml |---users |-----es.yml |-----en.yml key 的定义和查找优先级 通常每个翻译文本会对应一个有意义的key,通过 key + locale 的组合得到当前 locale 下的翻译文本. I18n.t 'activerecord.models.user' # => 'Customer' I18n.t 'activerecord.models.user' # => '客户' en: activerecord: models: user: "Customer" attributes: user: login: "Login" zh: activerecord: models: user: "客户" attributes: user: login: "登陆" 当项目到一定规模, key 的数量很多时,key 的命名就显得格外重要,否则重用 key 时很难查找。 而且除了用户自定义的 key, 框架一些内置的 key 如日期, 错误消息等, 也需要用户提供翻译。 所以 key 的命名 rails 也做了约定,如下...

June 30, 2021 · 2 分钟 · ming

rust 和 go 语言调研

java 的弊端 做软件开发已经 10 多年了,主要是偏业务的 web 应用开发, 主要语言是 java, js(typescript),ruby,shell, sql等, 主要框架为 springboot, jquery, vue, rails 等。 随着微服务和云原生的发展,容器成为新一代的虚拟单元,传统 java 技术栈在这一块的不足越发明显: 镜像大 内存占用高 启动慢,跟语言和框架层面都有关系 运行慢 高并发不容易 分发不方便 这些不足跟 java 的虚拟机,面向对象,反射,垃圾回收等语言特性有关。这些特性并不都是坏处, 但随着外部环境的变化,有些特性变的不适用或者不再有优势。 java 社区也在做一些改进,如 java 的反应式编程框架 vertx, 可直接将 java 代码编译成可执行文件的 GraalVM 虚拟机等,但总归是有不少历史包袱,只能在某一些方面做有限改进。 新兴语言 反观一些新兴语言,在运行速度, 资源占用,分发便利性等方面有全面的优势,比较典型的就是 go 和 rust。 go 在网络领域有惊人的表现, 出现了一大堆优秀框架,如 docker, k8s, traefik, canddy 等。 rust 知名项目少一点,有 deno, tikv,libra,ripgrep 等 其中 tidb 作为 new sql 的代表数据库产品之一获得了巨大的成功,它使用 rust 作为存储引擎开发语言, go 作为解析执行引擎开发语言,是两种语言使用的集大成者。...

February 10, 2021 · 1 分钟 · ming

2021年小公司技术架构选型

企业web应用技术讨论 基于兴趣和职业发展的考虑,我参加了上次关于“增量配网产品”架构的讨论会议,对公司现有的产品,人员,技术储备有了一定的了解。 会上对未来几年公司使用的技术栈有了指导性的意见,但候选项只有项目中已经使用的几个非常成熟的技术,个人认为欠缺广度和深度。 仅有限的几个同事参与,意味着可能公司有人掌握了某项技术,但没有成为一个候选项。 除了手边会用的工具, 也应该到市面上找更合适的工具。 一定的技术预研和储备是非常必要的 故写了这篇文章,抛出我的观察和思考,然后看看“沉默的大多数"中有没有志同道合的人,可以将一些更先进(合适)的技术引入公司业务, 助力公司发展。 由于我们讨论的是企业web应用,所以需要关心的问题大概有下面几类,我们依次讨论。 web, 即前端 一些传统的企业开发不重视前端,觉得能用就行,分工上也没有专门的前端工程师,而是由后端工程师一把梭。 但前端的工作量并不小,开发维护成本很高,且易用性美观度等也大大影响用户对软件的整体印象。 如果有多端显示,小程序等需求,则难度和成本更是直线上升。 传统的 js 和 jquery 应用缺乏模块管理,依赖管理,组件化支持等关键特性, 为了解决这些问题,前端的生态发展很快,工程化和模块化水平已经不输后端,出现了 angular, reactjs, vue, svelet 等优秀的 mvvm 框架, 以及 typescript 这样的强类型编译语言,解决了前端大代码量下的开发效率问题。 对于需要 seo 的应用, 纯静态页面和后台生成页面还有一定市场,但对于企业开发,mvvm是完美的解决方案, 也就意味着前后端的完全分离, 后端只提供数据,展示和交互逻辑完全由前端负责。下面简单介绍一下几个 mvvm 框架的特点。 相同点 组件化 响应式数据绑定 状态和路由管理 不同点 reactjs,facebook 出品,生态丰富,使用 jsx 抽象程度高,学习成本高,大公司使用较多。 vue,华人出品,生态较丰富,使用模板抽象程度较高,学习成本低,中小公司和国内使用较多。 svelet 较新,基于一种新的思路,即将运行时的问题提前到编译器解决,目前在前后端均出现了这样的案例。优势是没有运行时,代码小,性能高,很适合做组件开发。 应用层,即后端 移动互联网的发展催生了很多高并发和大数据量的业务,也造就了云厂商的繁荣和容器技术的发展,devops 和云原生等技术被提出,用于解决后端日益复杂的开发运维问题。以 k8s 的出现为标志,基本解决了云环境下的cpu,内存,网络,存储这些计算资源管理和分配问题,有人说 k8s 是云环境下的操作系统,所以后端的开发不得不考虑基础设施到底是啥的问题。...

February 1, 2021 · 1 分钟 · ming