1

嗨 Golang 程序员,

首先,如果我的问题最初不是很清楚,我深表歉意,但是在编写使用标准库或其他库时使用 Goroutines 的 Golang 代码时,我试图了解正确的使用模式。

让我详细说明一下:假设我导入了一些我没有亲笔书写但想要使用的包。假设这个包以某种方式向 Flickr 等网站发出简单的 http get 请求。如果我想要一个并发请求,我可以在函数调用前加上 go 关键字。但是我怎么知道,这个包在执行请求时并没有自己做一些内部 go 调用,因此使我的 go 调用变得多余?

Golang 包通常在文档中说他们的方法是“绿色的”吗?或者他们提供了两种版本的方法,一种是绿色的,一种是直接同步的?

在我寻求理解 Go 习惯用法和使用模式的过程中,我什至在使用标准库中的包时感觉我无法确定我的 go 命令是否是必要的。我想我可以分析调用,或者编写测试代码,但是必须弄清楚一个函数是否已经“绿色”,这感觉很奇怪。

我想另一种可能性是由我来研究我正在使用的任何东西的源代码并了解它应该如何使用以及是否需要 go 关键字。

如果有人能对此有所了解或指出正确的文档甚至是 Golang 的截屏视频,我将不胜感激。我认为 Rob Pike 在一次演讲中简要提到过,一个好的客户端 api 编写的 go 只是以典型的同步方式编写的,由该 api 的调用者来选择是否将其设为绿色。

谢谢你的时间,

-拉尔夫

4

1 回答 1

3

如果一个函数/方法返回一些值,或者有类似的副作用(io.Reader.Read)——那么它必然是一个同步的东西。除非另有说明,否则不应假设多个 goroutine 并发使用是不安全的。

如果它接受一个闭包(回调)或一个通道,或者如果它返回一个通道——那么它通常是一个异步的东西。如果是这种情况,它通常是显而易见的或明确记录在案的。像这样的异步东西通常对于多个 goroutine 并发使用是安全的。

于 2013-06-06T01:42:22.353 回答