大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
欢迎golang同胞!在本教程中,我们将研究如何在基于 Go 的程序中与 GraphQL 服务器进行交互。在本教程结束时,我们应该知道如何执行以下操作:
创新互联公司主营长治网站建设的网络公司,主营网站建设方案,app软件定制开发,长治h5微信小程序开发搭建,长治网站营销推广欢迎长治等地区企业咨询
在本教程中,我们将专注于学习 GraphQL 的数据检索方面,并且我们将使用内存中的数据源来支持它。这应该为我们在后续教程的基础上建立一个良好的基础。
好的,所以在我们深入研究之前,我们应该真正了解 GraphQL 的基础知识。作为开发人员,使用它对我们有什么好处?
好吧,考虑使用每天处理数十万甚至数百万请求的系统。传统上,我们会使用位于数据库前面的系统 API,它会返回大量 JSON 响应,其中包含许多我们可能不一定需要的冗余信息。
如果我们正在处理大规模的应用程序,发送冗余数据的成本可能会很高,并且由于有效负载大小会阻塞我们的网络带宽。
GraphQL基本上可以让我们以减少噪音和描述数据,我们希望让我们的检索,从我们的API中检索 只有 我们需要为我们当前的任务/视图/不管。
这只是该技术为我们提供的众多好处的一个例子。希望在接下来的教程系列中,我们会提前看到更多这些好处。
需要注意的重要一点是,GraphQL 不像我们传统的 SQL 那样是一种查询语言。它是位于我们 API 前面的抽象, 不 依赖于任何特定的数据库或存储引擎。
这真的很酷。我们可以建立一个与现有服务商交互的 GraphQL 服务器,然后围绕着这个新的 GraphQL 服务器构建,而不必担心修改现有的 REST API。
让我们看看 RESTful 方法与 GraphQL 方法有何不同。现在,假设我们正在构建一个返回该站点上所有教程的服务,如果我们想要特定教程的信息,我们通常会创建一个 API 端点,允许我们根据 ID 检索特定教程:
如果给定一个 valid ID,这将返回一个响应,看起来像这样:
现在,假设我们想创建一个小部件,列出该作者撰写的书籍 5 个帖子。我们可以点击/author/:id端点以检索该作者撰写的所有帖子,然后进行后续调用以检索前 5 个帖子中的每一个。或者,我们可以制作一个全新的端点来为我们返回这些数据。
这两种解决方案听起来都不是特别吸引人,因为它们会创建不需要的请求量或返回过多的数据,这突出了 RESTful 方法开始出现一些裂缝的地方。
这就是 GraphQL 发挥作用的地方。使用 GraphQL,我们可以定义我们希望在查询中返回的数据的确切结构。所以如果我们想要上面的信息,我们可以创建一个看起来像这样的查询:
这将随后返回我们的教程、该教程的作者和一组表示该作者编写的教程的教程 ID,而无需发送额外的 x 多个 REST 请求来获取信息!那有多好?
好的,现在我们对 GraphQL 以及对它的用途有了更多的了解,让我们在实践中看看它。
我们将使用graphql-go/graphql实现在 Go 中创建一个简单的 GraphQL 服务器 。
让我们首先使用go mod init以下方法初始化我们的项目:
接下来,让我们创建一个名为main.go. 我们将从简单开始创建一个非常简单的 GraphQL 服务器,它具有一个非常简单的解析器:
现在,如果我们尝试运行它,让我们看看会发生什么:
所以,如果一切正常,那么我们就可以设置一个非常简单的 GraphQL 服务器并对这个服务器进行非常简单的查询。
让我们分解上面代码中发生的事情,以便我们可以进一步扩展它。在lines 14-21我们定义我们的Schema. 当我们对我们的 GraphQL API 进行查询时,我们基本上定义了我们想要返回给我们的对象上的哪些字段,因此我们必须在我们的 Schema 重新定义这些字段。
在 上line 17,我们定义了一个解析器函数,每当field请求此特定内容时就会触发该解析器函数。现在,我们只是返回字符串 "world",但我们将实现从这里查询数据库的能力。
让我们看一下main.go文件的第二部分。在line 30我们开始定义query请求领域hello。
然后我们创建一个params结构,其中包含对我们定义的Schema以及我们的RequestString请求的引用 。
最后,在line 36我们执行请求并将请求的结果填充到r. 然后我们进行一些错误处理,然后将响应编组为 JSON 并将其打印到我们的控制台上。
现在我们已经启动并运行了一个非常简单的 GraphQL 服务器,并且我们能够对其进行查询,让我们更进一步,构建一个更复杂的示例。
我们将创建一个 GraphQL 服务器,它返回一系列内存中的教程及其作者,以及对这些特定教程的任何评论。
让我们定义一些struct代表 a Tutorial、 anAuthor和 a 的's Comment:
然后我们可以创建一个非常简单的populate()函数,它将返回一个类型数组Tutorial:
这将为我们提供一个简单的教程列表,然后我们可以稍后解决。
我们将从使用 GraphQL 创建一个新对象开始graphql.NewObject()。我们将使用 GraphQL 的严格类型定义 3 种不同的类型,它们将与structs我们已经定义的 3 种相匹配。
我们的Commentstruct 可以说是最简单的,它只包含一个 string Body,所以我们可以commentType很容易地将其表示为:
接下来,我们将处理该Author结构并将其定义为一个新的 graphql.NewObject(). 这会稍微复杂一些,因为它既有一个 String字段,也有一个Int值列表,这些值代表他们编写的教程的 ID。
最后,让我们定义我们的tutorialTypewhich 将封装 an author和comment's的数组以及 anID和 a title:
现在我们已经定义了我们的Type系统,让我们着手更新我们的 Schema 以反映这些新类型。我们将定义 2 个 distinct Field,第一个将是我们的tutorial字段,它允许我们Tutorials 根据传入查询的 ID检索个人。第二个将是一个list字段,它将允许我们检索Tutorials我们在内存中定义的完整数组。
所以我们已经创建了我们的类型并更新了我们的 GraphQL 模式,我们做得还不错!
让我们尝试使用我们的新 GraphQL 服务器并处理我们提交的查询。让我们来尝试我们的list架构改变query ,我们已经在我们得到main()的功能:
让我们分解一下。所以在我们的查询中,我们有一个特殊的root对象。然后我们在其中说我们想要该list对象上的字段。在返回的名单list,我们希望看到的id,title,comments和 author。
当我们运行它时,我们应该会看到以下输出:
正如我们所见,我们的查询以 JSON 格式返回了我们所有的教程,看起来非常像我们初始查询的结构。
现在让我们尝试对我们的tutorial模式进行查询:
再一次,当我们运行它时,我们应该看到它已经成功地检索了内存中的单独教程ID=1:
完美,看起来我们已经让list我们的tutorial模式和我们的模式都按预期工作了。
这就是我们将在这个初始教程中介绍的全部内容。我们已经成功地设置了一个简单的 GraphQL 服务器,该服务器由内存数据存储支持。
在下一个教程中,我们将研究 GraphQL 突变并更改我们的数据源以使用 SQL 数据库
可以先转成json,再反序列化成定义好的结构体
也可以for循环自己处理
和有些小伙伴一样,本人是从php转到了go,从事php时使用symfony框架一直享受其丰富的功能带来的便利,转到其他语言时比较直观的感觉就是twig真强,为什么其他语言没有扩展twig呢?
虽然前后端的开发模式,让模板引擎这个东西慢慢淡去,但是有时候还是需要用到这种东西,所以就有了,go调用php实现twig模板引擎的想法。
原理,go 通过exec.Command调用php,通过STDIN,STDOUT 方式进行数据交互
go在初始化阶段提供一些配置参数,比如模板引擎的为止,是否为开发环境等,php接收数据并初始化
初始换环境完毕后,当需要渲染模板,go再讲模板文件和数据以json字符串的形式写入STDIN告知php,
php接收到数据后,解析数据,选取指定的模板并渲染,然后通过STDOUT返回给go
这样一次渲染就结束了
整理好的文件打包在github上了
如果喜欢就动动你的小手指点个赞,star一下吧!
是的,go语言的全称是:go programming language。go 这个词太通用了,搜索引擎不能很好辨认,所以习惯叫golang.
可以。golang模板引擎动态可以读取sql。text/template是Go语言标准库,实现数据驱动模板以生成文本输出,可以理解为一组文字按照特定格式动态嵌入另一组文字中。
本教程介绍 Go 中多模块工作区的基础知识。使用多模块工作区,您可以告诉 Go 命令您正在同时在多个模块中编写代码,并轻松地在这些模块中构建和运行代码。
在本教程中,您将在共享的多模块工作区中创建两个模块,对这些模块进行更改,并在构建中查看这些更改的结果。
本教程需要 go1.18 或更高版本。使用go.dev/dl中的链接确保您已在 Go 1.18 或更高版本中安装了 Go 。
首先,为您要编写的代码创建一个模块。
1、打开命令提示符并切换到您的主目录。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,为您的代码创建一个名为工作区的目录。
3、初始化模块
我们的示例将创建一个hello依赖于 golang.org/x/example 模块的新模块。
创建你好模块:
使用 . 添加对 golang.org/x/example 模块的依赖项go get。
在 hello 目录下创建 hello.go,内容如下:
现在,运行 hello 程序:
在这一步中,我们将创建一个go.work文件来指定模块的工作区。
在workspace目录中,运行:
该go work init命令告诉为包含目录中模块的工作空间go创建一个文件 。go.work./hello
该go命令生成一个go.work如下所示的文件:
该go.work文件的语法与go.mod相同。
该go指令告诉 Go 应该使用哪个版本的 Go 来解释文件。它类似于文件中的go指令go.mod 。
该use指令告诉 Go在进行构建时hello目录中的模块应该是主模块。
所以在模块的任何子目录中workspace都会被激活。
2、运行工作区目录下的程序
在workspace目录中,运行:
Go 命令包括工作区中的所有模块作为主模块。这允许我们在模块中引用一个包,即使在模块之外。在模块或工作区之外运行go run命令会导致错误,因为该go命令不知道要使用哪些模块。
接下来,我们将golang.org/x/example模块的本地副本添加到工作区。然后,我们将向stringutil包中添加一个新函数,我们可以使用它来代替Reverse.
在这一步中,我们将下载包含该模块的 Git 存储库的副本golang.org/x/example,将其添加到工作区,然后向其中添加一个我们将从 hello 程序中使用的新函数。
1、克隆存储库
在工作区目录中,运行git命令来克隆存储库:
2、将模块添加到工作区
该go work use命令将一个新模块添加到 go.work 文件中。它现在看起来像这样:
该模块现在包括example.com/hello模块和 `golang.org/x/example 模块。
这将允许我们使用我们将在模块副本中编写的新代码,而不是使用命令stringutil下载的模块缓存中的模块版本。
3、添加新功能。
我们将向golang.org/x/example/stringutil包中添加一个新函数以将字符串大写。
将新文件夹添加到workspace/example/stringutil包含以下内容的目录:
4、修改hello程序以使用该功能。
修改workspace/hello/hello.go的内容以包含以下内容:
从工作区目录,运行
Go 命令在go.work文件指定的hello目录中查找命令行中指定的example.com/hello模块 ,同样使用go.work文件解析导入golang.org/x/example。
go.work可以用来代替添加replace 指令以跨多个模块工作。
由于这两个模块在同一个工作区中,因此很容易在一个模块中进行更改并在另一个模块中使用它。
现在,要正确发布这些模块,我们需要发布golang.org/x/example 模块,例如在v0.1.0. 这通常通过在模块的版本控制存储库上标记提交来完成。发布完成后,我们可以增加对 golang.org/x/example模块的要求hello/go.mod:
这样,该go命令可以正确解析工作区之外的模块。