<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>后端开发 on PlumePHP</title><link>https://plumephp.com/tags/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/</link><description>Recent content in 后端开发 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 15 Nov 2024 10:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 项目实战：从零构建完整的 Web 应用</title><link>https://plumephp.com/90-fullstack-project/</link><pubDate>Fri, 15 Nov 2024 10:00:00 +0800</pubDate><guid>https://plumephp.com/90-fullstack-project/</guid><description>&lt;h2 id="go-项目实战从零构建完整的-web-应用"&gt;Go 项目实战：从零构建完整的 Web 应用&lt;/h2&gt;
&lt;p&gt;学了这么多 Go 的理论和零散的知识点，是时候来一个完整的项目实战了。今天，我们将从零开始构建一个真实的项目——&lt;strong&gt;在线任务管理系统（TaskMaster）&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Go 与区块链：从概念到实现</title><link>https://plumephp.com/89-blockchain-basics/</link><pubDate>Mon, 30 Sep 2024 12:00:00 +0800</pubDate><guid>https://plumephp.com/89-blockchain-basics/</guid><description>&lt;h2 id="go-与区块链从概念到实现"&gt;Go 与区块链：从概念到实现&lt;/h2&gt;
&lt;p&gt;区块链，这个听起来很神秘的技术，其实核心思想非常简单：&lt;strong&gt;去中心化的、不可篡改的数据账本&lt;/strong&gt;。你可能听说过比特币、以太坊，但你知道区块链的底层原理吗？&lt;/p&gt;</description></item><item><title>Go GC 调优实战：从理论到实践</title><link>https://plumephp.com/88-gc-tuning/</link><pubDate>Sun, 25 Aug 2024 15:40:00 +0800</pubDate><guid>https://plumephp.com/88-gc-tuning/</guid><description>&lt;h2 id="go-gc-调优实战从理论到实践"&gt;Go GC 调优实战：从理论到实践&lt;/h2&gt;
&lt;p&gt;你有没有遇到过这样的场景：你的 Go 服务跑着跑着，CPU 突然飙高，响应延迟抖动明显，过了几十毫秒又恢复正常？恭喜你，你遇到了 GC pause。&lt;/p&gt;</description></item><item><title>2023 年 Go 语言年度回顾与展望</title><link>https://plumephp.com/80-go-2023-recap/</link><pubDate>Wed, 20 Dec 2023 10:00:00 +0800</pubDate><guid>https://plumephp.com/80-go-2023-recap/</guid><description>&lt;h2 id="2023-年-go-语言年度回顾与展望"&gt;2023 年 Go 语言年度回顾与展望&lt;/h2&gt;
&lt;p&gt;2023 年是 Go 语言发展历程中非常重要的一年。从 2009 年开源至今，Go 已经走过了 14 个年头。这一年，Go 发布了两个重要版本（1.20 和 1.21），生态系统持续壮大，社区活跃度再创新高。&lt;/p&gt;</description></item><item><title>Go 安全编程：防范常见漏洞</title><link>https://plumephp.com/79-go-security-best-practices/</link><pubDate>Thu, 12 Oct 2023 15:40:00 +0800</pubDate><guid>https://plumephp.com/79-go-security-best-practices/</guid><description>&lt;h2 id="go-安全编程防范常见漏洞"&gt;Go 安全编程：防范常见漏洞&lt;/h2&gt;
&lt;p&gt;安全是软件开发中最容易被忽视，却又最重要的环节。你可能写出功能完美、性能卓越的代码，但只要一个安全漏洞，就可能让整个系统崩溃，甚至导致用户数据泄露。&lt;/p&gt;</description></item><item><title>Go 项目结构：构建可维护的大型项目</title><link>https://plumephp.com/78-go-project-structure/</link><pubDate>Tue, 25 Jul 2023 13:15:00 +0800</pubDate><guid>https://plumephp.com/78-go-project-structure/</guid><description>&lt;h2 id="go-项目结构构建可维护的大型项目"&gt;Go 项目结构：构建可维护的大型项目&lt;/h2&gt;
&lt;p&gt;你是否遇到过这样的场景：打开一个 Go 项目，看到所有代码都堆在 &lt;code&gt;main.go&lt;/code&gt; 里，或者目录结构混乱得像一盘意大利面？随着项目规模增长，这种混乱的结构会让你每次修改代码都像是在拆炸弹——稍有不慎就会引发连锁反应。&lt;/p&gt;</description></item><item><title>Go 1.21 泛型增强：cmp 包与内置 min/max</title><link>https://plumephp.com/74-go-1-21-generics-improvements/</link><pubDate>Thu, 15 Jun 2023 09:30:00 +0800</pubDate><guid>https://plumephp.com/74-go-1-21-generics-improvements/</guid><description>&lt;h2 id="go-121-泛型增强cmp-包与内置-minmax"&gt;Go 1.21 泛型增强：cmp 包与内置 min/max&lt;/h2&gt;
&lt;p&gt;Go 1.18 引入泛型后，社区反响热烈，但也伴随着一些疑问：&amp;ldquo;泛型是好东西，但标准库什么时候能用上？&amp;rdquo;&lt;/p&gt;</description></item><item><title>Go 1.21 slog：标准库的结构化日志</title><link>https://plumephp.com/72-go-1-21-slog/</link><pubDate>Fri, 10 Mar 2023 10:45:00 +0800</pubDate><guid>https://plumephp.com/72-go-1-21-slog/</guid><description>&lt;h2 id="go-121-slog标准库的结构化日志"&gt;Go 1.21 slog：标准库的结构化日志&lt;/h2&gt;
&lt;p&gt;日志，是每个后端工程师绕不开的话题。你可能用过 &lt;code&gt;logrus&lt;/code&gt;、&lt;code&gt;zap&lt;/code&gt;、&lt;code&gt;zerolog&lt;/code&gt; 这些第三方库，也可能还在用标准库的 &lt;code&gt;log&lt;/code&gt; 包拼接字符串。不管怎样，Go 1.21 给你带来了一个&amp;quot;迟到但正确&amp;quot;的礼物——&lt;strong&gt;&lt;code&gt;log/slog&lt;/code&gt;&lt;/strong&gt; 包。&lt;/p&gt;</description></item><item><title>错误处理的高级技巧：从基础到企业级</title><link>https://plumephp.com/70-advanced-error-handling/</link><pubDate>Thu, 15 Dec 2022 13:40:00 +0800</pubDate><guid>https://plumephp.com/70-advanced-error-handling/</guid><description>&lt;h2 id="错误处理的高级技巧从基础到企业级"&gt;错误处理的高级技巧：从基础到企业级&lt;/h2&gt;
&lt;p&gt;Go 的错误处理以其简洁性著称，但简洁不等于简单。在实际项目中，我们需要处理复杂的错误场景：错误包装、错误链、错误分类、错误监控等。&lt;/p&gt;
&lt;p&gt;本文将带你从基础的错误处理进阶到企业级的错误处理策略。&lt;/p&gt;</description></item><item><title>原子操作：无锁并发编程的艺术</title><link>https://plumephp.com/66-atomic-operations/</link><pubDate>Sat, 18 Jun 2022 14:30:00 +0800</pubDate><guid>https://plumephp.com/66-atomic-operations/</guid><description>&lt;h2 id="原子操作无锁并发编程的艺术"&gt;原子操作：无锁并发编程的艺术&lt;/h2&gt;
&lt;p&gt;在并发编程中，我们经常需要保护共享数据。传统的做法是使用互斥锁（mutex），但锁会带来性能开销和死锁风险。&lt;strong&gt;原子操作&lt;/strong&gt;提供了一种无锁的替代方案，在某些场景下性能更优。&lt;/p&gt;</description></item><item><title>性能分析实战：pprof 从入门到精通</title><link>https://plumephp.com/67-pprof-practice/</link><pubDate>Fri, 25 Mar 2022 14:30:00 +0800</pubDate><guid>https://plumephp.com/67-pprof-practice/</guid><description>&lt;h2 id="性能分析实战pprof-从入门到精通"&gt;性能分析实战：pprof 从入门到精通&lt;/h2&gt;
&lt;p&gt;当你的 Go 程序运行缓慢或内存占用过高时，你需要一个强大的工具来找出问题所在。&lt;code&gt;pprof&lt;/code&gt; 是 Go 标准库提供的性能分析工具，它能帮你精确定位 CPU、内存、Goroutine 等性能瓶颈。&lt;/p&gt;</description></item><item><title>Go 1.18 Fuzz 测试：发现隐藏 Bug 的利器</title><link>https://plumephp.com/63-fuzz-testing/</link><pubDate>Fri, 25 Mar 2022 09:20:00 +0800</pubDate><guid>https://plumephp.com/63-fuzz-testing/</guid><description>&lt;h2 id="go-118-fuzz-测试发现隐藏-bug-的利器"&gt;Go 1.18 Fuzz 测试：发现隐藏 Bug 的利器&lt;/h2&gt;
&lt;p&gt;Go 1.18 引入了一个令人兴奋的新特性：&lt;strong&gt;Fuzz 测试&lt;/strong&gt;（模糊测试）。这是一种自动化的软件测试技术，通过生成大量随机输入来发现程序中的隐藏 Bug。&lt;/p&gt;</description></item><item><title>分布式追踪：跨服务调用链路分析</title><link>https://plumephp.com/59-distributed-tracing/</link><pubDate>Wed, 26 May 2021 16:30:00 +0800</pubDate><guid>https://plumephp.com/59-distributed-tracing/</guid><description>&lt;h2 id="分布式追踪跨服务调用链路分析"&gt;分布式追踪：跨服务调用链路分析&lt;/h2&gt;
&lt;p&gt;在微服务架构中，一个用户请求可能经过多个服务。当出现问题时，如何快速定位是哪个环节出了问题？分布式追踪就是解决这个问题的利器。&lt;/p&gt;
&lt;p&gt;本文将介绍如何使用 OpenTelemetry 实现分布式追踪。&lt;/p&gt;</description></item><item><title>Redis 集成：高性能缓存与数据存储</title><link>https://plumephp.com/55-redis-integration/</link><pubDate>Fri, 14 May 2021 16:20:00 +0800</pubDate><guid>https://plumephp.com/55-redis-integration/</guid><description>&lt;h2 id="redis-集成高性能缓存与数据存储"&gt;Redis 集成：高性能缓存与数据存储&lt;/h2&gt;
&lt;p&gt;Redis 是一个高性能的内存数据库，广泛用于缓存、会话存储、消息队列等场景。在 Go 应用中集成 Redis，可以显著提升系统性能和响应速度。&lt;/p&gt;</description></item><item><title>JWT 身份验证：构建安全的 API 认证系统</title><link>https://plumephp.com/54-jwt-authentication/</link><pubDate>Tue, 11 May 2021 13:45:00 +0800</pubDate><guid>https://plumephp.com/54-jwt-authentication/</guid><description>&lt;h2 id="jwt-身份验证构建安全的-api-认证系统"&gt;JWT 身份验证：构建安全的 API 认证系统&lt;/h2&gt;
&lt;p&gt;在构建现代 Web API 时，身份验证是不可或缺的一环。传统的 Session 认证方式在分布式系统中面临诸多挑战，而 JWT（JSON Web Token）提供了一种优雅、无状态的解决方案。&lt;/p&gt;</description></item><item><title>WebSocket 实时通信：构建交互式应用</title><link>https://plumephp.com/53-websocket-realtime/</link><pubDate>Sat, 08 May 2021 10:30:00 +0800</pubDate><guid>https://plumephp.com/53-websocket-realtime/</guid><description>&lt;h2 id="websocket-实时通信构建交互式应用"&gt;WebSocket 实时通信：构建交互式应用&lt;/h2&gt;
&lt;p&gt;传统的 HTTP 请求-响应模型无法满足实时应用的需求。想象一下聊天室、股票行情、在线游戏这些场景，客户端需要即时收到服务器的消息，而不是不断轮询。&lt;/p&gt;</description></item><item><title>RESTful API 设计：构建优雅的 Web 接口</title><link>https://plumephp.com/52-restful-api-design/</link><pubDate>Wed, 05 May 2021 14:20:00 +0800</pubDate><guid>https://plumephp.com/52-restful-api-design/</guid><description>&lt;h2 id="restful-api-设计构建优雅的-web-接口"&gt;RESTful API 设计：构建优雅的 Web 接口&lt;/h2&gt;
&lt;p&gt;在当今的软件开发中，API（应用程序接口）已经成为连接不同系统和服务的桥梁。RESTful API 因其简单性、灵活性和可扩展性，成为了最流行的 API 设计风格之一。&lt;/p&gt;</description></item><item><title>项目架构：构建可维护的 Go 应用</title><link>https://plumephp.com/go-project-architecture/</link><pubDate>Wed, 28 Apr 2021 10:50:00 +0800</pubDate><guid>https://plumephp.com/go-project-architecture/</guid><description>&lt;h2 id="项目架构构建可维护的-go-应用"&gt;项目架构：构建可维护的 Go 应用&lt;/h2&gt;
&lt;p&gt;当你的 Go 项目从几十行代码的小工具，成长为成千上万行代码的大型应用时，一个清晰的项目架构就变得至关重要了。&lt;/p&gt;
&lt;p&gt;好的架构能让代码：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;易于理解&lt;/strong&gt;：新人能快速找到相关代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于测试&lt;/strong&gt;：各层职责清晰，便于单元测试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于维护&lt;/strong&gt;：修改一处不会影响其他部分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于扩展&lt;/strong&gt;：新功能可以无缝集成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今天我们就来学习如何设计和组织一个可维护的 Go 项目。&lt;/p&gt;</description></item><item><title>Go 最佳实践：写出优雅的 Go 代码</title><link>https://plumephp.com/50-best-practices/</link><pubDate>Mon, 26 Apr 2021 16:10:00 +0800</pubDate><guid>https://plumephp.com/50-best-practices/</guid><description>&lt;h2 id="go-最佳实践写出优雅的-go-代码"&gt;Go 最佳实践：写出优雅的 Go 代码&lt;/h2&gt;
&lt;p&gt;学习一门语言不仅仅是掌握语法，更重要的是理解这门语言的设计哲学和最佳实践。Go 语言有其独特的风格和约定，遵循这些实践能帮你写出更清晰、更健壮、更易维护的代码。&lt;/p&gt;</description></item><item><title>设计模式：Go 语言中的实践</title><link>https://plumephp.com/go-design-patterns/</link><pubDate>Sun, 25 Apr 2021 14:28:00 +0800</pubDate><guid>https://plumephp.com/go-design-patterns/</guid><description>&lt;h2 id="设计模式go-语言中的实践"&gt;设计模式：Go 语言中的实践&lt;/h2&gt;
&lt;p&gt;设计模式是软件开发中经过验证的解决方案。它们不是具体的代码，而是一种思路，帮助你解决特定场景下的常见问题。&lt;/p&gt;
&lt;p&gt;但是，不同的语言有不同的特性，设计模式的实现方式也会有所不同。Go 语言没有类、继承、泛型（1.18 之前），这让很多传统的面向对象设计模式需要&amp;quot;Go 化&amp;quot;。&lt;/p&gt;</description></item><item><title>缓存：让应用飞起来</title><link>https://plumephp.com/go-cache/</link><pubDate>Fri, 16 Apr 2021 13:40:00 +0800</pubDate><guid>https://plumephp.com/go-cache/</guid><description>&lt;h2 id="缓存让应用飞起来"&gt;缓存：让应用飞起来&lt;/h2&gt;
&lt;p&gt;缓存是提升系统性能最有效的手段之一。当你的应用频繁访问数据库、调用远程 API 或执行复杂的计算时，缓存可以显著减少响应时间和系统负载。&lt;/p&gt;
&lt;p&gt;Go 提供了多种缓存方案：从简单的内存缓存到强大的分布式缓存（如 Redis）。今天我们就来学习如何在 Go 中实现和使用缓存。&lt;/p&gt;</description></item><item><title>配置管理：让你的应用更灵活</title><link>https://plumephp.com/go-configuration-management/</link><pubDate>Tue, 13 Apr 2021 11:18:00 +0800</pubDate><guid>https://plumephp.com/go-configuration-management/</guid><description>&lt;h2 id="配置管理让你的应用更灵活"&gt;配置管理：让你的应用更灵活&lt;/h2&gt;
&lt;p&gt;写代码时，你一定遇到过这样的场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开发环境用本地数据库，生产环境用云数据库，难道要改代码？&lt;/li&gt;
&lt;li&gt;API 密钥、数据库密码这些敏感信息能硬编码在代码里吗？&lt;/li&gt;
&lt;li&gt;修改一个配置就要重新编译部署吗？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些问题的答案都是——&lt;strong&gt;配置管理&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>加密与安全：让你的 Go 程序固若金汤</title><link>https://plumephp.com/go-crypto-and-security/</link><pubDate>Mon, 05 Apr 2021 14:22:00 +0800</pubDate><guid>https://plumephp.com/go-crypto-and-security/</guid><description>&lt;h2 id="加密与安全让你的-go-程序固若金汤"&gt;加密与安全：让你的 Go 程序固若金汤&lt;/h2&gt;
&lt;p&gt;安全不是事后补救，而是从一开始就应该考虑的事情。&lt;/p&gt;
&lt;p&gt;当你存储用户密码时，你有没有想过：如果数据库泄露了，用户的密码会不会被直接看到？当你传输敏感数据时，你有没有想过：中间人会不会窃听你的通信？当用户登录时，你有没有想过：怎么确保这个请求真的来自他本人？&lt;/p&gt;</description></item><item><title>字符串处理：那些被忽略的细节</title><link>https://plumephp.com/go-string-processing/</link><pubDate>Fri, 02 Apr 2021 09:38:00 +0800</pubDate><guid>https://plumephp.com/go-string-processing/</guid><description>&lt;h2 id="字符串处理那些被忽略的细节"&gt;字符串处理：那些被忽略的细节&lt;/h2&gt;
&lt;p&gt;你可能觉得字符串处理是编程中最简单的事情——不就是拼拼字符串、查查子串、做个替换嘛。直到你遇到中文乱码、emoji 长度不对、URL 编码错误这些坑，才会意识到：字符串处理远没有看起来那么简单。&lt;/p&gt;</description></item><item><title>HTTP 编程：用 Go 构建 Web 服务</title><link>https://plumephp.com/go-http-programming/</link><pubDate>Thu, 18 Feb 2021 10:50:00 +0800</pubDate><guid>https://plumephp.com/go-http-programming/</guid><description>&lt;h2 id="http-编程用-go-构建-web-服务"&gt;HTTP 编程：用 Go 构建 Web 服务&lt;/h2&gt;
&lt;p&gt;如果你要问&amp;quot;用 Go 能做什么&amp;quot;，最常见的答案之一就是——&lt;strong&gt;Web 服务&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Go 的标准库 &lt;code&gt;net/http&lt;/code&gt; 提供了强大的 HTTP 客户端和服务器实现。你不需要依赖任何第三方框架，就能构建出生产级的 Web 应用。事实上，很多知名的 Go Web 框架（如 Gin、Echo）底层都是基于标准库实现的。&lt;/p&gt;</description></item><item><title>错误处理：Go 为什么不用 try-catch？</title><link>https://plumephp.com/go-error-handling/</link><pubDate>Fri, 28 Feb 2020 14:07:00 +0800</pubDate><guid>https://plumephp.com/go-error-handling/</guid><description>&lt;h2 id="错误处理go-为什么不用-try-catch"&gt;错误处理：Go 为什么不用 try-catch？&lt;/h2&gt;
&lt;p&gt;如果你来自 Java、Python 或 C# 的世界，第一次看到 Go 的错误处理代码时，你大概会皱眉头：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;result2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;doSomethingElse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;result3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;doAnotherThing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;ldquo;这什么鬼？&lt;code&gt;if err != nil&lt;/code&gt; 写了一遍又一遍，也太啰嗦了吧？try-catch 不好吗？&amp;rdquo;&lt;/p&gt;</description></item><item><title>结构体与方法：Go 的''面向对象''之路</title><link>https://plumephp.com/go-structs-and-methods/</link><pubDate>Sat, 22 Feb 2020 09:38:00 +0800</pubDate><guid>https://plumephp.com/go-structs-and-methods/</guid><description>&lt;h2 id="结构体与方法go-的面向对象之路"&gt;结构体与方法：Go 的&amp;quot;面向对象&amp;quot;之路&lt;/h2&gt;
&lt;p&gt;到目前为止，我们已经学了 Go 的基本数据类型、切片、map、指针。但如果你要描述一个更复杂的事物——比如一个&amp;quot;用户&amp;quot;，他有姓名、年龄、邮箱、注册时间等多个属性——用基本类型就不够用了。&lt;/p&gt;</description></item></channel></rss>