Go
文章平均质量分 92
Go语言教程
CHQIUU
当你发现自己的才华撑不起野心时,就请安静下来学习吧
展开
-
如何在Go中使用模板
Go模板是一个方便的工具,可以将任何文本包装成任何数据。您可以在命令行工具中使用它们来格式化输出,在web应用程序中使用它们来渲染HTML,等等。在本教程中,您使用Go的内置模板包从相同的数据打印格式良好的文本和HTML页面。要了解有关如何使用这些软件包的更多信息,请查看和的文档。行动。原创 2023-12-25 11:00:50 · 10266 阅读 · 0 评论 -
如何在Go中使用泛型
在本教程中,你创建了一个新的程序,它有一个Deck,它可以从Deck中返回一个随机的卡片作为值,还有一个类型来表示这副牌中的一张扑克牌。然后,您更新了Deck类型以支持泛型类型参数,并能够删除一些错误检查,因为泛型类型确保类型错误不会再发生。之后,我们创建了一个新的类型来表示Deck可以支持的不同类型的牌,以及创建每种类型的牌组并从每种牌组中返回一张随机牌。接下来,你给Deck添加了一个类型约束,以确保只有实现了Card接口的类型才能被添加到Deck中。最后,我们创建了一个泛型的printCard。原创 2023-12-25 10:35:02 · 10588 阅读 · 2 评论 -
如何在Go中发起HTTP请求
随着时间的推移,HTTP请求和响应被用于在客户端和服务器之间发送更多的数据。有时,HTTP客户端可以假设从HTTP服务器接收到的数据是HTML,并且很有可能是正确的。现在,它可以是HTML、JSON、音乐、视频或任何其他数据类型。为了提供更多关于通过HTTP发送的数据的信息,协议包括HTTP首部,其中一个重要的首部是,这个首部告诉服务器(或客户端,取决于数据的方向)如何解释它接收到的数据。在本节中,你将更新你的程序,设置HTTP请求的头,以便服务器知道它正在接收JSON数据。原创 2023-12-21 17:44:29 · 10422 阅读 · 0 评论 -
如何在Go中制作HTTP服务器
在本教程中,您使用Go标准库中的net/http包创建了一个新的Go HTTP服务器。然后你更新了你的程序以使用特定的服务器多路复用器和多个实例。您还更新了服务器,以通过查询字符串值、请求体和表单数据读取用户输入。最后,更新了服务器,使用自定义的HTTP首部和“Bad Request”状态码向客户端返回表单验证信息。Go HTTP生态系统的一个好处是,许多框架被设计成整齐地集成到Go的net/http包中,而不是重新发明大量已经存在的代码。项目就是一个很好的例子。原创 2023-12-21 17:31:43 · 10257 阅读 · 0 评论 -
如何在Go中使用JSON
在本教程中,您创建了一个新程序来使用Go标准库中的包。首先,你使用具有类型的函数以一种灵活的方式创建JSON数据。然后,你更新了你的程序,使用json结构体标签和struct类型来以一致和可靠的方式使用生成json数据。之后,你使用具有类型的函数将JSON字符串解码为Go数据。最后,你使用之前用函数定义的struct类型来根据这些struct字段进行解析和类型转换。使用包,你将能够与互联网上的许多api进行交互,从而创建自己与流行网站的集成。原创 2023-12-21 17:15:08 · 10165 阅读 · 0 评论 -
如何在Go中使用上下文
在本教程中,你创建了一个以各种方式与Go的context包交互的程序。首先,你创建了一个接受作为参数的函数,并使用和函数来创建空的上下文。之后,你使用将值添加到新的上下文中,并使用Value方法在其他函数中检索它们。最后,你使用上下文的Done方法来确定上下文何时完成运行。当与函数和配合使用时,你实现了自己的上下文管理,以设置使用这些上下文的代码应该运行多长时间。Contextsql.DB忙循环。原创 2023-12-19 07:00:00 · 10307 阅读 · 0 评论 -
如何在Go中使用日期和时间
许多其他编程语言都有类似的方式来格式化要显示的日期和时间,但如果您在其他语言中使用它们,那么Go构建这些格式布局的方式可能与您习惯的方式略有不同。在其他语言中,日期格式化使用类似于Go中的Printf的工作方式,字符后面跟着一个字母,表示要插入的日期或时间的一部分。例如,4位数字的年份可以用%Y表示。然而,在Go中,日期或时间的这些部分由表示特定日期的字符表示。要在Go日期格式中包含4位数字的年份,实际上需要在字符串本身中包含2006。这种布局的好处是,你在代码中看到的实际上代表了你将在输出中看到的内容。原创 2023-12-18 17:24:45 · 10398 阅读 · 0 评论 -
如何在Go中向错误中添加额外的信息
由于Go对error接口的唯一规则是它包含一个error方法,因此可以将许多Go类型转换为自定义错误。一种方法是定义一个带有额外错误信息的struct类型,然后包含一个error方法。对于验证错误,知道是哪个值导致了错误可能很有用。接下来,让我们创建一个新的ValueError结构体,其中包含导致错误的Value字段和包含实际验证错误的Err字段。自定义错误类型通常使用类型名称末尾的error后缀来表示它是符合error接口的类型。打开main.go文件并添加新的ValueError错误结构体,以及。原创 2023-12-18 17:08:19 · 10439 阅读 · 0 评论 -
如何在Go中并发运行多个函数
在本教程中,你使用go关键字创建了一个程序来启动并发运行的goroutines,并在运行时打印出数字。程序运行后,你使用创建了一个包含int值的新通道,然后使用该通道在一个goroutine中生成数字,并将它们发送到另一个goroutine并打印到屏幕上。最后,你同时启动了多个“打印”goroutines,作为在多核计算机上如何使用通道和goroutines来加速程序的示例。如果您有兴趣了解更多关于Go中的并发性,Go团队创建的文档有更详细的介绍。并发不是并行。原创 2023-12-17 08:00:00 · 10238 阅读 · 0 评论 -
如何在自己的项目中使用私有Go模块
在本教程中,您创建并发布了一个私有Go模块。您还设置了HTTPS和SSH身份验证以访问您的私有Go模块。最后,在新项目中使用了私有模块。有关Go模块的更多信息,Go项目有一系列博客文章,详细介绍了Go工具如何与模块交互和理解模块。Go项目还在中有关于Go模块的非常详细和技术参考。除了GOPRIVATE环境变量,在使用私有Go模块时还可以使用更多变量。它们可以在的部分中详细看到。如果您有兴趣更详细地探索.netrc文件,.netrc上的GNU网站包含所有可用关键字的列表。git-config文档。原创 2023-12-17 07:15:00 · 10136 阅读 · 0 评论 -
如何分发Go模块
在本教程中,您创建了一个公开的Go模块并将其发布到GitHub存储库,以便其他人可以使用它。你还使用了语义版本控制来确定模块的最佳版本号。最后,你扩展了模块的功能,并使用语义化版本控制发布了新版本,确信不会破坏依赖它的程序。如果您想了解更多关于语义版本控制的信息,包括如何将数字以外的信息添加到您的版本中,语义版本控制网站可以详细了解。Go文档还有一个模块版本编号页面,解释了Go是如何使用SemVer的。有关Go模块的更多信息,Go项目有一系列博客文章,详细介绍了Go工具如何与和理解模块进行交互。原创 2023-12-16 07:45:00 · 10245 阅读 · 0 评论 -
如何使用Go模块
在本教程中,您创建了一个带有子包的Go模块,并在模块中使用该包。你还添加了另一个模块作为依赖,并探索了如何以各种方式引用模块版本。原创 2023-12-16 06:45:00 · 10198 阅读 · 0 评论 -
如何在Go中使用Flag包
标志使你的应用程序在更多的环境中更有用,因为它们让你的用户控制程序如何执行。为用户提供有用的默认值很重要,但也应该让他们有机会覆盖不适合他们情况的设置。你已经看到了flag包为用户提供了灵活的配置选项。你可以选择一些简单的标志,或者构建一组可扩展的子命令。无论哪种情况,使用flag包都将帮助您构建具有悠久历史的灵活和可脚本化命令行工具风格的实用程序。原创 2023-12-15 07:45:00 · 10196 阅读 · 0 评论 -
使用ldflags为Go应用程序设置版本信息
本教程展示了如何在正确应用的情况下,ldflags可以成为一个强大的工具,在构建时向二进制文件中注入有价值的信息。通过这种方式,您可以控制特性标志、环境信息、版本信息等,而无需对源代码进行更改。通过将ldflags添加到当前的构建工作流中,您可以最大限度地利用Go自包含的二进制发布格式的好处。cmd/link。原创 2023-12-15 07:30:00 · 10302 阅读 · 0 评论 -
如何在不同的操作系统和架构中构建Go应用程序
为多个平台生成不需要依赖项的二进制文件的能力是Go工具链的一个强大功能。在本教程中,您通过添加构建标记和文件名后缀来使用此功能,将某些代码片段标记为仅针对某些体系结构进行编译。你创建了自己的平台相关程序,然后操作GOOS和GOARCH环境变量来为当前平台以外的平台生成二进制文件。这是一项有价值的技能,因为有一个持续集成过程,自动运行这些环境变量,为所有平台构建二进制文件,是一种常见的实践。1.13。原创 2023-12-14 06:15:00 · 10196 阅读 · 0 评论 -
如何在Go中使用接口
组合的核心实现之一是使用接口。接口定义了类型的行为。Go标准库中最常用的接口之一是fmt.Stringer第一行代码定义了一个名为Stringer的type。然后声明它是一个interface。就像定义结构体一样,Go使用大括号({})来包围接口的定义。与定义结构体相比,我们只定义接口的行为;也就是说,“这种类型能做什么”。在Stringer接口的情况下,唯一的行为就是String()方法。这个方法没有参数,返回一个字符串。接下来,让我们看一些具有行为的代码:main.go。原创 2023-12-14 06:30:00 · 10193 阅读 · 0 评论 -
如何在Go中使用结构体标签
结构体标签提供了一种强大的方法,可以增强使用结构体的代码的功能。许多标准库和第三方包都提供了使用struct标签自定义操作的方法。在代码中有效地使用它们不仅可以提供这种自定义行为,还可以简洁地记录未来开发人员如何使用这些字段。原创 2023-12-13 07:15:00 · 10414 阅读 · 0 评论 -
如何构建和安装Go程序
在本教程中,您演示了Go工具链如何轻松地从源代码构建可执行二进制文件。这些二进制文件可以分发到其他系统上运行,即使是没有Go工具和环境的系统。您还使用了go install来自动构建并安装我们的程序,将其作为可执行文件安装在系统的$PATH中。通过go build和go install,你现在可以随意分享和使用你的应用程序。现在您已经了解了go build。原创 2023-12-13 04:00:00 · 10205 阅读 · 0 评论 -
在Go中定义方法
定义方法的语法与定义函数的语法类似。唯一的区别是在func关键字后面添加了一个额外的参数来指定方法的接收者。接收器是你想要定义方法的类型声明。",我们创建了一个名为Creature的结构体,其中包含Name和Greeting的string字段。这个Creature只定义了一个方法Greet。在接收器声明中,我们将Creature的实例赋值给变量c,这样我们就可以在组装中的问候消息时引用Creature的字段。原创 2023-12-12 06:45:00 · 10192 阅读 · 0 评论 -
在Go中定义结构体
结构体的工作方式类似于你可能会使用的纸质表格,例如,用于报税。纸质表单可能有一些字段,用于存储像您的姓和名这样的文本信息。除了文本框之外,表单还可能有复选框来表示布尔值,如“已婚”或“单身”,或者日期框来表示出生日期。类似地,结构体将不同的数据片段收集在一起,并以不同的字段名组织它们。当你用一个新的结构体初始化一个变量时,就好像你复印了一个表单,让它随时可以填写一样。要创建新的结构体,您必须首先向Go提供一个描述该结构体包含的字段的蓝图。这个结构体定义通常以关键字type开始,后面跟着结构体的名称。原创 2023-12-12 05:30:00 · 10202 阅读 · 0 评论 -
理解Go中的指针
当你使用指向变量的指针时,有几个不同的语法元素需要你理解。第一个是和号()的使用。如果你在变量名前放一个&符号,你是在声明你想要获取地址,或者指向该变量的指针。第二个语法元素是使用星号()或解引用操作符。当你声明一个指针变量时,在变量名后面加上指针所指向的变量的类型,并以这将创建myPointer作为一个指向int32变量的指针,并将指针初始化为someint的地址。这个指针实际上并没有包含int32,只是一个int32的地址。让我们看一下指向string的指针。原创 2023-12-11 10:12:44 · 10041 阅读 · 0 评论 -
自定义带有构建标记的Go二进制文件
在本教程中,您使用构建标记来允许您控制哪些代码被编译到二进制文件中。首先,你声明了构建标签并在go build中使用它们,然后你使用布尔逻辑组合了多个标签。然后,我们构建了一个程序,它代表了免费版、专业版和企业版的不同功能集,展示了构建标记可以让您对项目拥有的强大控制能力。原创 2023-12-11 10:02:35 · 10245 阅读 · 0 评论 -
理解Go中的init()方法
在本教程中,我们学习了init()函数在包中的其余代码加载之前加载,并且它可以为包执行特定的任务,例如初始化所需的状态。我们还了解到,编译器执行多个init()语句的顺序取决于编译器加载源文件的顺序。如果您想了解有关init()的更多信息,请查看官方Golang文档。原创 2023-12-10 11:00:00 · 10246 阅读 · 0 评论 -
理解Go语言中的defer
defer在本文中,我们学习了defer语句,以及如何使用它来确保我们正确地清理程序中的系统资源。正确地清理系统资源可以让你的程序使用更少的内存并执行得更好。原创 2023-12-08 08:23:00 · 10356 阅读 · 1 评论 -
如何在Go中使用可变参数函数
我们可以通过在参数前使用省略号()来定义变长函数。下面来创建一个程序,当人们的名字被发送给函数时,它会向人们问候:hello.gosayHello()我们创建了一个sayHello函数,它只接受一个名为names的参数。这个参数是可变的,因为我们在数据类型前面加了一个省略号(......string。这告诉Go函数可以接受0个、1个或多个参数。sayHello函数接收的names参数是[slice],因为数据类型是[string],所以names参数在函数体内可以被视为字符串的切片([]string。原创 2023-12-09 06:30:00 · 10173 阅读 · 1 评论 -
如何在Go中定义和调用函数
让我们从转向经典[“Hello, World!”“程序”变成一个函数。我们将在我们选择的文本编辑器中创建一个新的文本文件,并将程序命名为hello.go。然后,我们将定义函数。函数是通过func关键字定义的。后面跟着你选择的名字和一对圆括号,圆括号用来保存函数接受的任何参数(可以为空)。函数代码被括在大括号{}中。在这种情况下,我们将定义一个名为hello()的函数:hello.go这设置了创建函数的初始语句。从这里开始,我们将添加第二行代码来提供该函数的功能说明。在这种情况下,我们将打印。原创 2023-12-08 08:01:29 · 10191 阅读 · 0 评论 -
在Go中使用循环时使用Break和Continue语句
Go中的break和continue语句允许你在代码中更有效地使用for循环。原创 2023-12-08 07:53:03 · 10265 阅读 · 0 评论 -
如何在Go中构建For循环
在本教程中,我们学习了如何声明和使用for循环来解决Go中的重复任务。我们还学习了for循环的三种不同变体以及何时使用它们。原创 2023-12-07 17:42:33 · 10141 阅读 · 0 评论 -
如何在Go中编写Switch语句
switch语句帮助我们向其他阅读我们代码的开发人员传达一组比较在某种程度上是相互关联的。它们使未来添加新case时更容易添加不同的行为,并使我们能够确保使用default子句正确处理我们忘记的任何事情。下次当你发现自己写了多个if语句都涉及同一个变量时,尝试用switch语句重写它——当需要考虑其他替代值时,你会发现重写它更容易。原创 2023-12-07 17:28:41 · 10316 阅读 · 0 评论 -
如何在Go中编写条件语句
通过使用像if这样的条件语句,你将对程序的执行有更大的控制。条件语句让程序判断某个条件是否满足。如果条件满足,程序将执行特定的代码,但如果条件不满足,程序将继续下移到其他代码。原创 2023-12-07 17:21:03 · 10157 阅读 · 0 评论 -
理解Go中的包可见性
为了更仔细地了解程序中包的可见性是如何工作的,让我们创建一个logging包,记住我们希望在包外部可见和不可见的内容。这个日志包将负责将我们的任何程序消息记录到控制台。它还会查看我们正在日志的级别。infowarning或error。首先,在你的src目录下,创建一个名为loggingcd logging然后,使用像nano这样的编辑器,创建一个名为logging.go将以下代码放在logging.go文件中。debug {原创 2023-12-07 16:48:54 · 10301 阅读 · 0 评论 -
如何在Go中编写包
编写Go包与编写任何其他Go文件相同,但将其放置在另一个目录中允许您隔离代码,以便在其他地方重用。本教程介绍了如何在包中编写定义,演示了如何在另一个Go编程文件中使用这些定义,并解释了在何处保存包以便访问它的选项。原创 2023-12-07 16:27:28 · 10135 阅读 · 0 评论 -
在Go中导入软件包
在本教程中,您使用流行的包创建并运行了两个十行以下的程序,以帮助您生成随机数和uuid。Go生态系统中有如此丰富的编写良好的包,因此用Go编写新程序应该是一种乐趣,您将发现自己用比您想象的更少的努力编写适合您特定需求的有用程序。goimports。原创 2023-12-07 15:58:40 · 10160 阅读 · 0 评论 -
在Go中处理异常
程序遇到的错误大致分为两类:程序员预料到的错误和程序员没有预料到的错误。我们在前两篇关于[错误处理]的文章中介绍的`error`接口主要处理我们在编写Go程序时预期的错误。`error`接口甚至允许我们承认函数调用发生错误的罕见可能性,因此我们可以在这些情况下进行适当的响应。异常属于第二类错误,是程序员没有预料到的。这些不可预见的错误会导致程序自动终止并退出正在运行的Go程序。常见的错误往往会造成异常。在本教程中,我们将研究Go中常见操作可能产生严重错误的几种方式,我们还将了解避免这些严重错误的方法。我原创 2023-10-19 10:31:23 · 10372 阅读 · 0 评论 -
在Go中创建自定义错误
Go提供了两种在标准库中创建错误的方法,[`errors.New`和`fmt.Errorf`],当与用户交流更复杂的错误信息时,或在调试时与未来的自己交流时,有时这两种机制不足以充分捕获和报告所发生的情况。为了传达更复杂的错误信息并实现更多的功能,我们可以实现标准库接口类型原创 2023-10-19 10:29:17 · 10591 阅读 · 0 评论 -
Go中的错误处理
我们使用标准库的`errors.New`和`fmt.Errorf`函数成功地创建了各种错误。在以后的教程中,我们将看看如何创建我们自己的自定义错误类型,以向用户传递更丰富的信息。原创 2023-10-19 10:21:32 · 10225 阅读 · 0 评论 -
理解Go中的数组(Array)和切片(Slice)
您学习了在Go中使用数组和切片的基础知识。我们通过多个练习演示了数组的长度是固定的,而切片的长度是可变的,并发现了这种差异如何影响在不同情况下对这些数据结构的使用。原创 2023-10-12 11:13:41 · 10533 阅读 · 0 评论 -
理解Go中的Map
本教程探索了Go中的map数据结构。map由键值对组成,提供了一种不依赖索引的存储数据的方法。这允许我们根据值的含义和与其他数据类型的关系来检索值。原创 2023-10-12 10:59:57 · 10415 阅读 · 0 评论 -
理解Go中的布尔逻辑
本教程介绍了布尔类型的比较和逻辑操作符,以及真值表和使用布尔进行程序流控制。原创 2023-10-12 10:01:26 · 10751 阅读 · 0 评论 -
如何在Go中使用操作符进行数学运算
我们将使用Go中最常用的两种数字[数据类型]**整数**和**浮点数**:- [Integers]是整数,可以是积极的,消极的,或0(…,`-1`,`0`,`1`,…)。- [Floats]是包含小数点的实数,例如`9.0`或`-2.25`… 本教程将回顾Go中可用于数字数据类型的运算符。原创 2023-10-08 10:45:04 · 10498 阅读 · 0 评论