• Go GraphQL 入门指南 - 第二部分

    ___注意___:关于 GraphQL 的系列教程的第一部分可以在这里:[Go GraphQL 入门指南 - Part 1](https://studygolang.com/articles/18801) 阅读。 首先,再次欢迎各位 Gophers !在本篇教程中,我们将在上一篇教程中所做的工作基础上进行扩展,了解变更 (Mutation) 的概念,并在 GraphQL API 后端实现合适的数据源。 在上篇教程中,我们了解到 GraphQL 的一些主要的优点,以及它是如何在应用程序...

  • Go GraphQL 入门指南

    欢迎各位 Gophers !在本教程中,我们将探索如何使用 Go 和 GraphQL 服务进行交互。在本教程完结之时,我们希望你可以了解到以下内容: - GraphQL 的基础知识 - 使用 Go 构建一个简易的 GraphQL 服务 - 基于 GraphQL 执行一些基本的查询 在本篇教程中,我们会专注于 GraphQL 在数据检索方面的内容,我们将会使用内存数据源来存储其数据。同时,本篇教程的内容将会为我们之后的教程提供一个良好的基础。 ## GraphQL 的基础知识...

  • 接口和反射的关系

    接口是 Go 中用于抽象的基本工具之一。接口在值进行分配的时候存储类型信息。反射则是在运行时检查类型和值的方法。 Go 通过 `reflect` 包实现了反射。该包提供了一些类型和方法用于检查接口结构部分,不仅如此,它还可以在运行时进行值的修改。 在这篇文章中,我希望能说明接口结构的各部分和反射 API 之间的关系,并最终使得反射包变得更加容易理解。 ## 向一个接口分配一个值 一个接口编码了三件事:值,方法集,以及所存储的值的类型。 下图展示了一个接口的内部结构。...

  • SRE: 调试 Go 中简单的内存泄漏

    [内存泄漏](https://en.wikipedia.org/wiki/Memory_leak) 是一种即使当某块内存不再使用之后仍然没有被释放而产生的 bug。通常来说,它们是非常明显的,高度可见的,这使得它们成为学习程序调试的最佳选择。Go 是一门特别适合识别定位内存泄漏的语言,因为它有一套强大的工具链,这套工具链配备了非常强大的工具(*pprof*),它可以非常轻松地查明内存的使用情况。 我希望这篇文章能够演示如何直观地识别内存,并将其使用范围缩小至特定的进程内,将进程的泄漏与我们...

  • 深入理解 fmt 包

    我们经常会使用 `fmt` 包,但是却没有思考过它的实现。我们会在这里使用一个 `fmt.Printf`,又会在那里使用一个 `fmt.Sprintf`。但是,如果你仔细研究下这个包,你会发现很多有趣有用的东西。 由于 Go 在大多数情况下会用来编写服务器或服务程序,我们主要的调试工具就是日志系统。`log` 包提供的 `log.Printf` 函数有和 `fmt.Printf` 相同的语义。 良好且信息丰富的日志消息非常重要,并且如果为你的数据结构添加一些格式化的支持将会为你的日志消息...

  • Go 中的对象的生命周期

    尽管 Go 语言很简单,Go 的开发人员仍然发现了许多创建和使用 Go 中对象的方法。在本篇博客中,我们将介绍对象管理的三步法 - ***实例化, 初始化,以及启动***。我们还会将其与其他的创建、使用对象的方法进行对比,并审查(评估)每种方法的优缺点。 ## 我们的目标 这似乎是一个愚蠢的问题,但是,我们在 Go 中创建和使用对象的目的到底是什么?为了与 Go 的风格的统一,我优先考虑了以下事项: * 足够简单 * 足够灵活 * 文档友好 除此之外,我们也应当说明哪些事情不是我们的目标...

  • GO 中的调度:第三部分 - 并发

    ## 前奏 这篇文章是三部曲系列文章中的第三篇,这个系列的文章将会对 Go 中调度器背后的机制和语义做深入的了解。本文主要关注并发的部分。 Go 调度器系列文章: - [Go 中的调度器:第一部分 - 操作系统调度器](https://studygolang.com/articles/14264) - [Go 中的调度器:第二部分 - Go 调度器](https://studygolang.com/articles/15316) - [Go 中的调度器:第三部分 - 并发]...

  • Go 中接口值的复制

    我一直在思考 Go 语言它是如何工作的。直到最近我才发现 Go 中一切都是基于值的。当我们向函数传递参数、迭代切片、执行类型断言时我们都可以看到这一现象。在这些例子中,这些数据结构所存储的值的拷贝会被返回。当我刚开始学习 Go 的时候,我对于这种实现方式很失望,但渐渐地我开始意识到这样做对于我们的代码来说有它的合理性。 我开始在想,如果我创建了一个所存储的是值而非指针的接口类型的拷贝会发生什么。那么这个新的接口值会拥有自己新的副本值,还是共享原来的值?为了验证我的猜想,我写了一个小程序来检...

  • Go 中的优雅升级

    优化升级背后的想法是在进程运行过程中,在用户无感知的情况下对程序的配置和代码进行更换(升级)。尽管这听起来很危险、容易出错、不可取,并且像是一个馊主意 - 事实上我(的想法)和你一样。 但是,有些时候你的确需要它们。这通常在一个没有负载均衡层的环境中会遇到这种问题。我们在 *Cloudfare* 也遇到了这种情况,这使得我们必须研究这类问题、并尝试、实现各类的解决方案。 ![](https://raw.githubusercontent.com/studygolang/gctt-image...