使用go来编写graphql服务

本文为 文章 Go GraphQL Go!!! A beginner’s guide to GraphQL in Go using Ent. 的翻译。大部分使用机翻,部分内容作了相应调整。原文地址为 https://psj.codes/go-graphql-go 您是否想知道计算机和应用程序如何相互通信以获取信息?嗯,他们使用一种称为 API 的东西,它代表应用程序编程接口。 API 充当桥梁,允许不同的软件系统相互通信并交换数据。 在互联网的早期,构建 API 具有挑战性。开发人员必须以一种对每个使用它们的人都有意义的方式进行设计。这就像试图从调酒师那里点一杯饮料,而调酒师的菜单很复杂,有太多的选择。您通常会得到比您需要的更多或不够的信息,例如订购一杯简单的橙汁并收到整个水果篮!这给开发人员带来了挫败感并浪费了时间,他们必须筛选不必要的数据或发出多个请求才能获得他们想要的东西。想象一下,您必须向调酒师要一杯饮料,但您收到的不是简单的订单,而是完整的饮料目录!更糟糕的是,传统 API(称为 REST API)依赖大量端点。这些端点充当访问数据不同部分的特定路径。这就像一个迷宫,里面有无数扇门需要穿过。但随后,改变游戏规则的事情发生了。 Facebook 在 2012 年推出了 GraphQL,这是一种构建 API 的革命性方法,彻底扭转了局面。借助 GraphQL,开发人员终于告别了数据过度获取和数据获取不足的麻烦。快进到 2015 年,Facebook 开源了 GraphQL,并于 2018 年将 GraphQL 捐赠给了 Linux 基金会。 GraphQL 是一种 API 查询语言,或者有人可能会说它是开发 API 的新标准。 在本博客中,我们将探讨 GraphQL 如何应对传统 REST API 面临的挑战。我们还将踏上在 Go 中构建 GraphQL 服务器的实践之旅,为了使我们的开发过程更加令人兴奋和高效,我们将利用 Ent 的强大功能,这是一个专为 Go 设计的令人惊叹的实体库。 GraphQL 救世主 在简介中,我们提到了 RESTful API 的问题。让我们尝试理解它们并研究 GraphQL 如何解决它们。...

golang并发二三事

本文主要是鸟窝《深入理解go并发编程》中的读书速记以及一些并发库的使用例子集合 常用的并发库使用 sourcegraph conc waitgroup 创建一组协程并等待完成: 标准库 func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() // crashes on panic! doSomething() }() } wg.Wait() } conc func main() { var wg conc.WaitGroup for i := 0; i < 10; i++ { wg.Go(doSomething) } wg.Wait() } 下面是一个官网博客的例子: 写一个函数,给定用户的名字,通过网络获取姓氏 func fetchLastName(ctx context.Context, firstName string) (string, error) { req, err := http....

使用uber cff进行并发编程

第一个项目 配置相关工具 先决条件 Go 1.18 或更新版本 带有 go.mod 文件的项目 大多数go项目应采取以下步骤建立 cff。 如果项目目录中还没有 “tools.go”,请在其中创建一个。您将在此指定开发时的依赖关系。 cat > tools.go <<EOF //go:build tools package tools // use your project's package name here EOF 确保使用与项目目录相同的软件包名称。 将 import _ "go.uber.org/cff/cmd/cff" 添加到 tools.go 中。 echo 'import _ "go.uber.org/cff/cmd/cff"' >> tools.go 运行 go mod tidy 获取最新版本的 cff,或运行 go get go.uber.org/cff@main 获取当前未发布的分支。 go mod tidy 将 cff CLI 安装到项目的 bin/ 子目录下。 GOBIN=$(pwd)/bin go install go.uber.org/cff/cmd/cff 请随意 gitignore 此目录。 echo '/bin' >> ....

使用uber-go的fx进行依赖注入

入门 下面是一个官方的例子: package main import ( "context" "fmt" "go.uber.org/fx" "io" "net" "net/http" "os" ) func main() { fx.New( fx.Provide( NewHTTPServer, NewEchoHandler, NewServeMux, ), fx.Invoke(func(srv *http.Server) {}), ).Run() } func NewHTTPServer(lc fx.Lifecycle, mux *http.ServeMux) *http.Server { srv := &http.Server{ Addr: ":8080", Handler: mux, } lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { ln, err := net.Listen("tcp", srv.Addr) if err != nil { return err } fmt.Println("Starting HTTP server at", srv.Addr) go srv.Serve(ln) return nil }, OnStop: func(ctx context....

Golang测试参考  [draft]

常规测试 性能测试 单元测试 模糊测试 原生测试包 httptest iotest 故障测试 failpoints Failpoints 是一种在代码中注入错误或其他行为的工具,主要用于测试。当Failpoints被配置为激活状态时,对应的代码片段才会被执行。它可以模拟各种复杂系统中的错误处理,以提高它们的容错性和稳定性。 例如,你可以在开发和调试应用程序时使用 Failpoints 使程序在特定时刻进行错误处理或表现出异常行为。最常见的使用场景是模拟网络延迟、磁盘损坏等异常情况,以测试应用程序对这些异常的处理能力。 Failpoints 也可以用于优化代码。在一些情况下,当有多个 guard 语句时,Failpoints 可以将这些不必要的代码提供给全部内联,使代码更符合 DRY(Don’t Repeat Yourself) 原则。 相关链接: Pingcap/failpoint etcd-io/gofail Mock测试 GoMock gomock是官方的mock生成工具,能够很好地和go test 框架集成。mock代码的生成基于mockgen。 安装mockgen Go 版本< 1.16 GO111MODULE=on go get github.com/golang/mock/mockgen@v1.6.0 Go版本 1.16+ go install github.com/golang/mock/mockgen@latest 使用 GoMock支持两种Mock模式:源码模式和反射模式。完整的参数列表说明如下: 若给定一个 Go 源文件,其中包含要被模拟的接口,则使用 modgen 命令为模拟类生成源代码。它支持以下参数: source: 包含要模拟的接口的文件。 destination: 一个文件,用于编写源代码。如果不设置此选项,代码将打印到标准输出。 package: 用于生成模拟类源代码的包。如果您没有设置它,那么包的名称就是 mock _ concatedwith 输入文件的包。 import: 应该在生成的源代码中使用的显式导入列表,指定为以逗号分隔的 foo = bar/baz 格式的元素列表,其中 bar/baz 是被导入的包,foo 是生成的源代码中用于包的标识符。...

Golang命令行库bubbletea使用备忘  [draft]

核心概念 Model model是bubbletea的核心接口,定义如下: type Model interface { Init() Cmd Update(msg Msg) (Model, Cmd) View() string } Command 参考资料 Rapidly building interactive CLIs in Go with Bubbletea Intro to Bubble Tea in Go Processing user input in Bubble Tea with a menu component

12 个改变我生产力的个人go技巧【译】

原文链接https://dev.to/func25/12-personal-go-tricks-that-transformed-my-productivity-mne 作者 我通常在 Devtrovert 分享有关系统设计和 Go 的见解。请随时查看我的 LinkedIn Phuong Le 以获取最新帖子。 在从事生产项目时,我注意到我经常重复代码并利用某些技术,直到后来回顾我的工作时才意识到这一点。 为了解决这个问题,我开发了一个解决方案,事实证明它对我很有帮助,而且我认为它对其他人也可能有用。 下面是从我的实用程序库中随机挑选的一些有用且通用的代码片段,没有任何特定的分类或特定于系统的技巧。 1.跟踪使用时间的技巧 如果您有兴趣跟踪 Go 中函数的执行时间,您可以使用一个简单而有效的技巧,只需使用“defer”关键字的一行代码即可。您所需要的只是一个 TrackTime 函数: // Utility func TrackTime(pre time.Time) time.Duration { elapsed := time.Since(pre) fmt.Println("elapsed:", elapsed) return elapsed } func TestTrackTime(t *testing.T) { defer TrackTime(time.Now()) // <--- THIS time.Sleep(500 * time.Millisecond) } // elapsed: 501.11125ms 1.5.两阶段延迟 Go 延迟的强大之处不仅在于任务完成后的清理工作,还在于任务完成后的清理工作。这也是为了做好准备,请考虑以下事项: func setupTeardown() func() { fmt.Println("Run initialization") return func() { fmt.Println("Run cleanup") } } func main() { defer setupTeardown()() // <-------- fmt....

go泛型备忘录【译】

原文 https://gosamples.dev/generics-cheatsheet/ 入门 泛型发布 Go 中的泛型自 2022 年 3 月 15 日发布的 1.18 版本起可用。 泛型函数 使用泛型,您可以创建以类型作为参数的函数。而不是为每种类型编写单独的函数,例如: func LastInt(s []int) int { return s[len(s)-1] } func LastString(s []string) string { return s[len(s)-1] } // etc. 您可以编写带有类型参数的函数: func Last[T any](s []T) T { return s[len(s)-1] } 类型参数在方括号中声明。它们描述了给定函数允许的类型: 泛型函数调用 您可以像调用任何其他函数一样调用通用函数: func main() { data := []int{1, 2, 3} fmt.Println(Last(data)) data2 := []string{"a", "b", "c"} fmt.Println(Last(data2)) } 您不必像下面的示例那样显式声明类型参数,因为它是根据传递的参数推断的。此功能称为类型推断,仅适用于函数。 func main() { data := []int{1, 2, 3} fmt....

Go 中的 Redis 缓存:初学者指南【译】

原文链接:https://betterstack.com/community/guides/scaling-go/redis-caching-golang/ 使用Google机翻 Redis 是一种通用的内存数据存储,通常用于缓存、会话管理、发布/订阅等。它的灵活性和广泛的用例使其成为个人和商业项目的热门选择。 本文将提供关于使用 Redis 作为 Go 程序缓存的可访问介绍,探索其最流行的应用程序。您将学习如何在 Go 应用程序中连接到 Redis 服务器并执行基本的数据库操作,利用其功能来提高性能并减少数据库负载。 让我们开始吧! 先决条件 要按照本文进行操作,请确保您的计算机上安装了最新版本的 Go。如果您缺少 Go,可以在此处找到安装说明。 步骤 1 — 安装和配置 Redis 请按照此处的说明为您的操作系统安装最新的 Redis 稳定版本(撰写本文时为 v7.x)。 redis-server --version 输出 Redis server v=7.0.12 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=d706905cc5f560c1 安装后,通过执行以下命令确认 Redis 正在运行: sudo systemctl status redis 输出 ● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2023-08-09 08:23:32 UTC; 5min ago Docs: http://redis....

Golang编译进阶【译】

本文翻译自 https://dev.to/jacktt/go-build-in-advance-4o8n I/构建选项 以下是 go build 命令最常用的一些选项: -o :指定输出文件名。默认输出文件名是主包的名称,Windows 上添加 .exe 后缀。 -v :详细输出。此选项在编译包时打印包的名称。 -work :打印临时工作目录的名称,退出时不删除。该选项对于调试很有用。 -x :打印命令。此选项打印 go build 命令正在执行的命令。 -asmflags :传递给 go tool asm 调用的参数。 -buildmode :要使用的构建模式。默认构建模式是 exe 。其他可能的值有 shared 、 pie 和 plugin 。 -buildvcs :是否使用版本控制信息标记二进制文件。默认值为 auto 。 有关 go build 命令的更多信息,您可以运行以下命令: go help build II/ 将包含哪些文件 当您在 Go 中使用 go build 命令时,它会编译当前目录及其子目录中的 Go 源文件以创建可执行二进制文件。默认情况下,Go 只编译 .go 文件,忽略目录中的其他类型的文件。然而,值得注意的是 go build 命令的行为可能会受到构建标签、构建约束的影响。 go build 通常会忽略以下类型的文件: 1. 具有非 ....