Go Time: Golang, Software Engineering - Sarah Adams谈Test2Doc与Women Who Go 封面

Sarah Adams谈Test2Doc与Women Who Go

Sarah Adams on Test2Doc and Women Who Go

本集简介

本期节目我们邀请到Sarah Adams参与对谈。我们将探讨为女性在Go社区创造安全入门环境的话题,介绍Women Who Go组织,并深入解析她的开源项目Test2Doc。 加入讨论 Changelog++会员支持我们的工作,获得更底层访问权限,并去除广告。立即加入! 赞助商: Linode——我们首选的云服务器。每月仅需5美元即可获得最快最高效的SSD云服务器。使用优惠码changelog2017可享4个月免费服务! Fastly——我们的带宽合作伙伴。Fastly提供快速、安全且可扩展的数字体验。超越传统CDN,体验强大的边缘云平台。 嘉宾: Sarah Adams - 个人网站、GitHub、X Erik St. Martin - GitHub、X Carlisia Thompson - GitHub、LinkedIn、X Brian Ketelsen - GitHub、X 节目笔记: Test2Doc - 通过测试生成API文档:对Go测试包的简单扩展 有趣的Go项目与新闻 Go 1.7工具链改进 1.7版本中的Context Vendor Check - 检查所有Go依赖是否正确vendored 构建最简单的Go静态分析工具 Heka状态 GopherCon 2014《用Go进行数据抓取:Heka美好时光》Rob Miller(视频) Go libhunt - Go库精选列表 Kubernetes中的Minio对象存储 Lime Text编辑器 Gil Tene的HDR直方图纯Go实现及《如何错误地测量延迟》(视频) Brian在GitHub上搜索有趣Go仓库的方法 自由软件星期五 Brian推荐 - Docker Erik推荐 - Rofi - 窗口切换器/运行对话框/dmenu替代品 Carlisia推荐 - Remote Go Meetup和Sourcegraph Chrome扩展 Sarah推荐 - API Blueprint规范 发现遗漏或错误?欢迎提交PR!

双语字幕

仅展示文本字幕,不包含中文音频;想边听边看,请使用 Bayt 播客 App。

Speaker 0

我是莎拉·亚当斯,欢迎收听Go Time。

I'm Sarah Adams, and this is Go Time.

Speaker 1

Go Time是一档每周播出的播客,我们在这里讨论与Go编程语言、社区以及相关的一切有趣话题。

It's Go Time, a weekly podcast where we discuss interesting topics around the Go programming language, the community, and everything in between.

Speaker 1

如果你目前正在使用Go,或者希望学习Go,那么这档节目非常适合你。

If you currently write Go or aspire to, this is the show for you.

Speaker 1

好了,各位。

Alright, everybody.

Speaker 1

欢迎再次收听Go Time的另一期节目。

Welcome back for another episode of Go Time.

Speaker 1

这是第五期节目。

This is episode number five.

Speaker 1

今天,我们请来了布莱恩·凯特尔森。

Today, we have Brian Kettleson here.

Speaker 1

打个招呼吧,布莱恩。

Say hello, Brian.

Speaker 2

但我并不在这里。

I'm not here though.

Speaker 2

我这周在旧金山。

I'm in San Francisco this week.

Speaker 2

你好。

Hello.

Speaker 1

确实如此,你有一部分在这里。

That's very true, you're part here.

Speaker 1

反正你也不在,这全是虚拟演播室。

You're not here anyway, this is all virtual studio.

Speaker 1

没错。

That's true.

Speaker 1

我们这里还有卡莉西亚。

We also have Carlicia here.

Speaker 3

我也不在那里,我在圣地亚哥。

I am also not there, I am in San Diego.

Speaker 3

大家好。

Hello everybody.

Speaker 1

今天节目中,我们有一位特别嘉宾,莎拉·亚当斯,你们大多数人认识她,她是工程师、演讲者,也是“女性去Go”组织的创始人。

And today on the show we have a special guest with us, Sarah Adams, who most of you know as engineer, speaker and also the founder of Woman Who Go.

Speaker 0

嗨。

Hi.

Speaker 1

你好吗,莎拉?

How are you Sarah?

Speaker 0

我也在一个城市,旧金山。

I'm in a city too, San Francisco.

Speaker 1

所以今天所有人都在加利福尼亚,就我不在吗?

So is everybody in California but me today?

Speaker 2

没错。

That's correct.

Speaker 0

听起来是这样。

Sounds like it.

Speaker 1

我知道我被排除在外了。

I knew I was getting left out here.

Speaker 2

埃里克,我们这儿可是严重怕错过啊。

We have some serious FOMO going on Eric.

Speaker 2

害怕错过。

Fear of missing out.

Speaker 1

但你看,我可比你们先吃晚饭。

But see, I'll be having dinner before you guys though.

Speaker 1

我们结束后,我的工作就少了。

I have less work when we're done.

Speaker 2

你知道吗,在外面的问题是,我孩子会在凌晨三点给我发短信。

You know, the problem with being out here is that my kids start sending me text messages at three in the morning.

Speaker 0

哦,是啊。

Oh yeah.

Speaker 1

是啊,和孩子及家人同步时间总是挺难的。

Yeah, that's always rough to get kinda like synced up with the kids and family.

Speaker 1

整个事情是,你以为三个小时不算长,但其实像过了一辈子。

The whole thing is, you think three hours isn't that long, but it's a lifetime.

Speaker 2

确实很多,没错。

It's a lot, it is.

Speaker 1

当你吃晚饭时,大家都已经睡觉了;当你起床时,大家已经开始吃午饭了。

Everybody's going to bed before you're having dinner and everybody's like having lunch when you're waking up.

Speaker 1

那是什么?

What's that?

Speaker 2

这周我们有很多事情要谈。

We've got a lot to talk about this week.

Speaker 2

我觉得我们应该直接开始。

I think we should dive in.

Speaker 2

发生了很多事。

A lot happening.

Speaker 1

是的,上周我们聊了一点关于1.7版本的内容,以及其中一些性能改进。

Yeah, so last week we talked a bit about the 1.7 stuff and some of the performance change improvements there.

Speaker 1

在过去这一周里,Dave Cheney 制作了一些关于这些改进的可视化图表,真的让我大吃一惊,因为我虽然知道有改进,但没想到我们已经消除了百分之十四和百分之十六之间一半以上甚至更多的差距。

And over this past week, Dave Cheney put together some visualizations of that which really kind of blew my mind because I knew there was improvements but we've cut what, less than half or more than half the difference between one point four and one point six out of the way.

Speaker 2

我的意思是,我们正在回到以前的水平。

I mean we're We're getting back to where we were.

Speaker 2

这太棒了,因为 Go 的编译速度本来就很棒,现在又能恢复到不可思议的快速水平,真让人高兴。

Which is fabulous because Go has really great compile times and it's nice to see that coming back down to insanely great.

Speaker 1

然后我期待看到编译速度能降到比 1.4 还要快。

And then I'm looking forward to seeing it pre or less than one four.

Speaker 1

那将是一个了不起的成就。

That'd be a great achievement.

Speaker 1

想象一下,速度甚至能超过 1.4 时的水平。

Imagine being even faster than one four was.

Speaker 3

这可能吗?

Is it even possible?

Speaker 3

有这个可能吗?

Is it on the cards

Speaker 2

只要有SSA,一切皆有可能,你有看过负责这个的团队吗?

Anything's possible with SSA and have you seen the team working on that?

Speaker 2

这群天才一定会让这事成真。

The brain trust will make it happen.

Speaker 2

我有,谁在

I have Who's

Speaker 0

负责这个?

working on it?

Speaker 1

我正想是谁在具体负责这个功能,就是那个SSA相关的,你还记得Brian吗?具体是哪个团队在做SSA的工作?

I'm trying to think of who's specifically working on that functionality, see that one I Do you remember Brian, who the specific team was working on the SSA stuff?

Speaker 2

我不清楚整个团队的名单,不记得了。

I don't know the whole list of team, no.

Speaker 1

那我们查一下,然后放到节目笔记里。

So we'll look that up and then we'll put it in the show notes.

Speaker 2

这周另一个大新闻是,context包现在将被纳入标准库。

So other big news this week, the context package is now going to be in standard live.

Speaker 2

这太重要了,非常重要。

This is huge, huge.

Speaker 2

我对此非常兴奋。

I'm so excited about it.

Speaker 0

是的,我也非常兴奋。

Yeah, I'm really excited.

Speaker 2

他们设计的方式真的很棒,如果你使用的是 1.7 版本,它会使用标准库中的那个;如果你没有使用 1.7,它将继续使用 net 包中的那个。

The way that they've engineered it is really nice too so that if you're using 1.7, it'll use the one in standard lib and if you're not using 1.7, it will continue to use the one in the net package.

Speaker 2

这真是太棒了。

So that's really awesome.

Speaker 1

是的,这太棒了,因为 gRPC 和所有那些东西都依赖于 context 包,我们已经用了很久了,久得我都记不清了。

Yeah, that's fantastic because gRPC and all that stuff depends on the context package and we've been using that for, I don't even know how long that's been floating around.

Speaker 1

我很高兴看到它被正式纳入了。

I'm really glad to see it kind of pulled in.

Speaker 1

还有,莎拉,你刚才提到过 context 包的事?

And Sarah, you were saying something about a context package?

Speaker 0

是的,不,我只是很高兴它能进入标准库。

Yeah, no, I'm just excited for it to be in the standard library.

Speaker 0

真是个不错的补充。

Just cool addition.

Speaker 1

希望更多人会在他们的包中使用它,尤其是在处理网络请求之类功能时,因为它的真正强大之处在于能够将上下文一直传递下去,以便你随时可以取消所有操作。

And hopefully a lot more people will start using it as part of their packages where they expose kind of network requests and things like that, because that's really the power in it is having the context kind of forwarded along so that you can stop it anywhere All in

Speaker 2

各位库开发者,如果你们还没有把上下文作为公共函数的第一个参数,现在是开始这样做的绝佳时机,请务必这样做。

you library developers out there, if you're not putting context as the first parameter of your public functions, now is a great time to start doing that please.

Speaker 1

重点是

The emphasis

Speaker 2

我想说的是,请务必这样做。

Please, is on wanted to say please.

Speaker 2

我不想显得太专横。

I don't want to sound too bossy.

Speaker 2

我有时候可能会给人这种感觉。

I can come across that way sometimes.

Speaker 3

根据我有限的Go语言使用经验,我经常看到人们使用其他网络包只是为了能获取上下文,我甚至也这么做过,因为我懒得亲手做这些事情。

And from my little experience, from the little experience that I have with Go, I see a lot of times when people use other network packages just so they can get the context, and I would even do that because I don't wanna do that stuff by hand.

Speaker 3

但现在它已经进入标准库了,我不禁想知道,这会对其他外部库的使用产生多大影响,或者人们是否还得不断添加新功能,让这些库对用户更有吸引力。

But now that it's in the standard library, I just I wonder how it's if it's going to impact the usage of other, their external libraries, or if people are just gonna have to keep ahead and keep adding more features to make it more attractive for people to use them.

Speaker 1

但话说回来,这真的算竞争吗?

But I mean, is it really a competition though?

Speaker 1

我认为归根结底,关键是写出高质量且可读性强的软件。

I think at the end of the day, it's about writing good quality software and that's readable.

Speaker 1

我认为,只要有人真正喜欢某些外部库,我们就能在这些模式上达成共识。

And I think that by having external libraries that people really like, and we kind of get consensus on these patterns.

Speaker 1

我觉得把这些东西纳入标准库是可以的,因为并非每个人都会注意到这些特性,哪怕我们认为它们已经很有曝光度了。

I think it's okay to pull that stuff in because not everybody's gonna be aware of these things despite how much visibility we think they have.

Speaker 1

而人们通常首先会去标准库中寻找工具。

Whereas people find stuff in the standard library, that's generally where people look first.

Speaker 1

所以我觉得这是一个很难争论的问题,对吧?

So I think it's a hard debate, right?

Speaker 1

我们某种程度上把用户从一些标准库中拉走了,但我认为这些库的维护者看到它被纳入标准库应该会很高兴。

We're kind of pulling away users from some standard library, but I think that the library owners are probably glad to see it there.

Speaker 1

因为我觉得它在标准库中也会得到更多的关注。

Because I think it'll get more love in the standard library too.

Speaker 2

而且使用起来肯定更方便。

And certainly be easier to use.

Speaker 0

是的。

Yeah.

Speaker 0

我不知道Gorilla Toolkit会因为这个发生什么变化,因为他们自己实现了一个网络上下文,我想。

I wonder how the Gorilla Toolkit is gonna change because of this because they've implemented their own network context I think.

Speaker 0

我已经有一段时间没用过了。

I haven't used it in a while.

Speaker 2

是的,Gorilla有自己的上下文,世界上每个其他路由库也都有自己的上下文。

Yeah, Gorilla has its own context and every other mux on the planet has its own context.

Speaker 2

我非常期待它们不再维护自己的上下文,希望它们都能统一使用标准库中的上下文。

I'm really excited about them not having their I own hope that they all converge to use the standard live context.

Speaker 1

这其实真的很有趣,我之前都没想过这一点。

That's actually really interesting, I hadn't even considered that.

Speaker 1

我的意思是,过去几年我用过 Gorilla mux,但我好像很久没用过 Gorilla 工具包里的其他东西了。

I mean I've used Gorilla mux in the past couple years, but I don't think I've used anything else from the Gorilla stuff in a while.

Speaker 1

所以看到它如何适应这一点会非常有趣。

So that'll actually be really interesting to see how that's adapted to this.

Speaker 0

是的,而且我觉得 Gorilla mux 甚至导入了它自己的 Gorilla 上下文。

Yeah, and I think the Gorilla mux even imports its own Gorilla context.

Speaker 0

就在 Mux 包内部。

Like within the Mux package.

Speaker 0

所以很有趣的是,他们是否会继续采用标准库上下文。

So it'll be interesting to see if they go forward with Ghostand library context.

Speaker 1

我们应该给他们发邮件问问。

We should email them and ask.

Speaker 3

是的。

Yeah.

Speaker 2

在 GitHub 仓库中提交一个 issue。

Open a issue on the GitHub repo.

Speaker 1

也许他们的开发者中就有一位是我们的两位听众之一。

Maybe one of their developers is one of the two listeners.

Speaker 1

好吧,我最近一直在用的另一个项目是 Vendor Check。

All right, so one of the other projects that I've been using recently is Vendor Check.

Speaker 1

我注意到他们更新了,现在能告诉你哪些依赖项已被弃用,这太棒了。

And I noticed that they got an update that now tells you your deprecated dependencies, which is awesome.

Speaker 1

基本上,它会扫描你的 vendored 路径,只需加上 -U 参数,就能列出所有未使用的依赖项。

So basically it goes through your vendored path and it's just a minus U flag and it'll tell you all your unused This

Speaker 2

这很有趣,因为我们在上一期节目中讨论过这个工具的起源文章——Cloudflare 关于创建最简 SSA 工具的博客文章。

is interesting because we talked about the blog post that this originated from in our last episode, the Cloudflare blog post about creating the simplest possible SSA tools.

Speaker 2

所以 VendorCheck 是对该文章的延伸,很高兴它现在增加了实用的功能。

So VendorCheck was an extension of that and it's nice that it's getting some very usable features.

Speaker 2

有必要时清理 vendor 目录会很有帮助。

It'll be good to get that vendor directory pruned as needed.

Speaker 3

在我看来,VendorCheck 几乎应该和 thumbed 并列。

It sounds to me almost like VendorCheck should be right side by side with thumbed.

Speaker 0

是的,还有 Go 的导入。

Yeah and Go imports.

Speaker 2

这绝对是必备工具。

It's definitely a must have tool.

Speaker 1

是的,我认为在供应商相关功能被 Go 团队采纳之前,这些内容可能还为时过早,对吧?

Yeah and I think that the vendor stuff is probably early for that stuff to kind of get pulled in at least adopted by the Go team, right?

Speaker 1

因为说实话,最近才逐渐达成共识,认为 Go 工具链或许应该更好地处理供应商管理。

Because I mean it's only been recently that there's been kind of this agreement that maybe the Go tooling should handle vendoring more.

Speaker 1

所以很有趣的是,看看他们认为应该整合多少内容。

So it'll be interesting to see how much they think should be pulled in.

Speaker 1

但我预计我们会开始看到像 Vim Go 这样的工具,以及各种元工具,逐步集成这些功能。

But I imagine we'll start seeing tools like Vim Go and all that jazz incorporating in this and some of like the meta tooling.

Speaker 1

但还有 Go Metal Linter 这样的工具,它们会运行一整套不同的工具。

But there's a Go Metal Linter and stuff like that that runs all the suite of different tooling.

Speaker 3

我也完全能看到这种情况发生。

I totally see that happening too.

Speaker 2

说到这里,关于将供应商工具内置到 Go 本身的想法,我知道安德鲁·杜兰德曾提到,计划在 7 月 13 日的 GopherCon 黑客日上赞助一场约一小时的演讲或小组讨论,主题是打包和供应商管理。

So on that note, on the idea of having vendor tooling being built into Go itself, I know that Andrew Durand was talking about sponsoring a talk or a panel discussion on the Hack Day at GopherCon on the July 13 for an hour or so talking about packaging and vendoring.

Speaker 2

所以,如果你对这个问题有强烈看法,不妨在七月前往丹佛,与 Go 团队直接交流关于包管理和供应商管理的问题。

So if you've got strong opinions on that, might want to come to Denver in July and get together and talk to the GO team directly about package management and vendoring.

Speaker 2

这将是一个绝佳的机会,让你的声音被听到。

That would be a great opportunity to have your voice heard.

Speaker 1

总的来说,强烈的观点也很重要,我知道他们正打算组织一场非正式的小组讨论或协作会议,邀请主要的 Go 用户参与,了解大家的痛点,以及人们认为 Go 团队如何能缓解这些痛点,让采用和使用 Go 更加容易。

And strong opinions in general, I know that they're wanting to do kind of a panel discussion or not panel, but a collaborative session with big Go users and kind of seeing what pain points are there and how people feel that the Go team can ease those pains and make it easier to adopt and use Go or easier, I should say.

Speaker 3

关于这个话题,Go 仓库中已经开启了一个议题,把大家的意见都集中到一个地方,至少会链接到相关资料,如果你打算参加这个活动并参与讨论,这很值得阅读。

And on that topic, there is an issue opened on the Go repo where they just pull in everybody's opinion into one place, at least they put links to things and it's probably something good to read through if you are going to go to this event and discuss.

Speaker 3

所以我们掌握了所有信息。

So we have all the information.

Speaker 2

这是一个非常长的议题。

It's a really long issue.

Speaker 3

是的,这很长,但并不是Go团队在支持某种方式,而是汇集了大家的意见,原原本本地呈现出来。

Yeah, it's huge, but it's just, it's not the gold team endorsing any way or another, but any opinion or other, it's just gathering everybody's opinion in one place and giving it as it is.

Speaker 3

好吧,这就是人们在说的,我们就把它们放在这里,避免到处重复。

Okay, this is what people are saying, let's just have it here, so we're not replicating this all over the place.

Speaker 3

所以我们有了一个起点。

So we have a starting point.

Speaker 3

我们不必再回头讨论已经谈过的事情。

We don't have to go back and talk about things that we already talked about.

Speaker 3

所有内容都在这里了。

So it's all in there.

Speaker 3

这非常、非常有趣。

It's very, very interesting.

Speaker 1

我得在周末的时候找出来看看,或者有更长的空闲时间时再看,是的。

I'll have to pull that up when I have a weekend It's or however longer a than it weekend, yeah.

Speaker 1

我只能想象。

I can only imagine.

Speaker 3

嗯。

Yeah.

Speaker 1

这简直就是时间旅行。

It's plain time traveling.

Speaker 3

这就像轻松阅读,充满了对技术实现方式的深思熟虑的表达。

It's like light reading, it's very thoughtful expressions of how things could be done technically.

Speaker 3

我会找到它。

I'll find it.

Speaker 3

我会找一个链接。

I'll find a link.

Speaker 3

太棒了。

Awesome.

Speaker 1

说到令人难过的消息,有人看到罗布·米勒发给Hecca邮件列表的那封邮件了吗?

So on a sad news side of things, did anybody see the email that Rob Miller sent out to the Hecca mailing list?

Speaker 2

我看到了。

I did.

Speaker 3

现在怎么办?

Now what?

Speaker 2

太悲伤了。

Very sad.

Speaker 1

是的,罗布·米勒在Mozilla工作,负责一个叫Hecca的工具。

Yeah, so Rob Miller works for Mozilla on a tool called Hecca.

Speaker 1

布莱恩,你如何最好地描述Hecca?

How would you best describe Hecca, Brian?

Speaker 2

Hecca是一个流处理工具,你可以用它来接收输入,进行处理、分析、做各种奇怪的操作,然后将结果发送到其他地方。

Hecca's a stream processing tool that you can use to take inputs and process them and munch them and do strange things with them and send them back out to other places.

Speaker 2

它是最

It's one

Speaker 1

of

Speaker 2

Hecca最常见的用途之一是日志聚合与管理,但它远比这复杂得多,不过最合适的用途还是将日志从一处传输到另一处。

the most common use cases for Hecca would be log aggregating and management but it's significantly more complicated than that but that's probably the best use case for it is moving logs from here to there.

Speaker 1

是的,它基本上就像一个管道,你可以替换不同的输入组件。

Yeah it's basically like a pipeline and there's different inputs you can swap out.

Speaker 1

比如收集器和发射器之类的。

So collectors and emitters and things like that.

Speaker 1

因此,你可以从各种不同的系统中获取输入,并输出到多种类型的系统中。

So you can take inputs from various different types of systems and you can output to various types of systems.

Speaker 1

曾经有一个非常有趣的项目,他在2014年的GopherCon上展示了它。

There was a really interesting project and he presented it at GopherCon twenty fourteen.

Speaker 1

而且据各方面反馈来看,似乎有人在使用它。

And I mean, by all accounts, it seems like people are using it.

Speaker 1

但我认为他一直是该项目的主要维护者,而Mozilla内部已经在使用其他工具,他没有时间,未来也会越来越没时间。

But I think he's been primarily the core maintainer of it and they're using something else internally at Mozilla and he hasn't had the time and is going to continue to have less time.

Speaker 1

所以我认为这很可能将会——我不确定‘弃用’这个词是否准确。

So I think that that's probably going to be I don't know whether deprecated is the right word for it.

Speaker 2

也许是Mozilla停止支持或取消赞助。

Discontinued Mozilla support perhaps or Mozilla sponsorship.

Speaker 1

我认为他们愿意让其他人接手这个项目,但他们自己也没有时间来协助完成这个交接。

And I think that they're open to somebody else taking over the project but they don't have the time to help facilitate that takeover either.

Speaker 1

我认为他表达了一些担忧,关于该项目所采用的设计模式,特别是他们使用通道的方式并没有达到他们期望的性能水平,类似这样的问题,他认为可能需要进行大量的重构。

And I think he expressed some concerns about even the patterns that was designed under that the the way they were using channels wasn't quite hitting the performance levels that they were wanting and things like that, and he kind of believed that there'd be some heavy refactoring.

Speaker 1

也许我们可以请他来节目中,更深入地谈谈他的想法。

And maybe we can get him on the show and talk about it a little bit more in-depth, what his thoughts are.

Speaker 2

这是个绝佳的主意。

That'd be a great idea.

Speaker 2

我们会在节目笔记中链接到他的邮件公告,虽然内容太长,无法在这里详谈,但他在邮件中传达的主要观点是:要让 Hecca 的性能显著优于当前水平——而当前的性能其实已经相当扎实——但要达到下一个层次,就需要减少对通道的使用。这或许会是我们未来一个很好的节目主题,即讨论在高负载下通道的性能表现,以及通道在什么情况下表现优异、在什么情况下并不合适。

We'll link to the mail list announcement in our show notes and it's way too long to discuss here but the main takeaway from the email that he sent out was that the refactoring required to make Hecca perform significantly better than it does now which is actually really solid performance but to get to that next level, it would require less use of channels and that's probably a good show topic for us at some point is talking about the performance of channels under significant load and when channels are great and when they aren't.

Speaker 3

这将是一个极棒的话题。

That would be an amazing topic.

Speaker 3

我相信很多人能从中受益。

I'm sure a lot of people can benefit.

Speaker 3

我本人也能从中受益。

I can benefit from it.

Speaker 1

在我们深入讨论莎拉最近在做的各种事情之前,我们通常会浏览一些有趣的 Go 项目,因为布莱恩简直就是个项目百科全书。

So before we get into some discussions about all the things that Sarah is doing these days, We typically go through some like interesting go projects because Brian just is like full of just this encyclopedia of projects.

Speaker 1

但在我们开始之前,我们不再需要布莱恩了。

But before we go into that, we don't need Brian anymore.

Speaker 1

你们有没有看到最近流传的 LibHunt 这个东西?

Have you guys seen the LibHunt thing that was going around?

Speaker 1

没有。

No.

Speaker 1

现在有了 GoLibHunt。

There's now the GoLibHunt.

Speaker 1

网址是 go.libhunt.com。

It's go.libhunt.com.

Speaker 1

你可以浏览并分类 Go 语言的项目和库,它们

And you can basically browse around, categorize projects and libraries in Go they

Speaker 2

只是简单地排名而已,有人列出一堆 Go 库并不能取代我的精选,埃里克。

kind Just of rank because somebody lists a bunch of libraries in Go does not replace my curation, Eric.

Speaker 2

我每周为精选项目所做的整理工作所带来的附加价值才是关键。

The added value that I bring every week to the curation of cool projects is what's important here.

Speaker 2

你无法用一个 Bash 脚本来取代我。

You cannot replace me with a Bash script.

Speaker 1

我们可以试试,真的可以试试。

We can try, we can try.

Speaker 0

瑞安,你的流程是怎样的?

Ryan, what's your process?

Speaker 0

你怎么找到这些 Go 项目?

How find do the Go projects?

Speaker 2

每天晚上睡觉前,我都会去看看 Golang 的 Reddit 页面,看看有没有什么有趣的内容。

Before I go to bed every night, I look at the Golang Reddit thing just to see if there's anything interesting there.

Speaker 2

我现在从 Reddit 上收获不多,但我有一个专门的 GitHub 查询,用来查看最近更新或新创建的 Go 项目,然后我会浏览一遍,寻找那些听起来令人兴奋且我之前没见过的东西。

I don't get a lot out of Reddit these days but I have a special query on GitHub that I use to see recently updated or recently created Go projects and I just scan through them looking for things that sound exciting that I haven't seen before.

Speaker 1

这个查询只需三笔轻松付款,每笔 59.9 美元。

And that query can be for just three easy payments of $59.9

Speaker 2

没错,实际上我很乐意把那个查询语句放在节目笔记里,因为这没什么神奇的,只是一个非常长的 GitHub 查询。

Exactly And actually I'd be happy to post that query in the show notes too because there's nothing magic to it, it's just a really long GitHub query.

Speaker 0

我以前用过一个应用,不叫 StumbleUpon,但功能类似,可以浏览并设置过滤器,比如 Go 项目之类的,它会扫描 GitHub,帮你发现相对热门的 Go 项目。

I used to use, I had an app, it wasn't called StumbleUpon but it was something like that where it acts like StumbleUpon where you can look through, and you can have filters like a Go project or whatever, it looks through GitHub and helps you stumble upon Go projects that are relatively popular.

Speaker 0

这挺酷的。

That's pretty cool.

Speaker 2

这不错。

That's nice.

Speaker 2

所有这些查询都容易出错,因为如果 GitHub 对项目类型的识别不准确——比如你没有在根目录下放任何 Go 文件,或者他们用来识别项目的依据有问题——项目就可能被排除在外,而这

All of those queries are prone to error because if GitHub's detection of the project type isn't accurate because maybe you don't have any Go files in the root or whatever they use to detect the projects, they might be excluded and that's

Speaker 0

这常见吗?

Is that common?

Speaker 2

很常见。

It is.

Speaker 2

我见过一些项目,明明是某种语言写的,却没有被标记为该主要语言,这是因为 GitHub 用来识别的机制被它们的目录结构之类的因素干扰了。

I've seen projects that don't list themselves as the primary language that they are just because whatever GitHub uses to detect that was thwarted by maybe their directory layout whatever.

Speaker 1

我不确定这个检测机制是如何工作的。

I'm not sure how that detection works.

Speaker 1

我的意思是,它是根据代码库的什么比例来判断的,比如你有Grafana,对吧?

I mean, whether it's like what percentage of the code base is and what, because I mean, you had like say Grafana, right?

Speaker 1

那里面有很多Go代码,但也有大量的网页内容,比如HTML、CSS和JavaScript。

That's a bunch of Go, but it's a whole lot of web stuff to HTML and CSS and JavaScript too.

Speaker 1

所以是哪种语言的代码更多一些呢?还是说这取决于

So is there more than More of one than the other, and does that

Speaker 3

我一直都想了解一下。

cost I have always wanted to.

Speaker 3

如果有人知道的话,请告诉我。

If somebody knows, please.

Speaker 0

你创建仓库时也可以手动指定语言吗?真的吗?

You can also specify when you're creating a repo Really?

Speaker 0

项目的语言。

Language the project is.

Speaker 0

嗯,我认为它能帮助你生成.gitignore文件。

Well, I think it just helps you then generate the gitignore.

Speaker 3

我从来没看过这个。

I've never seen that.

Speaker 0

有意思。

Interesting.

Speaker 0

但我不确定他们是否会保存这些数据。

But I'm not sure if they keep that data.

Speaker 2

是啊,不知道他们是否把这作为元数据存储。

Yeah, wonder if they store that as metadata.

Speaker 2

我从来没专门这么做过,所以我不清楚。

Never done that specifically, so I don't know.

Speaker 1

就像莎拉说的,我觉得我只用过一次,只是为了生成.gitignore文件。

Like Sarah said, I think I've only used it once just to generate the gitignore.

Speaker 2

所以现在埃里克试图用一个网站取代我,是时候了。

So now that Eric has tried to replace me with a website, it's The time is on.

Speaker 2

我们节目的下一个环节是每个人谈谈过去一周偶然发现的有趣Go项目,我先来吧,毕竟我带来的最有价值。

The next segment of our show is where we each talk about interesting GO projects that we've perhaps stumbled upon in the past week and I'll start since I'm bringing the most value here.

Speaker 2

埃里克,我现在真的对你很生气。

Really angry with you Eric now.

Speaker 2

这行不通。

This isn't gonna fly.

Speaker 2

我这周发现的一个特别酷的东西,是之前提到过的Minio和Kubernetes的结合。Minio是一个S3对象存储的克隆,你可以部署在自己的硬件或云上,提供一个兼容S3的对象存储池;而另一个很棒的项目就是Kubernetes。

So the thing I found this week that I thought was really cool was a combination of one that I talked about previously which is Minio, S3 object storage clone that you can deploy on your own hardware or on the cloud somewhere that gives you an S3 compatible object storage pool and another project that is awesome which is Kubernetes.

Speaker 2

Dais团队——一个基于Kubernetes的平台即服务——为Kubernetes开发了一个Minio存储插件,让你可以用Minio的S3存储来为Kubernetes集群提供存储,它与Kubernetes的集成非常紧密,看起来非常棒。

So the Dais team, Dais is a platform as a service on top of Kubernetes, they created a Minio storage plugin for Kubernetes so you can use Minio S3 storage for your Kubernetes cluster and it's got some really tight integration with Kubernetes, looks really awesome.

Speaker 2

所以,两种绝佳的口味组合在一起,再次变得无比美味——那就是Minio和Kubernetes。

So two great tastes that taste together, that taste great together again, which is Mineo and Kubernetes.

Speaker 2

项目地址是:github.com/deis/mineo。

That's at github.com/deis/mineo.

Speaker 1

接下来我来说。

So I will go next.

Speaker 1

我很久以前就看到过这个,当时它还处于非常早期的阶段,那就是 Lime Text,一个用 Go 编写的 Sublime Text 克隆。

I saw this a while back and I think it was really in its infancy, which is Lime Text, which is like a Sublime Text clone, but written in Go.

Speaker 1

而且它现在进展得相当不错。

And it's actually been coming along quite well.

Speaker 1

我其实很好奇 Carlicia 是否试过,因为我知道你是个

And I was actually curious whether Carlicia had tried it because I know you're a

Speaker 3

Sublime 用户,

sublime user,

Speaker 0

对吧,Carlicia?

right Carlicia?

Speaker 3

不,我不是。

No, I'm not.

Speaker 1

我以为你是 Sublime 用户呢。

I thought you were a sublime user.

Speaker 0

我以前是盲目的。

I used to blind.

Speaker 3

我用过,但很久以前就停止用了

I've used it but Have I stopped using it a long

Speaker 1

你试过吗,莎拉?

you checked it out, Sarah?

Speaker 0

没有,我没用过。

No, haven't.

Speaker 0

我正在看它。

I'm looking at it right now.

Speaker 1

是的,这其实挺有意思的,因为我是离不开Vim的,但我觉得如果你能离开Vim,可能就会选Sublime,而这个工具让人有点心动,因为如果我想修改编辑器,我真的可以做到,而且还能继续用。

Yeah, so this is actually pretty interesting because I mean, you can't get me away from Vim but I feel like if you could, it might be sublime and this makes it kind of enticing because if I wanted to modify the editor, I could actually do it and go.

Speaker 2

从另一个角度来看,它几乎模仿了Emacs和NeoVim的服务器-客户端架构。

Well it's interesting from another perspective in that it's almost modeled on the Emacs and NeoVim server and client model.

Speaker 2

所以Lime Text应用有一个后端,然后可以有多个前端,你可以用命令行工具来使用Lime Text,或者他们也提供了一个基于QT的图形界面编辑器,但后端保持不变。

So the Lime Text app has a backend and then it can have multiple frontends so you could actually use a command line app to use Lime Text or they've got a QT based editor for a graphical environment but the backend stays the same.

Speaker 2

因此,我认为在Go语言编写的文本编辑器中,这一点让它显得独一无二,也让我觉得它更有趣了。

So that makes it unique I think in terms of Go based text editors that certainly made it more interesting to me.

Speaker 3

不过我还是想试试看。

I do wanna check it out though.

Speaker 3

是啊,我是Atom用户,用它搭配Vim插件,但这个看起来很酷。

Yeah, I'm an Atom user, I use it with the VIM plugin but this looks cool.

Speaker 1

我不知道我为什么以为你用Sublime,但现在我想起来了,Adam,因为你确实提到过为Adam新增了一组插件。

I don't know why I thought you used Sublime, but now I remember Adam because you did bring up a new set of plugins for Adam.

Speaker 1

那不是上一期,是上上期。

That wasn't last episode, it was the episode before.

Speaker 1

所有

All

Speaker 3

这些编辑器在很多方面看起来都差不多。

these editors look a lot the same in a lot of ways, so.

Speaker 1

我跟不上所有新编辑器的步伐。

I can't keep up with all the new editors.

Speaker 3

莎拉,你有想提到的Go项目吗?

Sarah, do you have a Go project you wanted to mention?

Speaker 1

随时可以说不。

Feel free to say no.

Speaker 0

没有,我没有。

No, I didn't.

Speaker 0

我没有。

I didn't

Speaker 3

所以我会接着来。

prepare So I'll go next.

Speaker 3

我发现了这个HDR直方图,虽然我没用过,但我感觉我会用它。

I found this HDR histogram and it's not something I have used, but I can see myself using it.

Speaker 3

它会跟踪传入请求的样本数量,也就是你收到的请求数量。

It keeps track of a sample count of basically incoming requests, how many simple counts of incoming requests that you have.

Speaker 3

然后你可以指定想要观察随时间变化的内容。

And then you can specify what it is that you wanna look at over time.

Speaker 1

所以这个是显示每秒请求数随时间的变化吗?

So this is showing like a request per second over time or?

Speaker 3

我认为这是每秒请求数。

I think it's request per seconds.

Speaker 2

我以前用过这个包,我觉得它比单纯的每秒请求数更通用,实际上它是一个直方图包,可以用来收集任何特定事件的指标并以直方图形式展示。

I've used this package before, I think it's more generic than just request per second, I think it's actually just a histogram package that you can use to collect metrics about any particular event and then present them in a histogram.

Speaker 2

每秒请求数是当你在网站上收集指标时使用它的绝佳例子。

Request per second is a great example of how you would use it if you were collecting metrics on a website.

Speaker 3

没错,看起来就是这样。

Exactly, it looks like that.

Speaker 3

它是可配置的,我之所以发现这个工具,是因为他们有一个这个工具的 Go 版本。

It's configurable the interesting, the way that I found about this was because, they have a package, they have a Go version of this.

Speaker 3

我之所以发现它并觉得它相关,是因为我去年看了 Juteen 在 Strange Loop 上的一场演讲,我不确定这个名字发音是否正确,他谈到了网络图通常只展示 95 百分位的响应时间,也就是最差的响应时间。

And the way I found about this and why it's relevant is because I saw a talk by Juteen, I don't know if that's how it's pronounced, on Strange Loop from last year and he was talking about how network graphs usually show us the 95 percentile of, you know, the worst response times that you get.

Speaker 3

他进一步详细说明了这种做法有多无意义,以及它如何掩盖了你真正想看到的信息——即实际的计数和实际的最大值。

And he goes on to talk about, in detail about how meaningless that is and how much it hides the information that you really want to see, which is the actual count, the actual max.

Speaker 3

他还进一步讨论了服务时间与响应时间之间的区别,这非常有趣,因为你虽然知道,但通常不会从这些角度去思考,不过确实很有道理。

And he also goes on to talk about the difference between service time and response time and it's fascinating because you kinda know, you don't, I don't know, I don't usually think about in those terms but yeah, it makes total sense.

Speaker 3

这是一场非常精彩的演讲,如果你想要监控你的系统,而你正在使用的是一些常见的商业工具,也许你应该看看这个。

It's a fascinating talk and if you want to monitor your stuff and what you are using is the usual commercial tools that are out there, maybe you should check this out.

Speaker 3

就这样。

That's it.

Speaker 3

我们可以提供链接。

You can, we will have links.

Speaker 2

你会把链接放到节目笔记里吗?

Will you put that link in the show notes?

Speaker 3

会的,我已经加好了。

Yes, I already did.

Speaker 3

就在这里。

There it is.

Speaker 2

完美。

Perfect.

Speaker 1

所以,Sarah,我们非常想听你谈谈你的那个从测试生成文档的项目。

So Sarah, one project that we would love to hear you talk about is your test to doc.

Speaker 0

哦,当然,好的。

Oh sure, yeah.

Speaker 1

这太酷了。

That's really cool.

Speaker 0

谢谢。

Thanks.

Speaker 0

所以大约一年半前,我有了这个想法,当时我在一家叫Sproutling的公司工作,我们正在开发一款可穿戴婴儿监护仪,我负责构建一个拥有多个客户端的REST API。

So I got this idea like a year and a half ago, I was maintaining a REST API for, while I was working for a company called Sproutling, we were building a wearable baby monitor And so I was building a REST API that had multiple clients.

Speaker 0

我们有定制的硬件,这是一种基站,用于监测婴儿房间的室温等数据。

We had custom hardware, which was sort of a base station that was monitoring room temperature and stuff in the baby's room.

Speaker 0

我们还有一个iOS应用,作为第二个客户端,以及一个网页应用,作为第三个客户端。

We had an iOS app, which was a second client and we had a web app, which was a third client.

Speaker 0

因此,每个客户端都有独立的开发团队在负责。

And so we had multiple developer teams working on each of these.

Speaker 0

由于我是唯一负责REST API的人,当然,我需要有API文档。

And so since I was the only person responsible for the REST API, well, not because of that, but I needed to have API documentation of course.

Speaker 0

所以我开始使用 Apiary,因为我喜欢它的格式,可以用 Markdown 编写,而且他们的 API 蓝图规范是开源的,这很好。

So I started using Apiary because I like the format, was, it's, you can write it in markdown and their specification, the API blueprint specification is open source, which is nice.

Speaker 0

但对于较大的更改,比如添加或删除端点,我还能记得更新文档。

And but I kept it like so for larger changes like adding an endpoint or, know, deleting an endpoint, those were easy to remember to update the documentation.

Speaker 0

但像删除某个属性,甚至到删除数据库表中的某一列这样的小改动,会间接影响到端点,导致 JSON 响应中字段缺失。

But for smaller things like deleting an attribute on a or all the way down to like deleting a column on a database table would trickle up to the endpoint change, which mean the which would mean the field was missing on the JSON response.

Speaker 0

这些小改动积累得越来越多,导致我的文档经常与实际 API 不一致。

Those smaller changes started to add up a lot and so my documentation was often really inconsistent with the actual API.

Speaker 0

于是我开始 fork 了一个叫 Dread 的工具,它用于将文档与实际 API 进行比对测试。

And so I started just, I forked a tool called Dread, which is meant for testing your documentation against your actual API.

Speaker 0

这个工具效果不错,但我必须定期手动运行它并更新所有文档。

And it was pretty good but I had to sort of periodically just run this and update all of the documentation.

Speaker 0

于是我变得非常沮丧,因为我的单元测试都已经写好了。

And so I started to get really frustrated because my unit tests were all there.

Speaker 0

我的单元测试都摆在那儿,如果我的同事们能读我的 Go 单元测试并用它们当文档,那该多好啊。

They were all like I mean, if only my fellow engineers could read my Go unit tests and use that as documentation, like that would have worked great.

Speaker 0

于是我意识到,API文档所需的所有信息都包含在端点处理程序的测试中。

And so I realized that all of the information that you need for API documentation is in the endpoint handler test.

Speaker 0

于是我决定,就在测试运行时记录请求和响应,将它们以适当的格式存入Markdown文件,从而自动生成并托管所有的API文档,实现完全自动化。

And so I decided I was just gonna record the requests and responses as the test ran and put them in a markdown file in the appropriate format and then be able to generate all of my API documentation and host it and have everything be automated.

Speaker 0

这样我就再也不用担心文档过时、开发人员生气,或者有人不断问我问题了。

So I would never have to worry about out of date documentation and angry developers and people asking me questions and things like that.

Speaker 0

所以,这就是这个想法的由来。

So that's sort of where that came from.

Speaker 2

那么,当你编写测试时,你会如何不同地编写测试,以便让文档看起来更合适呢?

So when you're writing your tests, how much differently do you write your tests to make the documents look appropriate?

Speaker 2

你必须

Do you have to

Speaker 0

完全不用。

Not at all.

Speaker 2

完全不用?

Not at all?

Speaker 0

是的,这非常简单。

Yeah, it's super simple.

Speaker 0

你只需要添加大约六行代码,但本质上,如果你有非常良好、非常全面的单元测试,比如测试用户传入 nil 或传入没有请求数据的帖子,所有这些测试都会被记录下来。

There's like maybe six lines of code that you have to add But essentially, if you have really good, really thorough unit tests, like testing for user passes nil and user passes a post with no request data, and all of that, all of those tests are captured.

Speaker 0

因此,在文档中,你可以看到当传入 nil 时会发生什么。

And so you can see in the documentation, when you pass nil, this happens.

Speaker 0

所以,是的,这些测试其实就是:如果用户发送这样的请求,应有的正确响应是什么?

So, yeah, so the tests are really just, like, if this is the request that the user sends, what should the appropriate response be?

Speaker 0

而这正是文档所要表达的内容。

And that's exactly what documentation is also.

Speaker 1

这真的很有趣。

That's really interesting.

Speaker 1

那么你是如何实现这一点的?

So how do you have that implemented?

Speaker 1

你是静态分析测试吗?

You're statically analyzing the tests?

Speaker 0

不。

No.

Speaker 0

实际上,我很久以前写了这一部分,但我想我用了 HTTP 测试。

Have a Actually, is I wrote this bit a while ago, but I think I used the HTTP test.

Speaker 0

我觉得它们就像是响应。

I feel like they're like response

Speaker 1

报告器之类的东西。

reporters and stuff like that.

Speaker 0

是的。

Yeah.

Speaker 0

所以,实际上,在测试过程中,我会在测试实际执行前暂停,从请求对象本身复制请求体,放到某个缓冲区中,然后执行测试,再在返回前复制响应数据并也放入缓冲区。

So, actually, during the test, I paused the test right before like the actual test executes and copy the request body from just the from the request object itself and put that into a buffer somewhere, then execute the test and then copy the response data before we actually return and put that into the buffer as well.

Speaker 0

当整个测试套件完成后,将缓冲区的内容以适当的格式输出到文件中。

And then when the full test suite is finished, flush that buffer to a file in the appropriate format.

Speaker 0

还有一些其他细节,比如提取请求的 URL 参数,这样在文档中,例如,如果你测试的是获取 ID 为 1 的商品,以及获取 ID 为 2 的商品,它们自然会对应两个不同的 URL。

And there are some other intricacies like pulling out requests URL variables, so that we don't so that in the documentation, for example, if you're testing get widgets with ID one, and then get widgets with ID two, those would naturally be two separate URLs.

Speaker 0

他们正试图弄清楚如何将这两者匹配起来。

They're trying to figure out how to match those two together.

Speaker 0

注意,一和二实际上是变量。

Notice that the one and two are actually variables.

Speaker 0

所以这方面有一些复杂之处。

So there's some intricacies with that.

Speaker 0

URL也是如此,抱歉,是查询参数。

Same with URL sorry, query parameters.

Speaker 1

这个也支持头部逻辑吗?

Is this does this support header logic too?

Speaker 0

是的。

Yep.

Speaker 0

是的。

Yep.

Speaker 0

所有的头部信息也会被记录到同一个缓冲区中。

All your headers are logged also to the same buffer.

Speaker 0

它们是以API蓝图的适当格式编写的。

They're written in the appropriate format for the API blueprint.

Speaker 1

这真是太棒了。

That's really awesome.

Speaker 1

我有点想试试这个。

I kinda wanna play with this.

Speaker 0

是的,真的很棒。

Yeah, it is awesome.

Speaker 0

我非常喜欢。

I love it.

Speaker 0

我在工作中使用它。

I use it at work.

Speaker 1

那么,有没有办法来增强文档呢?

And then, is there a way kind of to augment the documentation?

Speaker 1

比如那些通过监控请求和响应无法捕捉到的内容,你可能想记录下来的备注之类的。

So things that aren't necessarily captured by monitoring the requests and responses, things that you might want to take notes on like Yeah.

Speaker 1

什么样的值才是合适的,或者类似的东西?

What appropriate values are or things like that?

Speaker 0

嗯。

Yeah.

Speaker 0

对于每个包,都会生成一个 API B 文件,你实际上需要做的是有一个——我称之为模板,但其实只是对你的 API 的描述以及一些高层次的内容。

So for each package, a API B file is spit out and so what you actually need to do is have sort of a, I call it like a template but it's really just the description of your API and sort of high level things like that.

Speaker 0

这些内容放在 API B 文件的顶部。

Those go at the top of the API B file.

Speaker 0

所以,当所有测试运行完毕后,你会为每个包得到一个 API B 文件,你需要将它们合并,在这个步骤中,你可以插入一些内容——比如在我现在的公司,我们在文档顶部有一份所有错误和错误代码的列表,这些内容是在我们追加所有 APIB 文件之前生成的。

So once all of your tests have run, you'll get back one API B file per package and so you need to combine them and so during that step you could actually insert, so for my current company we have a list of all of our errors and our error codes at the top of our documentation file and so that's generated right before we append all of the APIB files.

Speaker 0

所以,是的,这完全灵活。

So yeah, it's totally flexible.

Speaker 3

这很酷。

That's cool.

Speaker 1

这个流程是怎样的?

And what's the process for this?

展开剩余字幕(还有 178 条)
Speaker 1

你是做完之后才运行这个工具吗?

Do you just You run this tool after you're done?

Speaker 1

这样你就能提交这份文档了?

So that you're kind of committing this documentation?

Speaker 0

是的,我是把它集成到我们的CI流程中的。当你在功能分支上推送代码,准备合并到开发分支(或你们用的master分支)时,合并后我们会有一个特殊钩子,检测到你在master分支上,就会运行合并的APIB文件脚本,并将其推送到一个单独的分支——仓库里的docs分支,然后让APRA读取这个文件,展示出美观的API文档。

Yeah, so how I have it built into our CI flow, so you push up some code on a feature branch and when it's ready to land into the development branch or whatever you use master, You land that in and then we have a special hook that says, oh, if I'm on the master branch, I need to run the sort of combined APIB file script and push that up to how I have it is I push that up to a separate branch, a docs branch on a repo and then have APRA actually read that file to show like the parsed beautiful API documentation.

Speaker 3

不错。

Nice.

Speaker 3

我刚想到,可以再加一个工具,比较每次推送的差异,生成变更日志或版本记录,那会非常酷。

I just thought about making this, having it also or something, another tool, make a diff between the pushes so you can see like a change log version, that would be really cool.

Speaker 0

是的,那确实很棒。

Yeah, that would be cool.

Speaker 0

我还想添加很多功能,比如已经有几个人要求支持Swagger,我觉得Swagger在API文档中可能比APIB更常见。

And there are a lot of things that I wanna add to this, like a couple people have requested Swagger support and that's I think it's probably more common than API for API documentation.

Speaker 0

That

Speaker 1

是的。

Yeah.

Speaker 1

Swagger 最近真的火起来了。

Swagger has really blown up lately.

Speaker 0

是的。

Yeah.

Speaker 0

不过 Swagger 的有趣之处在于,他们似乎希望你生成所谓的骨架代码。

The interesting thing about Swagger though is they seem to want you to generate your sort of hammer skeletons.

Speaker 0

所以我不太确定这如何融入这种测试生成文档的流程,因为他们真正希望你做的是用规范生成代码。

So I'm not really sure how that fits into this sort of test generates docs flow, because really what they want you to do is have a spec generate this, the code.

Speaker 0

所以这有点循环了,我不知道,总之我不太确定这该怎么实现,我还没试过,拭目以待吧。

So it's sort of cyclical, if you, I don't know, yeah, so I'm not really sure how that's gonna work, I haven't played with it yet, so we'll see.

Speaker 1

是的,它们在工作流的不同环节发挥作用,对吧?

Yeah, they kind of fit in different parts of the workflow, right?

Speaker 1

是的,Swagger 是你根据规范构建,然后生成代码,并确保符合规范;而这个工具是在事后介入,分析你的 API 实际是如何工作的。

Yeah Which it's Swagger kind of, you build to the specification and it spits out code and it knows that it meets it, whereas this tool comes in after the fact and gets insight into how your API works.

Speaker 0

没错,所以这是不同的工作流程。

Exactly, so it's a different workflow.

Speaker 3

这是完美的工作流程。

Here's the perfect workflow.

Speaker 3

你先写规范,运行它,生成Swagger文档,然后用这些文档自动生成代码。

You do your specs, you run it, you spit out the Swagger docs, you run the Swagger docs and that auto generates your code.

Speaker 1

但我认为这很有趣,因为人们喜欢Swagger,但每个人喜欢用不同的方式构建API。

But I think that this is interesting though, because people love Swagger, but everybody likes building their APIs in different ways.

Speaker 1

我们在当前众多构建API的框架中都能看到这种现象。

And we see that prevalent in like all the number of frameworks out there for building APIs right now.

Speaker 1

但你的工具并不依赖于这些特定框架,你可以用任何语言编写,却能生成类似Swagger的文档。

But yours, it doesn't have any ties into those specific, You could write in whatever you wanted to and have similar documentation to Swagger.

Speaker 1

我觉得这是个很棒的想法。

I think that's an awesome idea.

Speaker 3

谢谢。

Thanks.

Speaker 3

是的,我想在试图让其与 Swagger 兼容时遇到的一个问题是,Swagger 有非常明确的规范。

Yeah, the one issue I can see with trying to make it fit in with Swagger is that Swagger has a very, well, it has a specification.

Speaker 3

因此它在这方面很严格,如果你设计的东西不被支持——不一定是不符合 RESTful,而是不被你所使用的那个规范版本所支持——那就根本行不通。

So it's strict in that way and if you design something that is not supported, not necessarily they wouldn't be restful, but it's not supported by that spec, that spec version that you're working with, then it just doesn't work.

Speaker 0

但 Blueprint 的规范也很严格。

Well, Blueprint has a pretty strict spec also.

Speaker 0

你只需要匹配某种数据。

You just have to match sort of the data.

Speaker 0

你必须仔细评估规范,并将数据适配到规范中。

You have to really evaluate the spec and match the data fitted into the spec.

Speaker 3

是的。

Yeah.

Speaker 3

所以你必须事先了解你所用工具的规范是什么。

So you have to have some prior knowledge of what the spec is for the tool you're working with.

Speaker 0

当然。

Sure.

Speaker 1

好的。

All right.

Speaker 1

所以我想我们还剩大约十分钟,我绝对不想在没机会和你聊聊你的“女性前行者”项目的情况下结束本期节目,你能给我们简单介绍一下这个项目,以及目前进展如何吗?

So I think we got about ten minutes left and I definitely don't want to close the show out without getting a chance to speak with you about your Women Who Go So, could you tell us a little bit about that and kind of how things are going there?

Speaker 0

当然可以。

Yeah, sure.

Speaker 0

我们目前正处于快速增长阶段。

We're actually growing really fast at the moment.

Speaker 0

我真的很惊讶,这太令人兴奋了。

I'm sort of blown away, it's really exciting.

Speaker 0

我们刚刚在东京成立了分会,这真的很酷。

We just launched a chapter in Tokyo, so that's really cool.

Speaker 0

我的意思是,我可以谈谈我为什么创办这个项目,以及我是怎么开始的。

So, I mean, I can talk about like why I started it or how I started it.

Speaker 0

是的,说说吧

Yeah, talk about

Speaker 1

简单介绍一下这个组织是什么,它是怎么开始的,以及你的目标是什么。

a little bit about what it is and kind of how it got started and what your goals are.

Speaker 0

当然可以。

Yeah, sure.

Speaker 0

我真的很想为女性创建一个安全的空间,让她们能够进入 Go 生态系统。

So I really wanted to create a safe space for women to enter the Go ecosystem.

Speaker 0

我大约一年前创办了这个团体,从2013年年中开始就一直参加 GO SF 的聚会。

So I had been, I started the group about a year ago, and I had been going to GO SF meetups for, since like mid twenty thirteen.

Speaker 0

那时候聚会规模还很小,大概只有三五十人,而我经常是唯一的女性,而且一直如此。

So when they were still really small, 50 people or something, or 30, and I was often like the only woman, but like very consistently.

Speaker 0

所以我开始有点沮丧,但这些聚会实在太棒了,所以情况还算不错。

And so I started to get a little frustrated, but the meetups were so excellent that it worked out okay.

Speaker 0

然后,让我想想,我在2014年初被邀请在 GopherCon 上发言,当时我正在听一个关于 GopherCon 的 The Changelog 播客,我记得是 Brian 提了这个问题,不过我记不太清了。

Then, let's see, I got accepted to talk at GopherCon early twenty fourteen and I was actually listening to a changelog podcast about GopherCon and I think it was Brian who I can't actually remember.

Speaker 0

有人问了一个问题,比如:我们该如何帮助更多人参与 Go 社区,或者类似的问题。

Someone asked the question like, how can we help people get more involved in the Go community or how can, something like that.

Speaker 0

布赖恩建议我在我的社区里创办一个小组,比如在社区里成立一个Go小组。

And Brian suggested that you start a group in your community, like a Go group in your community.

Speaker 0

我将这个‘我的社区’理解为女性群体。

And I sort of took that as my community being like women.

Speaker 0

我想让更多女性参与到Go中来,于是创办了‘Women Who Go’。

And I wanted to get more women involved in Go, and so I started Women Who Go.

Speaker 0

我们一年前举办了第一次活动,当时只是讨论了身为女性在科技行业和Go社区中所面临的困难,以及我们该如何开始解决这些问题。

See we had our first event about a year ago, which was really we just talked about sort of difficulties of being a woman in tech and a woman in the Go community, and sort of how we start trying to fix these issues.

Speaker 0

过去一年里,我每个月都举办一次聚会,我认为我们规模最大的活动是比尔·肯尼迪的工作坊。

And I've had a meetup about every month for a year and I think our largest event has been the Bill Kennedy workshop.

Speaker 0

当时有70名女性参加,她们都希望学习Go,这非常有力量。

We had 70 women attend and want to learn Go which was really powerful.

Speaker 0

但这个小组的主要目标,就是为人们、为女性提供一个安全的环境,让她们能够更深入地了解Go、进行探索,而最终的期望是,当她们感到更安心后,能去参加GO SF的活动或GopherCon。

But yeah, the main goal of the group is just to provide a safe environment for people, for women to learn more about Go and to explore and hopefully the idea is that then they go to GOESF events or GopherCon once they feel a little more safe.

Speaker 0

我觉得这个计划进行得相当不错。

And I think it's been working pretty well.

Speaker 0

然后,关于我们全球的10个分会,女性们会给我发消息,或者通过Twitter找到我,她们会说:我看到你在做的这件事,太棒了,我想在丹佛或者其他地方也成立一个小组。

So, and then as far as like our 10 chapters around the world, women actually will message me or somehow find me on Twitter and they'll be like, I see what you're doing, this is really cool, I wanna start a group in Denver or, you know, wherever.

Speaker 0

我只是帮助她们起步,而她们会非常积极地推进,因此有这么多女性对创办这样的小组感到如此兴奋,这真的非常了不起。

And I just help them get started and they really run with it and so the number of women that have been really excited about starting groups like this has been really spectacular.

Speaker 2

听到这些真是太棒了。

That is so awesome to hear.

Speaker 0

是的。

Yeah.

Speaker 2

我这边都激动得说不出话了,你继续说。

I'm just over clumped over here, so keep talking.

Speaker 0

我的意思是

Oh, I mean

Speaker 2

你说你现在有10个分会了,对吧?

So you said you have 10 chapters now, right?

Speaker 0

是的,我们有。

Yes, we do.

Speaker 0

我们在美国有五个,印度班加罗尔有一个,伦敦有一个,东京有一个。

So we've got five in The US, we've got one in Bangalore, one in London, one in Tokyo.

Speaker 0

天哪,我想不起来了。

Shoot, I'm blanking.

Speaker 0

如果你访问 womenwhogo.org,就可以看到我们所有分会的列表。

I've got the If you go to womenwhogo.org, you can see our list of chapters.

Speaker 0

此外,如果你不想认同为女性但想参与,网站上也有相关资源。

And there are also resources for if you wanna get involved but you don't identify as a woman.

Speaker 0

我们还有柏林、班加罗尔、东京、墨西哥城和伦敦。

Yeah, we've got Berlin, Bangalore, Tokyo, Mexico City and London.

Speaker 0

在美国,我们有波士顿、博尔德、纽约市、圣地亚哥和旧金山。

And then in The US, we've got Boston, Boulder, New York City, San Diego and San Francisco.

Speaker 2

womenwhogo.org 上有针对想创办自己分会的人的信息吗?

Is there information on womenwhogo.org for people who might be interested in starting their own chapter?

Speaker 0

没有明确说明,但人们找到了网站上的 hello@womenwhogo 邮箱,通常就是通过这个方式联系我。

So not explicitly but people have found the hello at womenwhogo email address there and that's usually how they contact me.

Speaker 2

完美。

Perfect.

Speaker 0

所以我想我可以在网站上写,比如如果你想创办一个分会。

So I suppose I could say on the site like if you wanna start a chapter.

Speaker 1

我觉得当一些事情发展到你再也无法完全掌控时,这真是太棒了。

I think it's great when things kind of grow bigger than you can keep track of anymore.

Speaker 0

它们就这样自然而然地发展,真是太惊人了。

They just kind like it's amazing.

Speaker 0

尤其是当这是一个如此棒的事业,旨在让更多女性加入户外活动时。

Especially when it's such a cool cause, trying to get more women in to go.

Speaker 1

我的意思是,这可能是我参与过的第一个明显以女性为主的社区,我这么说是指倡导更多女性加入这个社区。

I mean this is probably the first community that I've been a part of that had at least visibly had these big women only, I say women only, but advocating more women get into the community.

Speaker 1

可能这样的社区也存在,但它们的普遍性显然没有这里这么高。

And they probably exist, but it definitely didn't feel as prevalent as it is here.

Speaker 1

我一直在关注推特,看到新的Women Who Go分会之类的动态。

I mean, I've been watching kind of Twitter and seeing the new women who go chapters and stuff like that.

Speaker 1

这简直让人惊叹,我已经数不清有多少了。

And it's like wow, I can't even keep up with how many there are anymore.

Speaker 0

太棒了。

That's awesome.

Speaker 0

我去过一些聚会,比如 Pythonistas,还有 Women Who Code 的 Ruby Tuesdays 女性活动。

There are a few meetups that I've been to like Pythonistas and Women Who Code has a Ruby Tuesdays for women.

Speaker 0

但我还没遇到过其他专门针对某种编程语言、且在多个分会都有分布的女性团体。

But I haven't come across any other sort of women's group specific to a programming language that is spread across multiple chapters.

Speaker 1

是的,我见过 Ladies With Linux。

Yeah, I've seen Ladies With Linux.

Speaker 1

是的,这个组织规模越来越大了,还有一个信息安全领域的团体。

Yes, that's gotten bigger and there's an InfoSec one too.

Speaker 1

我怎么也想不起那名字了,不过。

For the life of me, can't remember the name of it, but.

Speaker 3

还有 PyLadies。

There's also PyLadies.

Speaker 1

哦,对,PyLadies。

Oh yeah, PyLadies.

Speaker 2

PyLadies、Rails Girls。

PyLadies, Rails, Girls.

Speaker 0

哦,没错,确实有很多。

Oh true, yeah, so there's a ton.

Speaker 2

这种氛围在Go社区里更强烈,我非常喜欢。

It feels stronger in the Go community and I love that.

Speaker 2

我热爱这种推动包容性和安全感的努力,让任何人都能安心加入学习,而不必担心外部因素。

I love the push to have that inclusivity and that feeling of safety so anybody can come in and learn without worrying about external factors.

Speaker 2

这非常好。

That's very nice.

Speaker 2

为你所做的事情感到自豪吧,这真的很棒。

Be proud of what you've done, this is really cool.

Speaker 2

就像你之前说的,当你感受到它迅速壮大、难以追踪时,Eric和我也有同样的经历——当有人从巴西给我们发邮件说,‘我们想在巴西办一场GopherCon’,我们会说:‘当然,请去做吧!’

Like you were saying earlier, when you have that feeling where it's growing so big, it's hard to keep track of, we get that same thing, Eric and I, Go For Con when somebody in Brazil sends us an email and says, hey, we want to do a GopherCon in Brazil, yes please, go do that.

Speaker 0

太棒了。

That's awesome.

Speaker 0

没错,就是这样。

That's exactly it.

Speaker 1

我的意思是,任何能吸引更多人参与的事情都是好事。

I mean anything that gets more people involved is always a good thing.

Speaker 0

是的,我同意。

Yep, I agree.

Speaker 1

更多的会议、更多的线下聚会、更多的博客、更多的播客。

More conferences, more meetups, more blogs, more podcasts.

Speaker 3

我认为这里还有一个很好的机会来打破一些误解,比如存在许多关于女性不能编程的误解,甚至我们自己也会认为,哦,也许我不能编程,或者我能编程但无法成为优秀的程序员;还有一个误解是认为Go是一种底层语言,虽然它没有C语言那么底层,但可以用于底层系统开发,此外还有一个误解是认为女性无法从事系统级编程。

I think there's also a good opportunity to break some misconceptions, like there are additional opportunities to break misconceptions here because there are so many misconceptions that women cannot program or even we ourselves look at ourselves and think, oh, maybe I cannot program or maybe I can program but I cannot be great programmer and there is a sense that Go is a low level language, is not as low level as C, but it can be used for low level systems development, and there is an additional misconception that women cannot do a systems level programming.

Speaker 3

我不知道你是否认同这一点,但我确实见过这种情况。

I don't know if you agree that this exists, but I have seen it.

Speaker 3

所以通过Go,我们可以帮助打破这个迷思。

So with Go is we can help break this myth.

Speaker 1

是的,在整个STEM领域,普遍存在对其他性别能力的质疑。

Yeah, think in STEM in general, there's a lot of that being critical of other genders and their ability to do the job.

Speaker 1

我觉得这真的很天真。

And I think it's just, it's naive.

Speaker 3

是的,但这种现象确实存在。

Yeah, but it exists.

Speaker 0

我特别喜欢Go社区的一点是,当这类事情出现时,人们似乎都会立刻站出来反对。

That's one of the things that I love about the Go community so much is that sort of when those things pop up, people seem to be sort of all over it.

Speaker 0

这真的不可接受。

Like that's really not okay.

Speaker 0

我很欣赏安德鲁·杜兰德和杰森·博布罗为行为准则投入了如此多的时间和精力。

And I love how much time and energy that people like Andrew Durand and Jason Boubro have put into the code of conduct.

Speaker 0

我们的行为准则讨论帖持续了好几个月,因为大家都非常热衷于确保Go社区具有包容性,让每个人都能感到安全。

Like we were going like our code of conduct thread went on for months just because people were so passionate about trying to make sure that Go was so inclusive and that everyone felt safe in the Go community.

Speaker 0

我真的很感谢他们所做的努力。

And I really thank them for that.

Speaker 1

是的,我也非常赞赏这一努力。

Yeah, I really applaud that effort as well.

Speaker 1

我认为这是发生的一件了不起的事情。

I think that that was a fantastic thing that happened.

Speaker 1

而且一般来说,对吧?

And I mean, general too, right?

Speaker 1

比如我知道我和卡尔西有过关于这个的讨论。

Like I know Carlissi and I have had conversations about this before.

Speaker 1

就是大家彼此友善一点。

It's just everybody be nice to each other.

Speaker 1

这有什么难的?

Like what's hard about that?

Speaker 1

我刚加入这个社区时最喜欢的一点就是,我没有计算机科学的硕士或博士学位。

That was one of the things I loved about this community when I came into it, because I don't have a master's degree or PhD in Comp Sci.

Speaker 1

我不是一个高度学术化的程序员,但那些有博士学位的人在聊天、邮件列表里都乐于帮助和回答问题,纯粹出于对这门语言的热爱。

Like I'm not a highly academic programmer, but there were these PhD people all chatting up and mailing lists and stuff, and perfectly happy to help and answer questions and just their love of the language.

Speaker 1

他们希望与大家分享这一点,我认为我们也应该这样做。

They wanted to share that with people and I think that we should do that.

Speaker 1

无论谁想要加入我们的社区,我们都应该尽可能地热情欢迎。

Whoever it is that's trying to join our community, we should be as welcoming as possible.

Speaker 0

没错。

Exactly.

Speaker 0

是的,而且我认为,自从我们从小规模开始就真正做到包容并意识到这一点,我真心觉得这将帮助我们在成长过程中保持这种包容性和安全感,而其他语言社区则是在规模壮大后才试图补上这一点,这要困难得多。

Yeah, and I think since we started sort of being really inclusive and being aware of that, when we were so small, I really think that's gonna help us as we grow to maintain that sort of a sense of inclusivity and safety as opposed to other languages who are sort of trying to tack it on, like after they've grown a lot, it's a lot harder or it seems a lot harder.

Speaker 2

所以对于正在收听播客或实时收听的女性们,如果她们访问 womenwhogo.org,可以看到各个分会的列表,这能帮助她们找到下一次会议的时间吗?

So for the women who are listening to the podcast or listening live, if they go to womenwhogo.org, they can see a list of chapters, will that give them the ability to find when the next meetings are?

Speaker 0

是的,没错。

Yes, exactly.

Speaker 0

网站上列出了所有分会的信息,比如 meetup 页面,或者东京分会的 con pass 页面,每个分会都有自己的 Twitter 账号,有些还有 Facebook 和 Slack 群组,这些链接都可以在 womenwhogo.org 网站上找到。

There are a list of all of them, the meetup pages or in Tokyo's case, the con pass, there's a Twitter account for each chapter and some of them have Facebooks and they're on Slacks There are links for all of those on the womenwhogo.org site.

Speaker 1

你提到,对于有兴趣创办自己分会的人,最好的方式是发邮件到 hello@womenwhogo.org,

And you said for people interested in potentially starting their own chapters, the best thing to was email you at hello@womenwhogo.org,

Speaker 0

没错。

exactly.

Speaker 2

很棒的话题。

Great topic.

Speaker 1

说到这里,我想我们这一集的时间差不多到了。

And I think on that note, I think that we are just about out of time for this episode.

Speaker 1

所以很遗憾,我们得说再见了。

So unfortunately we get to say our goodbyes.

Speaker 1

但在那之前,我们通常会进行‘自由软件星期五’的话题,我们每个人都会简要提及一个我们心怀感激的项目,以支持该项目及其贡献者,或者一些我们每天都在使用的工具,因为有时候一句感谢就足以回馈,即使你无法贡献代码。

But before we do that, we typically do the whole Free Software Friday hashtag where each of us just kind of briefly mentions a project that we're kind of grateful for just to give support to the project and its contributors or some of these things that we use every single day because sometimes a thank you is just good to give back even if you can't contribute code.

Speaker 1

那么,谁想先开始呢?

So with that being said, who wants to kick this thing off?

Speaker 2

我来开头。

I'll start it off.

Speaker 2

这周我的自由软件星期五致谢献给为 Docker 做出贡献的一千多名人士。

So my free software Friday shout out this week is to the thousand plus people who have contributed to Docker.

Speaker 2

我仍然喜欢把 Docker 用作构建工具和部署工具,Docker 非常有趣,它让简单的事情变得更简单,也让一些困难的事情变得更易接近,虽然它偶尔让我掉头发,但我依然爱 Docker。

I still love Docker as a build tool and a deploy tool, Docker's a lot of fun it has made the easy things easier and some of the hard things more accessible and it's caused me to lose a little bit of hair every once in a while but I love Docker.

Speaker 2

谢谢 Docker 的所有开发者。

So thank you Docker people.

Speaker 0

我要向 Apiary 团队致敬,感谢他们编写了 APIB 蓝图规范。

I'm going to shout out to the folks at Apiary writing the APIB blueprint spec.

Speaker 0

这真的太棒了。

It's really awesome.

Speaker 0

而且你们一直很配合我所有的文档修改请求。

And you guys have been very accommodating of all of my documentation change requests.

Speaker 1

太棒了。

That's awesome.

Speaker 1

Carlicia?

Carlicia?

Speaker 3

我今天要提两个,但先快速感谢一下 remotemeetup。

I will, first of all, I have two today, but real quick, give a shout out to remotemeetup.

Speaker 3

Golanguage.org 是一个Go语言远程聚会项目,目前正有越来越多的人参与其中,从名字就能看出来。

Golanguage.org is the Go remote meetup initiative that a few people are coming around to, is what the name says.

Speaker 3

如果你想在线做演讲,接触那些不在你本地社区的人,就来这个平台吧,我们会帮你安排演讲。

If you want to give a talk online and reach people who are not in your physical community, hop on there, we'll schedule a talk.

Speaker 3

我也是其中一员,所以在这里喊一嗓子。

I'm part of it too, so I'm saying wake.

Speaker 3

这对我来说意义重大,我非常热爱它,尤其是因为我并不在大型科技中心。

This is dear to my heart, I love it, especially because I'm not in a big tech center.

Speaker 3

圣地亚哥还不错,但毕竟不是波士顿或旧金山。

San Diego is pretty good, but it's not Boston or San Francisco.

Speaker 3

所以我非常期待这个项目,那些想观看这些演讲、演示和教程、以及希望参与编程活动的人,我这里在圣地亚哥就有不少人想这么做,只要注册并订阅,你就会收到通知,我们已经有一些内容了,更多内容也正在筹备中。

So I'm looking forward to this and people who want to see these talks and presentations and demos and tutorials and hopefully programming sessions, I have people here in San Diego who want to do that, just sign up and subscribe and you'll get notified and we have some stuff there already and more coming.

Speaker 3

另一个我早就想提的是 Sourcegraph 浏览器扩展。

And the other one that I've been meaning to say for the longest time is the Sourcegraph Chrome extension.

Speaker 3

在你的电脑上安装它,然后访问 GitHub,当你查看代码时,你会发现它简直像魔法一样。

Install it on your computer and then go to GitHub and when you look at code, it's gonna be magic.

Speaker 3

你只需将鼠标悬停在函数和常量上,就能看到各种额外信息,而无需跳转到其他地方查看。

You just hover your mouse over functions and constants and you get all sort of information, extra information that you don't have to hop to other places to see.

Speaker 3

他们还提供了一个简短的教程视频,我们会在节目笔记中附上这个视频。

And there is a mini tutorial video that they have and we will include that on the show notes.

Speaker 3

这相当酷。

It's pretty cool.

Speaker 1

是的,我们实际上已经邀请了Sourcegraph的联合创始人之一BiyaNG来参加一期节目。

Yeah, we actually have Biyang, one of the co founders of Sourcegraph, lined up for an episode.

Speaker 1

所以这也将很快推出。

So that will be coming up as well.

Speaker 3

是的。

Yes.

Speaker 1

对我来说,这周是RoFi,我希望我发音正确,因为我好像从来没听人说过这个词,它是一个用于Linux的应用程序启动器和窗口切换器。

For me this week, and hopefully I pronounced this correctly, because I don't think I've ever heard anybody say it, but is RoFi, which is a kind of a application launcher and Windows switcher for Linux.

Speaker 1

我在使用I3时,用它来打开新程序。

And I use that while I'm in I3 to open up new programs.

Speaker 1

而不是传统的D菜单。

Instead Plus of the good old D menu.

Speaker 1

那是什么?

What's that?

Speaker 2

支持一票,Rofi太棒了。

Plus one, Rofy's awesome.

Speaker 1

是的,它最近发布了新版本,增加了许多新功能,界面也美观多了。

Yeah, it recently had a new release that brought a lot more features and made it look a lot prettier.

Speaker 1

我用得特别开心。

I've been having a blast with it.

Speaker 1

说到这里,我想感谢所有人。

So with that said, I want to thank everybody.

Speaker 1

我要感谢各位嘉宾,Brian和Carlesia,当然也要感谢Sarah来参加节目。

I want to thank the panel, Brian and Carlesia, and I certainly wanna thank Sarah for coming on the show.

Speaker 1

我要感谢现在正在收听的每一位听众,以及将来当这些播客发布时会收听的每一个人。

I wanna thank everybody who's listening now and everybody who will be listening when these podcasts drop.

Speaker 1

一定要把这个节目分享给你的其他Go程序员。

Definitely share share this show with your fellow Go programmers.

Speaker 1

订阅的最佳方式是访问gotime.fm,我们还会推出每周电子邮件通讯,你可以通过该网站或在Twitter上关注godotimefm进行订阅。

Best way to subscribe would be to go to gotime.fm, and we will also have a weekly email newsletter coming out that you can do that or on Twitter as well at godotimefm.

Speaker 1

好了,谢谢大家,我们下周再见。

With that said, thanks everybody and we'll see you next week.

Speaker 3

很高兴能来这里。

Glad to be here.

Speaker 2

谢谢。

Thank you.

Speaker 3

谢谢你,Sarah。

Thank you, Sarah.

Speaker 3

谢谢。

Thanks.

Speaker 3

再见。

Bye.

Speaker 2

谢谢你,莎拉。

Thank you, Sarah.

Speaker 0

谢谢。

Thank you.

关于 Bayt 播客

Bayt 提供中文+原文双语音频和字幕,帮助你打破语言障碍,轻松听懂全球优质播客。

继续浏览更多播客