自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

TonyBai

Kubernetes、Docker、Golang、儿童编程、DevOps、云计算平台和机器学习

  • 博客(741)
  • 资源 (1)
  • 收藏
  • 关注

原创 要么返回错误值,要么输出日志,别两样都做

1. 缘起这周,一个产品团队内进行Go代码评审时,得到了一个结论:所有的if err != nil的地方都应该输出错误日志。然而,这种做法并不是最佳实践,它存在一些问题。首先,打印过多的错误日志会导致日志文件变得冗长和难以阅读。其次,重复的错误信息会增加冗余。此外,每一层都打印错误日志,一旦错误信息设计不当,可能会导致上下文信息的丢失。让我们来看一个示例,说明为什么同时输出错误日志和返回错误值会导...

2024-04-15 08:00:51 297

原创 选择正确的Go Module Path

最近我在查看项目代码时,注意到有人在go.mod文件中将module path写为com.example.foo了。根据这个写法,相信屏幕前的读者也可以推断出这位开发人员可能是从Java阵营转到Go的。实际开发中可能有很多开发者会使用类似的内容作为module path,但这显然不是Go的推荐写法或惯用法。在这篇简短的文章中,我就来介绍一下module path对Go源码构建、包导入路径以及开发协...

2024-04-10 08:01:17 782

原创 Go 1.22引入的包级变量初始化次序问题

细心的朋友可能已经注意到,从春节后,我的博客就“停更”了!实际上,这一情况部分是因为工作上的事务繁忙,另一部分则是因为我将工作之外的闲暇时间更多地投入到一本即将于今年中下旬出版的书的撰写了:在之前的积累基础上,我花了两个多月的时间完成了初稿。当然,我也深切地怀念博客写作所带来的乐趣和与读者的互动。正巧,今天一位学员在《Go语言第一课》专栏[1]留言给了我一个恢复下笔的机会。借此,我也准备恢复一下博...

2024-03-30 08:02:26 989

原创 Go 1.22中值得关注的几个变化

美国时间2024年2月6日,正当中国人民洋溢在即将迎来龙年春节的喜庆祥和的气氛中时,Eli Bendersky[1]代表Go团队在Go官博发文“Go 1.22 is released![2]”,正式向世界宣告了Go 1.22版本的发布!注:大家可以从Go官网下载Go 1.22的第一个版本go 1.22.0,也可以在Go playground[3]上选择Go 1.22版本在线体验Go 1.22的语法...

2024-02-19 08:00:45 1013

原创 2024年的Rust与Go

本文译自《Rust vs Go in 2024》[1]。我可以说些什么而不让大家生气吗?Rust和Go哪个更好?你应该为下一个项目选择哪种语言,为什么?两者在性能、简单性、安全性、功能特性、规模化(scale)和并发性等方面如何比较?它们有什么共同点,又有什么根本区别?让我们通过Rust和Go的友好且公平的比较来找到答案。1. Rust和Go都很棒首先,非常重要的是,Go和Rust都是绝对优秀的编...

2024-01-25 08:03:24 1094 1

原创 依赖Kafka的Go单元测试例解

Kafka[1]是Apache基金会开源的一个分布式事件流处理平台,是Java阵营(最初为Scala)中的一款杀手级应用,其提供的高可靠性、高吞吐量和低延迟的数据传输能力,让其到目前为止依旧是现代企业级应用系统以及云原生应用系统中使用的重要中间件。在日常开发Go程序时,我们经常会遇到一些依赖Kafka的代码[2],如何对这些代码进行测试,尤其是单测是摆在Go开发者前面的一个现实问题!有人说用moc...

2024-01-09 08:00:43 1145

原创 Go语言之父的反思:我们做对了什么,做错了什么

在《2023年Go语言盘点:稳中求新,稳中求变[1]》和《Go测试的20个实用建议[2]》两篇文章中,我都提到过已经退居二线的Go语言之父Rob Pike[3]在Go开源14周年[4]的那天亲自在GopherCon Australia 2023上发表了“What We Got Right, What We Got Wrong”的主题演讲来回顾Go诞生以来的得与失。近期Rob Pike终于将这次演进...

2024-01-08 08:00:30 899

原创 Go测试的20个实用建议

2023年11月初,Go语言技术负责人Russ Cox在GopherCon Australia 2023[1]大会上进行了题为“Go Testing By Example”[2]的演讲:12月初Russ Cox重新录制了该演讲内容的视频,并在个人网站[3]上放了出来。这个演讲视频是关于如何编写好的Go测试的,Russ Cox介绍了20个实用建议,非常值得Go初学者甚至Go资深开发者学习并应用到实践...

2024-01-02 07:50:42 987

原创 2023年Go语言盘点:稳中求新,稳中求变

时光荏苒,转眼间已经是2023年的最后一天了。《2022年Go语言盘点:泛型落地,无趣很好,稳定为王[1]》仿佛就写在昨天。回首这一年,全球彻底从新冠大流行中得以复苏,Go语言也不例外,最直观的表现就是全球各地的GopherCon技术大会或小型Meetup都纷纷从停办/线上的状态来到了线下,并获得Gopher们的热烈欢迎和踊跃参与,比如下图中的GopherCon[2]、GopherCon UK[3...

2023-12-31 13:39:53 6206 5

原创 Go 1.22新特性前瞻

美国时间2023年12月20日,Go官方宣布Go 1.22rc1发布,开启了为期2个多月的、常规的公测之旅,Go 1.22预计将于2024.2月份正式发布!除了在官网下载Go 1.22rc1版本进行新特性体验之外,我们还可以通过在线的Go Playground选择“Go dev branch”来体验(相比下载安装,在线版本体验会有一些局限):注:关于Go的多种安装方法,《Go语言第一课》专栏有系统...

2023-12-26 08:03:06 1274

原创 通过实例理解OpenID身份认证

在《通过实例理解OAuth2[1]》一文中,我们以实例方式讲解了OAuth2授权码模式(Authorization Code)模式的工作原理。实例中的照片冲印服务经过用户(tonybai)的授权后,使用用户提供的code(实则是由授权服务器分配并通过用户的浏览器重定向到照片冲印服务的)到授权服务器换取了access token,并最终使用access token从云盘系统中读取到了用户的照片信息。...

2023-12-23 08:01:55 1099

原创 通过实例理解OAuth2授权

在之前的《通过实例理解Go Web身份认证的几种方式[1]》和《通过实例理解Web应用授权的几种方式[2]》两篇文章中,我们对Web应用身份认证(AuthN)和授权(AuthZ)的几种方式做了介绍并配以实例增强理解。在现实世界中,还有一大类的认证与授权是在前面的文章中没有作为重点介绍的,那就是OAuth2授权[3]与基于OAuth2之上的OpenID身份认证(OIDC, OpenID Connec...

2023-12-16 12:00:36 917

转载 2024线下活动全面启动,1月6日深圳站不见不散~

亲爱的 gopher们,非常激动地宣布:2024年我们将全面启动一系列令人期待的线下活动!我们不仅将在北京、上海、深圳、武汉、成都、杭州、广州、西安等城市举办 meetup,还将在北京和上海举办备受瞩目的 GopherChina 大会。在此,我们开放2024议题征集通道,欢迎各位有实战经验、独特观点的小伙伴勇跃分享~议题提交扫这里~2024开年第一场 meetup 将由 GoCN 社区联合 Aft...

2023-12-15 08:02:44 92

原创 简单之道

已经退居二线的Go语言之父Rob Pike近日发表了一篇名为“Simplicity”[1]的博文,记述了2009年在Google内部一次圆桌会议上发表的演讲内容。Pike老先生在这个时间点发表这篇文章究竟有何深意呢?是对Go语言演进的路线[2]有所不满吗?我们不得而知。不过,这篇文章的内容却是非常值得我们学习,这里我简单翻译一下,供大家参考。2009年5月,Google举办了一次内部的“设计巫术(...

2023-12-12 08:00:35 936

原创 Go未来演进:基于共同目标和数据驱动的决策

自从Go语言之父Rob Pike从Google退休并隐居澳洲后,Russ Cox便成为了Go语言团队的“带头大哥”,虽然其资历还无法与依旧奋战在一线的另外一位Go语言之父Robert Griesemer相比。如今,Russ Cox对Go语言未来的演化发展是很有“发言权”的,Go module的引入便是Russ Cox的重要决策之一。从Go社区来看,这些年来,以Russ Cox为首的Go团队对Go演...

2023-12-11 08:00:50 880

原创 有效表达软件架构的最小图集

无论你是专职的软件架构师,还是在团队内兼职充当软件架构师角色的开发人员,一旦你处在软件架构师这个位置上,你自然就会遇到软件架构设计的三个困惑:如何更深刻地理解业务;如何更正确地取舍(包括技术性和业务性的);如何更有效地表达软件架构。以上每个困惑展开来写都够写一本书的。而在这篇文章中,我仅聚焦最后一个困惑,聊聊我心目中表达软件架构的有效方式 -- 最小图集(Minimum Diagram Set)。...

2023-12-07 08:00:28 791

原创 通过实例理解API网关的主要功能特性

在当今的技术领域中,“下云”的概念正逐渐抬头,像David Heinemeier Hansson[1](37signals公司的联合创始人, Ruby on Rails的Creator)就直接将公司所有的业务都从公有云搬迁到了自建的数据中心[2]中。虽说大多数企业不会这么“极端”,但随着企业对云原生架构采用的广泛与深入,不可避免地面临着对云服务的依赖。云服务在过去的几年中被广泛应用于构建灵活、可扩...

2023-12-03 18:00:38 976

原创 一文搞懂Go gRPC服务Handler单元测试

在云原生时代和微服务架构背景下,HTTP和RPC协议成为服务间通信和与客户端交互的两种主要方式。对于Go语言而言,标准库提供了net/http/httptest包,为开发人员提供了便捷的方式来构建服务端HTTP Handler单元测试的测试脚手架代码,而无需真正建立HTTP服务器,让开发人员可以聚焦于对Handler业务逻辑的测试。比如下面这个示例://grpc-test-examples/ht...

2023-11-25 08:00:31 900

原创 通过实例理解Web应用跨域问题

在开发Web应用的过程中,我们经常会遇到所谓“跨域问题(Cross Origin Problem)”。跨域问题是由于浏览器的同源策略(Same-origin policy)[1]导致的,它限制了不同源(Origin:域名、协议或端口)之间的资源交互。在这篇文章中,我将通过一些具体的示例来把跨域问题以及主流解决方法说清楚,供大家参考。1. 什么是跨域问题跨域问题指的是当一个Web应用程序在访问另一个...

2023-11-20 08:00:41 95

原创 关系代数、SQL语句和Go语言示例

近些年,数据库领域发展日新月异,除传统的关系型数据库外,还出现了许多新型的数据库,比如:以HBase、Cassandra、MongoDB为代表的NoSQL数据库,以InfluxDB、TDEngine为代表的时序数据[1]库,以Neo4J、Dgraph为代表的图数据库,以Redis、Memcached等为代表的内存数据库,以Milvus为代表的向量数据库,以CockroachDB、TiDB为代表的H...

2023-11-15 08:00:25 449 1

原创 通过实例理解Web应用的机密管理

如果你是一个Web应用系统的开发人员,你的日常大概率是“乐此不疲”地做着CRUD[1]的活儿,很少接触到安全方面的内容。如果这时有人和你提到“机密(信息)管理(secret management)”,你大概率会说:那是啥?和我有关系吗?你只是大多应用系统开发人员中的一个典型代表。现阶段,很多开发人员,尤其是业务应用开发人员在工作中较少甚至没有接触过专门的机密管理系统,在系统设计时也较少考虑到机密管...

2023-11-08 08:01:00 106

原创 通过实例理解Web应用授权的几种方式

预告:下周一会发一个软文,大家担待一下,高低忍一忍在前面的系列文章中,我们了解了Go Web应用身份认证的几种方式[1],也知道了该如何相对安全地存储用户的密码信息[2],最大程度减小在系统数据库被攻破时用户密码信息的泄露程度。一旦用户通过身份验证,他/她就可以以合法的身份进入到系统中,那么问题来了:用户进入系统后是否就可以“为所欲为”了呢?显然不是! 比如我们以普通用户身份登录github,身份...

2023-11-05 08:00:21 269

原创 通过实例理解Web应用用户密码存储方案

在上一篇文章《通过实例理解Go Web身份认证的几种方式》[1]中,我们了解了Web应用的多种身份验证方式。但无论哪种方式,用户初次访问Web应用的注册流程和登录流程是不可避免的,而基于用户名密码的注册流程依旧是当今主流。注册后,Web应用后端是如何保存用户密码的呢?历史上都有哪些存储方案?当今的主流存储方案又是什么呢?在这篇文章中,我们就来说说Web应用的各种密码存储方案的优缺点,并通过实例来理...

2023-10-26 08:00:17 110

原创 通过实例理解Go Web身份认证的几种方式

在2023年Q1 Go官方用户调查报告[1]中,API/RPC services、Websites/web services都位于使用Go开发的应用类别的头部(如下图):我个人使用Go开发已很多年,但一直从事底层基础设施、分布式中间件等方向,Web应用开发领域涉及较少,像Web应用领域常见的CRUD更是少有涉猎,不能不说是一种“遗憾”^_^。未来一段时间,团队会接触到Web应用的开发,我打算对Go...

2023-10-24 08:01:16 485

原创 基于公钥验签实现应用许可机制

随着互联网的普及以及应用的快速发展,商业软件的订阅模式变得越来越流行。软件公司开始提供基于订阅的服务,用户每月或每年支付费用以获取软件的使用权。这种模式使用户可以更灵活地选择服务期限,并且软件公司可以持续提供更新和技术支持。随着“软件定义汽车”的到来,这种模式在智能网联汽车领域也逐渐流行开来!一些需要私有化部署在客户现场的toB商业软件的公司也在探索这种订阅许可证模式,但与toC的软件不同,toB...

2023-10-16 08:01:10 131

原创 Go TLS服务端绑定证书的几种方式

随着互联网的发展,网站提供的服务类型和规模不断扩大,同时也对Web服务的安全性提出了更高的要求。TLS(Transport Layer Security)[1]已然成为Web服务最重要的安全基础设施之一。默认情况下,一个TLS服务器通常只绑定一个证书[2],但当服务复杂度增加时,单一证书已然难以满足需求。这时,服务端绑定多个TLS证书就成为一个非常实用的功能。Go语言中的net/http包和tls...

2023-10-14 08:00:50 212

原创 Service Weaver:以单体形式编码,以微服务形式部署

分布式应用的主流架构模式演化为微服务架构已经有些年头了。微服务、DevOps、持续交付和容器技术(k8s)是构成最初云原生概念[1]的核心要素。它们相生相拌,共同演进,并推动了云计算全面进入云原生时代。云原生应用普遍采用微服务架构,遗留的单体应用程序会逐步演进并拆分为多个微服务,新应用则会直接采用微服务架构进行设计与实现。微服务的好处是显而易见的:每个微服务都编译为一个二进制文件并独立部署和扩展,...

2023-10-10 08:02:33 390

转载 程序员+软考证书=王炸!!

????#IT人 #积分落户、升职加薪、领奖金!到底是什么神仙证书吸引众多程序员争相报考?最近发现,软考报考人数已超500万!2020年40万,2021年94万,2022年129万,两年时间直翻3倍!如此火爆原因是什么?据统计:2023上半年不仅报名人数大涨,参考率也同步上升,竞争逐步激烈!软考也叫软件水平考试,IT圈公认的高含金量证书,加上政策福利贼好、市场需求变大,才日渐火热…????软考可考专业多:高...

2023-10-09 13:02:12 122

原创 Go项目目录该怎么组织?官方终于出指南了!

长久以来,在Go语言进阶的学习和实践之路上,Go项目目录究竟如何布局一直是困扰大家的一个问题,这是因为Go官方针对这个问题迟迟没有给出说法,更没有提供标准供大家参考。仅有Go语言项目技术负责人Russ Cox在一个开源项目的issue中给出了他关于Go项目结构的最小标准布局的想法[1]。熟悉我的博客/公众号的读者可能会知道,关于Go项目目录布局,我在以往文章中曾写过多次[2]。在我的纸版书《Go语...

2023-10-06 08:00:44 125

原创 聊聊Go与依赖注入

如果你读过Robert C. Martin[1]的《敏捷软件开发:原则、模式与实践》[2](书的封皮见下图),那么你一定知道经典的SOLID设计原则[3]中的“D”:依赖倒置原则(Dependency Inversion Principle, DIP)。依赖倒置原则是面向对象设计中的基本原则之一,它阐述了高层模块和低层模块的依赖关系应该倒置(如下图),也就是:高层模块不应该依赖低层模块,二者都应该...

2023-09-28 08:03:15 283

原创 聊聊Go语言的向前兼容性和toolchain规则

Go语言在发展演进过程中一直十分注重向后兼容性(backward compatibility),在Go 1.0版本发布[1]之初就发布了Go1兼容性承诺[2],简单来说就是保证使用新版本Go(比如Go 1.21版本[3])可以正常编译和运行老版本的Go代码(比如使用Go 1.18版本[4]语法编写的go代码),不会出现breaking change(其实也不是绝对的不会出现[5])。但是在Go 1...

2023-09-11 08:02:34 1142

转载 全网独一份!GPT+AI大模型资源...(待会删)

随着ChatGPT热度不断????“AI大模型”连续登上圈内话题榜首!Google、阿里、腾讯等各大互联网公司,无不在布局人工智能技术和市场,甚至还有60k*16的高薪,挖掘AI大模型人才!作为普通程序员,想切入大热的AI领域,却找不到方向?!????上市公司@知乎特邀行业大佬联合发起:AI大模型公开课已为本号粉丝开通免费领取权限预计24小时后关闭通道!速进!AI大模型-重塑程序员核心竞争力(不限年龄!...

2023-09-09 08:00:10 57

原创 slog实战:文件日志、轮转与kafka集成

《slog正式版来了:Go日志记录新选择![1]》一文发布后,收到了很多读者的反馈,意见集中在以下几点:基于slog如何将日志写入文件slog是否支持log轮转(rotation),如果slog不支持,是否有好的log轮转插件推荐?如何与kafka集成日志输出有哪些最佳实践这篇文章就是对上述问题进行补充说明的,供大家参考,希望能给大家带去帮助。1. 输出日志到文件之所以《slog正式版来了:Go日...

2023-09-04 08:05:03 918

原创 slog正式版来了:Go日志记录新选择!

在大约一年前,我就写下了《slog:Go官方版结构化日志包[1]》一文,文中介绍了Go团队正在设计并计划在下一个Go版本中落地的Go官方结构化日志包:slog[2]。但slog并未如预期在Go 1.20版本[3]中落地,而是在golang.org/x/exp/slog下面给出了slog的初始实现供社区体验。时光飞逝,slog在golang.org/x/exp/slog下经历了1年多时间的改善和演进...

2023-09-02 08:03:06 819

原创 编译Go应用的黑盒挑战:无源码只有.a文件,你能搞定吗?

上周末,一个Gopher在微信上与我交流了一个有关Go程序编译的问题。他的述求说起来也不复杂,那就是合作公司提供的API包仅包括golang archive(使用go build -buildmode=archive构建的.a文件),没有Go包的源码。如何将这个.a链接到项目构建出的最终可执行程序中呢?对于C、C++、Java程序员来说,仅提供静态链接库或动态链接库[1](包括头文件)、jar包而...

2023-08-31 08:01:59 108

转载 付费搞来的!知乎内部AI学习资源,本号粉丝限时免费!

近几年AI发展迅猛,行业巨头争先布局AI领域!想切入大热的AI领域,却找不到方向?为了帮助大家零成本学习AI大模型技术,特邀一线大佬发起——AI大模型公开课!????AI大模型进阶之旅!直播时间8月31日晚20:00直播内容大模型的发展历程与训练方法解析AI技术应用场景如何用LangChain、Fine-tuning 定制你的专属大模型应用借助大模型技术提高收入的可能性……直播方式2天直播+直播互动...

2023-08-30 08:00:27 325 1

原创 Go 1.21中值得关注的几个变化

美国时间2023年8月8日,Go团队在Go官博上正式发布了1.21版本[2]!早在今年4月末,我就撰写了文章《Go 1.21新特性前瞻[3]》,对Go 1.21可能引入的新特性、新优化和新标准库包做了粗略梳理。在6月初举办的GopherChina 2023大会上[4],我又以“The State Of Go 2023”为题目给大家分享了Go 1.21版本的当前状态:那么以上分享的内容在Go 1.2...

2023-08-21 08:00:39 776

转载 (待会删)yyds!疯传全网的AI资源,请低调使用!

随着ChatGPT的火热出圈,AI大模型在全球掀起一轮开发浪潮!Google、百度、腾讯等各个科技公司,都在高薪挖掘AI大模型人才!AI大热,这一次,你仍然在迷茫中观望吗?大多数程序员——不熟悉AI领域发展,找不到自己的职业坐标;想要入手系统学习 AI,算法基础还并不扎实,模型背后的数学原理没有太深的了解……????如何深入了解AI发展趋势????如何用LangChain定制你的专属大模型应用????如何借助...

2023-08-16 08:02:09 67

原创 Go项目初始化不再困扰你:gonew全方位解析

近日,Go官博介绍了一个名为gonew的新工具[1]。该工具支持基于go project template clone并创建一个属于你的Go项目。gonew工具的引入大幅简化了Go项目的创建,同时由于对自定义项目模板的支持,也可以提高Go项目的标准化水平。gonew工具刚刚被放入Go工具项目代码仓库[2],目前还处于实验阶段,后续可能会增加新特性,但当前的核心特性(core functionali...

2023-08-12 08:00:36 295

原创 Gopher Daily改版了

已经记不得GopherDaily是何时创建的了,翻了一下GopherDaily项目[1]的commit history,才发现我的这个个人项目是2019年9月创建的,最初内容组织很粗糙[2],但我的编辑制作的热情很高,基本能坚持每日一发,甚至节假日也不停刊:该项目的初衷就是为广大Gopher带来新鲜度较高的Go语言技术资料。项目创建以来得到了很多Gopher的支持,甚至经常收到催刊邮件/私信以及主...

2023-08-06 21:06:57 161

BigPIM

BigPIM是一款个人信息管理软件,类似著名的Winpim,目前还有一些功能尚未完成而且还存在许多bug.

2006-03-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除