Go by Examples
IQer_AC
这个作者很懒,什么都没留下…
展开
-
Go by Example: Text Templates
Go为创建动态内容或使用text/template包向用户显示自定义输出提供了内置支持. 一个名为html/template的同级包提供了相同的API, 但具有额外的安全性, 应该用于生成HTML.下一节将介绍: 正则表达式。原创 2023-05-30 21:24:31 · 141 阅读 · 0 评论 -
Go by Example: String Formatting 格式化字符串
Go为传统的printf字符串格式化提供了出色的支持. 下面是一些常见的字符串格式化任务的示例.下一节将介绍: Text Templates。原创 2023-05-30 21:24:22 · 187 阅读 · 0 评论 -
Go by Example: String Functions 字符串函数
标准库的strings包提供了许多有用的与字符串相关的函数, 这里有一些例子可以让你对这个包有个概念.下一节介绍:格式化字符串。原创 2023-05-30 21:22:41 · 59 阅读 · 0 评论 -
Go by Example: Recover
这里有一个例子可以说明这是很有用的: 如果一个客户端连接出现严重错误, 服务器不希望崩溃.相反, 服务器希望关闭该链接并继续为其他客户端提供服务.事实上, 这就是Go的net/http包默认为HTTP服务器所做的.通过使用内置的recover函数, 使得Go从panic中恢复成为可能. recover可以阻止因panic而终止程序, 而是让程序继续执行.下一节将介绍: 字符串函数。原创 2023-05-30 21:23:21 · 73 阅读 · 0 评论 -
Go by Example: Defer
Defer用于确保函数调用在程序执行的后期执行, 通常时出于清理目的.Defer通常用于其他语言中使用的地方如ensure或者finally.下一节将介绍: Recover恢复。运行程序确认文件在写入后已关闭.原创 2023-05-30 21:22:31 · 49 阅读 · 0 评论 -
Go by Example: Panic
Panic通常意味着事情出乎意料地出错了.大多数情况下, 我们使用它来快速处理在正常操作中不应该发生的错误, 或者我们没有准备好优雅处理的错误.当main函数中第一次panic触发时, 程序退出而不触及其余代码.如果希望看到程序尝试创建一个临时文件, 请注释第一个panic.请注意. 与一些使用异常处理许多错误的语言不同, Go语言习惯上尽可能使用指代错误的返回值.运行此程序将导致panic, 打印错误信息和运行协程跟踪, 并以非零状态退出.下一节将介绍Defer。原创 2023-05-29 20:48:55 · 62 阅读 · 0 评论 -
Go by Example: Sorting by Functions
通过遵循创建自定义类型的相同模式, 在该类型上实现三个Interface方法, 然后调用sort.Sort对自定义类型的集合进行排序, 我们可以通过任意函数对Go切片进行排序.有时, 我们想要按自然顺序以外的方式对集合进行排序. 例如, 假设我们希望按字符串长度而不是字母顺序排序. 下面是一个Go中自定义排序的例子.运行我们的程序会显示一个按字符串长度排序的列表。下一节将介绍: Panic.原创 2023-05-29 20:49:58 · 60 阅读 · 0 评论 -
Go by Example: Sorting 排序
运行我们的程序打印排序后的字符串和int切片, 并将其作为AreSorted测试的结果返回true。Go的sort标准库包实现了内置的排序方法和用户自定义类型. 我们先来看看内置的排序方法.下一节将介绍: 用函数排序。原创 2023-05-29 14:48:57 · 62 阅读 · 0 评论 -
Go by Example: Stateful Goroutines有状态的协程
对于这种特殊情况, 基于协程的方法比基于互斥锁的方法更复杂一点. 但是, 在某些情况下它可能是有用的, 例如当涉及到其他通道时, 或者当管理多个这样的互斥锁容易出错时.你应该使用感觉最自然的方法, 特别是在理解程序的正确性方面.在前面的例子中, 我们使用了带有互斥锁的显式锁来同步跨多个协程共享状态的访问.另一种选择是使用协程和通道的内置同步特性来实现相同的效果.这种基于通道的方法符合Go语言的思想,即通过通信共享内存, 并使每个数据块由一个协程拥有.下一节将介绍: 排序。原创 2023-05-29 14:50:00 · 83 阅读 · 0 评论 -
Go by Example: Mutexes 互斥锁
在之前的示例中, 我们看到了如何使用原子操作来管理简单的计数器状态. 对于复杂的状态, 我们可以使用互斥锁跨多个协程安全地访问数据.接下来, 我们将研究如何仅仅使用协程和通道来实现相同的状态管理任务.运行程序显示计数器按预期进行了更新.原创 2023-05-29 14:42:08 · 70 阅读 · 0 评论 -
Go by Example: Atomic Counters原子计数器
Go中管理状态的主要机制式通过channel通信.我们以worker pool为例可以看到这一点. 不过, 还有其他一些管理状态的选项. 在这里, 我们将看看如何使用sync/atomic包来处理多个goroutine访问的原子计数器.我们预期会进行50000次操作. 如果我们使用非原子的ops++来增加计数器, 我们可能会得到一个不一样的数字, 在每次运行时都会有所变化, 因为协程会互相干扰.此外,当使用-race标志运行时, 我们将会遇到数据竞争失败.原创 2023-05-29 14:41:48 · 99 阅读 · 0 评论 -
Go by Example: Rate Limiting速率控制
速率控制式控制资源和保持服务质量的重要机制.Go优雅地支持用goroutine, channel和tickers实现速率限制.对于第二批请求, 由于突发速率的限制,我们立即服务了前3个请求, 然后服务其余2个请求, 每个请求延迟约200ms.运行我们的程序, 我们看到第一批请求按预期每200毫秒处理一次.下一节将介绍: 原子计数器.原创 2023-05-29 14:40:16 · 108 阅读 · 0 评论 -
Go by Example: WaitGroups
为了等待多个goroutine完成, 我们可以使用WaitGroup.对于每次调用, worker协程的启动和结束顺序可能不一样.下一节将介绍: Rate Limiting速率控制.原创 2023-05-29 09:52:09 · 62 阅读 · 0 评论 -
Go by Example: Worker Pools
我们正在运行的程序展示了由不同工人执行的5个jobs.该程序只需要大约2秒, 尽管完成了大约5秒的总工作, 因为有3个worker在并发操作。在这个例子中, 我们将看看如何使用goroutine和channel实现一个工作池(worker pool).下一节将介绍: WaitGroups。原创 2023-05-29 09:52:00 · 61 阅读 · 0 评论 -
Go by Example: Tickers
Timers是为你将来想做某事的时候准备的–tickers是为你想定期重复做某事的时候准备的.这里有一个ticker的例子, 它会周期性地tick, 直到我们停止它.当我们运行这个程序时, 在我们停止它之前, 它应该tick3次.下一节将介绍: Worker Pools.原创 2023-05-29 09:51:51 · 74 阅读 · 0 评论 -
Go by Example: Timers定时器
我们经常希望在将来的某个时间点执行Go代码, 或者在某个时间间隔后重复执行.Go内置的timer和ticker功能使这两像任务变得很容易实现.这节我们先看一下timer, 然后在下一节看一下ticker.第一个计数器将在我们启动程序后启动2s, 但第二个计时器应该在它有机会启动之前停止.下一讲将介绍Tickers。原创 2023-05-28 22:14:00 · 72 阅读 · 0 评论 -
Go by Example: Range over Channels通道上的range操作
在上一篇的示例中, 我们看到了for和range操作如何提供对数据结构的迭代.我们还可以使用该语法从通道接收的值.此实例还展示了关闭非空通道但仍然可以接收剩余值的可能性.下一节将介绍: Timers定时器。原创 2023-05-28 22:13:50 · 55 阅读 · 0 评论 -
Go by Example: Closing Channels关闭通道
关闭通道表示不再在该通道上发送任何值. 这对于将完成通信发送给通道的接收方非常有用.已关闭的通道概念自然会引出我们的下一个示例: 通道上的range操作.原创 2023-05-28 22:13:39 · 69 阅读 · 0 评论 -
Go by Example: 非阻塞通道操作
通道上的基本发送和接收时阻塞的操作.然而, 我们可以使用带有default子句的select来实现非阻塞发送,接收甚至非阻塞多路select操作.下一节将介绍: 关闭channel.原创 2023-05-28 10:24:47 · 71 阅读 · 0 评论 -
Go by Examples: Timeouts超时控制
对于连接到外部资源或需要限制执行时间的程序来说, 超时非常重要.由于channel和select的存在,在Go中实现超时是简单而优雅的.运行此程序显示第一个操作超时, 第二个操作成功.下一节将介绍: 非阻塞通道操作。原创 2023-05-28 10:24:35 · 33 阅读 · 0 评论 -
Go by Example: Select选路
Go的select操作允许您等待多个channel操作.将gotoutine, channel与select结合起来是Go的一个强大功能.注意, 总执行时间只有2秒,因为1秒和2秒休眠是同时执行的.我们如预期一样收到值’one’然后是’two’.下一节将介绍: Timeouts超时器。原创 2023-05-28 10:25:39 · 42 阅读 · 0 评论 -
Go by Example: Channel Directions通道方向
当使用通道作为函数参数时, 你可以指定时只发送还是只接收值.这种特性增加了程序的类型安全.下一节将介绍: Select选路。原创 2023-05-27 10:29:36 · 59 阅读 · 0 评论 -
Go by Exmaple: Channel Synchronization通道同步技术
我们可以使用通道来同步跨goroutine的执行.下面是一个使用阻塞接收来等待goroutine完成的示例. 当等待多个goroutine完成时, 您可能更可能使用WaitGroup.如果从这个程序中删除原创 2023-05-27 10:29:15 · 38 阅读 · 0 评论 -
Go by Example: Channel Buffering 有缓冲的通道
默认情况下, 通道channel是无缓冲的, 这意味着只有当相应的接收(原创 2023-05-27 10:27:47 · 42 阅读 · 0 评论 -
Go by Example: Channels通信
channels是连接并发goroutine的管道.你可以从一个goroutine向channel发送值, 并从另一个goroutine中接收这些值.默认情况下, 发送和接收会阻塞,直到发送方和接收方都准备好. 这个性质允许我们在程序的最后等待’ping’消息, 而不必使用其他的同步手段.当我们运行程序时, "ping"消息通过channel成功地从一个goroutine传递到另一个goroutine.下一节将介绍: Channel Buffering通道缓冲区.原创 2023-05-27 10:27:34 · 38 阅读 · 0 评论 -
Go by Example: Goroutines协程
当我们运行这个程序时, 我们首先看到阻塞调用的输出, 然后是两个goroutine的输出.goroutine的输出可能是交错的, 因为goroutine是由Go运行时并发运行的.接下来我们将看一下并发Go程序中goroutine的补充: channels通道.Goroutine是一个轻量级的执行线程.原创 2023-05-27 10:27:16 · 33 阅读 · 0 评论 -
Go by Example: Errors错误处理
在Go中, 习惯上通过显式的单独返回值来传递错误. 这与Java和Ruby等语言中使用的异常以及C语言中的有时使用的重载的单个结果/错误值形参对比.Go的方法可以很容易地看到哪些函数返回了错误, 并使用用于任务其他无错误任务地相同语言结构来处理它们.下一节将介绍: Goroutines协程。更多关于Go的错误处理细节, 可以查看。原创 2023-05-26 00:08:18 · 90 阅读 · 0 评论 -
Go by Example: Generics泛型
从Go1.18版本开始,Go增加了对泛型(也成为类型参数)的支持.下一讲将介绍:Errors错误。原创 2023-05-26 00:09:18 · 118 阅读 · 0 评论 -
Go by Example: Struct Embedding类型嵌入
Go支持嵌入结构体和接口, 以表达更无缝的类型组合. 不要与//go:embed混淆, 后者是在Go1.16+版本中引入的一个go指令,用于将文件和文件夹嵌入到应用程序二进制文件中的.下一节介绍: 泛型Generics.原创 2023-05-26 00:09:04 · 86 阅读 · 0 评论 -
Go by Examples: Interfaces接口
了解更多关于Go语言接口的内容.接口是方法签名的集合.原创 2023-05-26 00:08:51 · 41 阅读 · 0 评论 -
Go by Examples: Methods方法
接下来, 我们将了解Go对相关方法集进行分组和命名的机制: 接口INterfaces.Go支持在结构体上定义方法.原创 2023-05-26 00:08:30 · 31 阅读 · 0 评论 -
Go by Examples: Structs结构体
Go的结构体是字段的类型化集合, 它们对于将数据分组形成记录很有用.下一节介绍: 方法.原创 2023-05-26 00:07:04 · 40 阅读 · 0 评论 -
Go by Examples: 字符串和码点(runes)
编码文本地容器, 在其他语言中. 字符串是由’字符characters’组成地.在Go语言中, 字符(character)的概念被称为符文(rune)–它是一个表示Unicode码点的整数.Go语言中的一个字符串是只读的字节切片.该语言和标准库将字符串特别地视为。下一节将介绍结构体: struct。是对这个话题的一个很好的介绍.原创 2023-05-26 00:08:06 · 70 阅读 · 0 评论 -
Go by Examples:指针Pointers
zeroval不会改变main函数中的i变量, 但zeroptr函数会改变i, 这是因为它有对该变量的内存地址的引用., 允许你在程序中传递值和记录的引用.下一节是关于字符串和runes的。原创 2023-05-26 00:07:50 · 30 阅读 · 0 评论 -
Go by Examples: Recursion递归
下一节将介绍: 指针Points..以下是一个经典示例.原创 2023-05-26 00:06:12 · 43 阅读 · 0 评论 -
Go by Examples: Closures闭包
当你想要内联顶一个函数而不必为其命名时, 匿名函数是很用的.我们最后一个要看的函数特性是递归(recursion).原创 2023-05-26 00:06:56 · 29 阅读 · 0 评论 -
Go by Examples:可变参数函数
可以用任意数量的尾随参数进行调用. 例如, fmt.Println就是一个常见的可变函数.Go函数的另一个关键点是它们形成闭包的能力, 这是下一章要讨论的.原创 2023-05-25 10:52:14 · 53 阅读 · 0 评论 -
Go by Examples:多返回值
Go内置了对多个返回值的支持. 这个特性在Go语言中经常使用, 例如从函数返回结果值result与错误值error.接收可变数量的参数是Go函数另一个很有用的特性.接下来的一节我们来看看这个特性.原创 2023-05-25 10:42:10 · 39 阅读 · 0 评论 -
Go by Examples: 函数
Go的函数还有其他一些特性, 其中一个是支持多个返回值.我们将在接下来的章节去讨论.函数是Go语言的核心.我们将通过一些不一样的例子学习函数.原创 2023-05-25 10:21:48 · 49 阅读 · 0 评论 -
Go by Examples: Range
range可以遍历各种数据结构.让我们看看如何在一些我们已经学过的数据结构上使用range.原创 2023-05-25 10:14:07 · 44 阅读 · 0 评论