diff --git a/src/064.md b/src/064.md index 657608a..1afcb9e 100644 --- a/src/064.md +++ b/src/064.md @@ -26,7 +26,7 @@ - 我想决定应用程序如何结束,是报错退出(退出代码 1)还是没有任何问题的退出(退出代码 0)。 -此外,如果您还没有这样做,请查看[[Tip #43](./043.md)。 +此外,如果您还没有这样做,请查看[Tip #43](./043.md)。 因此,让我们将所有的设置工作从 main 函数中移出: diff --git a/src/067.md b/src/067.md index 3e80aad..ac16632 100644 --- a/src/067.md +++ b/src/067.md @@ -14,7 +14,7 @@ func SendEmail(subj string, receip string, body string, attachmentPaths []string 在不破坏代码流程(从上到下)的情况下,有几种解决方法: 1. 长参数可能表明函数的功能超出了应有的范围,考虑将其拆分为较小的函数。 -2. 如果任何参数是可选的,请考虑使用可选的结构体或变长函数。这一技术在我之前分享的tips中介绍过([Tips#22](https://twitter.com/func25/status/1758435261183353308))。 +2. 如果任何参数是可选的,请考虑使用可选的结构体或变长函数。这一技术在我之前分享的tips中介绍过([Tips#22](./022.md))。 3. 如果参数是必需的,仍然可以将它们分组到一个结构体中并进行验证,必要时抛出错误。 4. 使用仍然清晰且描述准确的较短名称。 5. 具有相同类型的参数可以在类型前声明一次。 diff --git a/src/068.md b/src/068.md index 895823c..13bcd1c 100644 --- a/src/068.md +++ b/src/068.md @@ -11,7 +11,7 @@ ![](./images/068/001.png) -我将其放在这里,以便您可以复制:`go install http://golang.org/x/tools/cmd/deadcode@latest` +我将其放在这里,以便您可以复制:`go install golang.org/x/tools/cmd/deadcode@latest` 然后,使用以下简短的命令运行它: diff --git a/src/069.md b/src/069.md index 3dc3a86..a06da03 100644 --- a/src/069.md +++ b/src/069.md @@ -16,9 +16,9 @@ 这里有三个概念: -- 要并发运行任务,请使用 `g.Go()`` 启动一个 goroutine 并传递一个函数。 -- 使用 `g.Wait()`` 等待所有 goroutine 完成,它会返回第一个发生的错误,而不是所有错误。 -- `errgroup` 与context很搭配。 +- 要并发运行任务,请使用 `g.Go()` 启动一个 goroutine 并传递一个函数。 +- 使用 `g.Wait()` 等待所有 goroutine 完成,它会返回第一个发生的错误,而不是所有错误。 +- `errgroup` 与 `context` 很搭配。 通过使用 `errgroup.WithContext()`,如果发生错误,context将被取消。 diff --git a/src/070.md b/src/070.md index ffd0404..06aadaa 100644 --- a/src/070.md +++ b/src/070.md @@ -8,7 +8,7 @@ ![tips-070-img1](./images/070/tips070-img1.png) -> 我们在Tips #63 中讨论了解决方案:[避免 time.Sleep ()](https://twitter.com/func25/status/1774070336214253734) +> 我们在Tips #63 中讨论了解决方案:[避免 time.Sleep ()](./063.md) 我们之前讨论的解决方案是可行的,但是一遍又一遍地写就有点麻烦了。 @@ -17,7 +17,7 @@ ![tips070-img3](./images/070/tips070-img2.png) -https://go.dev/play/p/FErMIDKoulb +[https://go.dev/play/p/FErMIDK...](https://go.dev/play/p/FErMIDKoulb) 这样,我们可以在 Go 中暂停代码,但如果有东西告诉`context`停止,Sleep将提前结束: diff --git a/src/071.md b/src/071.md index 6619c5f..dfe336e 100644 --- a/src/071.md +++ b/src/071.md @@ -38,4 +38,4 @@ 泛型已经为我们确保了类型,所以我们不需要担心转换失败。 sync.Pool 始终只包含类型 T 的实例,因此在正常情况下,断言 p.internal.Get(T) 不会引发 panic。 -实例代码参见:https://go.dev/play/p/N3suxuK-yCp \ No newline at end of file +实例代码参见:[go.dev/play/p/N3suxuK...](https://go.dev/play/p/N3suxuK-yCp) \ No newline at end of file diff --git a/src/072.md b/src/072.md index 6d7042a..104a041 100644 --- a/src/072.md +++ b/src/072.md @@ -1,6 +1,6 @@ # Tip #72 使用strings.EqualFold进行忽略大小写的字符串比较 -> 原始链接:[Case-Insensitive string comparison with strings.EqualFold](https://twitter.com/func25/status/1777673942079283694) +> 原始链接:[Golang Tip #72: Case-Insensitive string comparison with strings.EqualFold](https://twitter.com/func25/status/1777673942079283694) > 当你需要比较字符串且不关心字母是大写还是小写时,你可能会想到: @@ -49,4 +49,4 @@ s2 := "resume\u0301" // 'e' 后跟一个组合重音符 在这种情况下,仅使用 strings.EqualFold 将不够,因为这些字符看起来相同但编码不同。 -要正确比较这些字符串,您将需要其他方法来处理字符串,参考[http://golang.org/x/text/nocode/norm](http://golang.org/x/text/nocode/norm) \ No newline at end of file +要正确比较这些字符串,您将需要其他方法来处理字符串,参考[golang.org/x/text/unicode...](http://golang.org/x/text/nocode/norm) \ No newline at end of file diff --git a/src/073.md b/src/073.md index 6c6bf65..d2b5f42 100644 --- a/src/073.md +++ b/src/073.md @@ -1,6 +1,6 @@ # Tip #73 用stringer工具给枚举类型实现String()方法 -> 原始链接:[ Implement String() for enum with the stringer tool](https://twitter.com/func25/status/1778027410929410111) +> 原始链接:[Golang Tip #73: Implement String() for enum with the stringer tool](https://twitter.com/func25/status/1778027410929410111) > 你是否注意到,在你用Go语言打印中打印持续时间的时候,比如:fmt.Println(time.Second),它显示为"1s"而不是"1000000000",尽管 time.Duration的底层类型是int64类型。 diff --git a/src/075.md b/src/075.md index 211d1ba..9458ccb 100644 --- a/src/075.md +++ b/src/075.md @@ -29,7 +29,7 @@ key 本质上是请求的标识符。 当多个请求具有相同的关键字时,`singleflight`就会意识到它们**请求**的是同一件事。 -您可以再这里看到实际操作: https://go.dev/play/p/dxQQrznx7m4 +您可以再这里看到实际操作: [go.dev/play/p/dxQQrzn...](https://go.dev/play/p/dxQQrznx7m4) 使用这种方法,如果同一函数被同时调用**多次** ,则只对该函数进行一次实际调用。然后,所有调用者共享这一次调用的结果。 diff --git a/src/076.md b/src/076.md index 93d41a4..1485aaf 100644 --- a/src/076.md +++ b/src/076.md @@ -25,7 +25,7 @@ ![tips076-img4](./images/076/tips076-img4.png) -这个技巧与我在之前提到的“must”函数结合使用时效果非常好。具体详见:[Golang Tip #44: Intentionally Stop with Must Functions](https://twitter.com/func25/status/1766442686624784496) +这个技巧与我在之前提到的“must”函数结合使用时效果非常好。具体详见:[Golang Tip #44: Intentionally Stop with Must Functions](./044.md) 我还有一个小的通用的辅助的函数,如果没有error的时候它会返回结果,否则就会停止运行。 diff --git a/src/077.md b/src/077.md index 45f8491..945e1b7 100644 --- a/src/077.md +++ b/src/077.md @@ -27,4 +27,8 @@ ![tips077-img4](./images/077/tips077-img4.png) -此外,http://golang.org/x/sync/semaphore 包中提供了一个信号量的实现,是加权信号量,加权信号量允许一个 goroutine 占用多个槽位,适用于每个 goroutine 资源消耗不同的情况。例如,管理数据库的连接池时,某些操作可能需要一次使用多个连接。 \ No newline at end of file +此外,[golang.org/x/sync/semaphore...](http://golang.org/x/sync/semaphore) 包中提供了一个信号量的实现,是加权信号量。 + +加权信号量允许一个 goroutine 占用多个槽位,适用于每个 goroutine 资源消耗不同的情况。 + +例如,管理数据库的连接池时,某些操作可能需要一次使用多个连接。 \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b77ca4b..12175f1 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -64,8 +64,8 @@ - [Tip #62 context.Value不是我们的朋友](./062.md) - [Tip #63 避免使用time.Sleep(),它不能被context感知且无法被中断](./063.md) - [Tip #64 让main()函数更清晰并且易于测试](./064.md) -- [Tip #66 在fmt.Errorf中简化你的错误信息](./066.md) - [Tip #65 使用泛型返回指针](./065.md) +- [Tip #66 在fmt.Errorf中简化你的错误信息](./066.md) - [Tip #67 如何处理长函数签名](./067.md) - [Tip #68 使用deadcode工具来找到和删除无用的函数](./068.md) - [Tip #69 通过errgrup管理多个goroutine](./069.md)