Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 58a7c3f

Browse files
committed
小修改
1 parent 1ef09fb commit 58a7c3f

7 files changed

+18
-15
lines changed

published/tech/20190207-Golang-timer-is-not-garbage-collected-before-expiry.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
首发于:https://studygolang.com/articles/22617
22

3-
# Golang <-time.After()在计时器过期前不会被垃圾回收
3+
# Golang <-time.After() 在计时器过期前不会被垃圾回收
44

55
最近我在调查 Go 应用程序中内存泄漏的问题,这个问题主要因为我没有正确的阅读文档。这是一段导致消耗了多个 Gbs 内存的代码:
66

published/tech/20190708-go-map-design-by-example-part-I.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Go 将键值对存储在桶的列表中,每个桶容纳 8 个键值对,当 m
3636

3737
## Map 扩容
3838

39-
在存储键值对时,桶会将它存储在 8 个可用的插槽中。如果这些插槽全部不可用,Go 会创建一个溢出桶,并于当前桶连接
39+
在存储键值对时,桶会将它存储在 8 个可用的插槽中。如果这些插槽全部不可用,Go 会创建一个溢出桶,并与当前桶连接
4040

4141
![overflow bucket](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-map-design-by-example-part-I/1_ZfDObIafsML18crqW-MX_Q.png)
4242

published/tech/20200528-Sorting-in-Go-from-JavaScript.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ sort.StringSlice 是一个字符串切片方法,但它实现了 sort.Interface
8080
[C, fish, Go, JavaScript, Ruby, XML]
8181
```
8282

83-
但是,即使有 XML,"fish" 也排在最后!(这是因为)使用 sort.StringSlice, 与使用 JS 中的字符串列表排序算法 Array.prototype.sort 相同,默认按照字典顺序排序,而不是字母顺序。在字典顺序中,小写字母(如 fish 中的 f)在大写字母(如 XML 中的 X)之后。如果我们想不区大小写,就按照字母的顺序排序,我们需要实现一些自定义行为。那会是什么样子呢?
83+
但是,即使有 XML,"fish" 也排在最后!(这是因为)使用 sort.StringSlice, 与使用 JS 中的字符串列表排序算法 Array.prototype.sort 相同,默认按照字典顺序排序,而不是字母顺序。在字典顺序中,小写字母(如 fish 中的 f)在大写字母(如 XML 中的 X)之后。如果我们想不区分大小写,就按照字母的顺序排序,我们需要实现一些自定义行为。那会是什么样子呢?
8484

8585
在实现自定义排序规则之前,我们需要想想排序的作用。在本教程中,我们不会研究不同排序算法(如快速排序、归并排序和冒泡排序)的细节,虽然学习它们在编程中很重要。关于在 Go 和 JS 中编写自定义排序算法,您需要了解的是,它们需具备:
8686

published/tech/20200923-Go-Goroutine-Leak-Detector.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/goroutine_leak_detector/header_img.png)
66

7-
具有监控存活的 goroutine 数量功能的 APM (Application Performance Monitoring)
8-
应用程序性能监控可以轻松查出 goroutine 泄漏。例如 NewRelic APM 中 goroutine 的监控。
7+
具有监控存活的 goroutine 数量功能的 APM (Application Performance Monitoring)应用程序性能监控可以轻松查出 goroutine 泄漏。例如 NewRelic APM 中 goroutine 的监控。
98

109
![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/goroutine_leak_detector/goroutinemonitor.png)
1110

@@ -16,6 +15,7 @@ goroutine 泄漏会导致内存中存活的 goroutine 数量不断上升,直
1615
## 泄漏检测
1716

1817
隶属于 Uber 公司的 Go 团队在 GitHub 开源了他们的[goroutine 泄漏检测器](https://github.com/uber-go/goleak) 出来,一个与单元测试结合使用的工具。
18+
1919
goleak 可以监控当前测试代码中泄漏的 goroutine。下面有一个 goroutine 泄漏的例子:
2020

2121
```go

published/tech/20201030-How-to-compile-code-in-the-browser-with-WebAssembly.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
首发于:https://studygolang.com/articles/35261
22

3-
# 如何使用 WebAsemmbly 在浏览器中编译代码
3+
# 如何使用 WebAssembly 在浏览器中编译代码
44

55
浏览器的功能日益强大,从最早在 [CERN](https://home.cern/science/computing/birth-web) 上分享文章,到今天运行 [Google Earth](https://earth.google.com/web) ,玩 [Unity 3D](https://blogs.unity3d.com/2018/08/15/webassembly-is-here/) 游戏,甚至用 [AutoCAD](https://www.autodesk.com/products/autocad-web-app/overview) 设计建筑。
66

published/tech/20210219-Writing-A-Simple-TCP-Server-Using-Kqueue.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
注意 kqueue 不仅能处理 socket event,而且还能处理文件描述符 event、信号、异步 I/O event、子进程状态改变 event、定时器以及用户自定义 event。它确实通用和强大。
1212

13-
我们这篇文章主要分为一下几部分讲解。首先,我们会在先从理论出发设计我们的 TCP Server。然后,我们会去实现它的必要的模块。最后我们会对整个过程进行总结以及思考。
13+
我们这篇文章主要分为以下几部分讲解。首先,我们会先从理论出发设计我们的 TCP Server。然后,我们会去实现它的必要的模块。最后我们会对整个过程进行总结以及思考。
1414

1515
## 设计
1616

published/tech/20210220-Life-of-an-HTTP-request-in-a-Go-server.md

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func ListenAndServe(addr string, handler Handler) error
4242

4343
这张图展示了调用时所发生的简要流程:
4444

45-
![](https://github.com/studygolang/gctt-images2/blob/master/20210220-Life-of-an-HTTP-request-in-a-Go-server/http-request-listenandserve.png?raw=true)
45+
![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20210220-Life-of-an-HTTP-request-in-a-Go-server/http-request-listenandserve.png)
4646

4747
这是函数和方法调用的实际序列的高度“内联”版本,但是[原始的代码](https://go.googlesource.com/go/+/go1.15.8/src/net/http/server.go)并不难理解。
4848

@@ -84,7 +84,7 @@ func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {
8484

8585
注意高亮的部分(if handler == nil ...),如果 `handler == nil`,则 `http.DefaultServeMux` 被用作 handler。这个是*默认的 server mux*`http` 包中所包含的一个 `http.ServeMux` 类型的全局实例。顺便一提,当我们的示例代码使用 `http.HandleFunc` 注册 handler 函数的时候,会在同一个默认的 mux 上注册这些handler。
8686

87-
我们可以如下所示这样重写我们的示例代码,不再使用默认的 mux。只修改 `main` 函数,所以这里没有展示 `hello``headers` handler 函数,看是我们可以在这看[完整的代码](https://github.com/eliben/code-for-blog/blob/master/2021/go-life-http-request/basic-server-mux-object.go)。功能上没有任何变化[^1]
87+
我们可以如下所示这样重写我们的示例代码,不再使用默认的 mux。只修改 `main` 函数,所以这里没有展示 `hello``headers` handler 函数,我们可以在这看[完整的代码](https://github.com/eliben/code-for-blog/blob/master/2021/go-life-http-request/basic-server-mux-object.go)。功能上没有任何变化[^1]
8888

8989
```go
9090
func main() {
@@ -95,7 +95,9 @@ func main() {
9595
http.ListenAndServe(":8090", mux)
9696
}
9797
```
98+
9899
## 一个 `ServeMux` 仅仅是一个 `Handler`
100+
99101
当看多了 Go 服务的例子后,很容易给人一种 `ListenAndServe` 函数“需要一个 mux” 作为参数的印象,但是这是不准确的。就像我们之前所见到的那样,`ListenAndServe` 函数需要的是一个实现了 `http.Handler` 接口的值。我们可以写下面这样的服务而没有任何 mux:
100102

101103
```go
@@ -148,22 +150,22 @@ func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
148150
- `ServeMux` 维护了一个(根据长度)排序的 `{pattern, handler}` 的切片。
149151
- `Handle``HandleFunc` 向该切片增加新的 handler。
150152
- `ServeHTTP`
151-
152-
- (通过查找这个排序好的 handler 对的切片)为请求的 path 找到对应的 handler
153-
- 调用 handler 的 `ServeHTTP` 方法
153+
- (通过查找这个排序好的 handler 对的切片)为请求的 path 找到对应的 handler
154+
- 调用 handler 的 `ServeHTTP` 方法
154155

155156
因此,mux 可以被看做是一个*转发 handler*;这种模式在 HTTP 服务开发中极为常见,这就是*中间件*
156157

157158
## `http.Handler` 中间件
159+
158160
由于中间件在不同的上下文,不同的语言以及不同的框架中意味着不同的东西,所以它很难被准确定义。
159161

160162
让我们回到这篇博文开头的流程图上,对它进行一点简化,隐藏 `http` 包所执行的细节:
161163

162-
![](https://github.com/studygolang/gctt-images2/blob/master/20210220-Life-of-an-HTTP-request-in-a-Go-server/http-request-simplified.png?raw=true)
164+
![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20210220-Life-of-an-HTTP-request-in-a-Go-server/http-request-simplified.png)
163165

164166
现在,当我们加了中间件的话,流程图看起来是这样的:
165167

166-
![](https://github.com/studygolang/gctt-images2/blob/master/20210220-Life-of-an-HTTP-request-in-a-Go-server/http-request-with-middleware.png?raw=true)
168+
![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20210220-Life-of-an-HTTP-request-in-a-Go-server/http-request-with-middleware.png)
167169

168170
在 Go 语言中,中间件只是另一个 HTTP handler,它包裹了一个其他的 handler。中间件 handler 通过调用 `ListenAndServe` 被注册进来;当调用的时候,它可以执行任意的预处理,调用自身包裹的 handler 然后可以执行任意的后置处理。
169171

@@ -253,6 +255,7 @@ handler = loggingMiddleware(handler)
253255
希望这样可以让大家明白为什么中间件是一个很吸引人的辅助设计。我们可以专注于我们的“业务逻辑” handler 上,尽管完全正交,我们利用通用的中间件,在许多方面提升我们的 handler。在其他文章中,会进行全面的探讨。
254256

255257
## 并发和 panic 处理
258+
256259
为了结束我们对于 Go HTTP 服务中 HTTP 请求的探索,来介绍另外两个主题:并发和 panic 处理。
257260

258261
首先是*并发*。之前简单提到,每个连接由 `http.Server.Serve` 在一个新的 goroutine 中处理。
@@ -309,7 +312,7 @@ main.doPanic(0x6fa060, 0xc0001401c0, 0xc000164200)
309312

310313
阅读了这个博文后,再写实现这个功能的中间件应该是很容易的。将它作为练习!我会在之后的博文中介绍这个用例。
311314

312-
[^1]: 与使用默认的 mux 的版本相比,这个版本有充分的理由更喜欢这一版本。默认的 mux 有着一定的安全风险;作为全局实例,它可以被你工程中引入的任何包所修改。一个恶意的包也行会出于邪恶的目的而使用它
315+
[^1]: 与使用默认的 mux 的版本相比,这个版本有充分的理由更喜欢这一版本。默认的 mux 有着一定的安全风险;作为全局实例,它可以被你工程中引入的任何包所修改。一个恶意的包也许会出于邪恶的目的而使用它
313316
[^2]: 注意:`http.HandleFunc``http.HandlerFunc` 是具有不同而有相互关联的角色的不同实体。
314317

315318
---

0 commit comments

Comments
 (0)