Go语言爱好者周刊:第 78 期

polaris · 2021-01-17 11:00:58 · 9028 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-01-17 11:00:58 的主题,其中的信息可能已经有所发展或是发生改变。

这里记录每周值得分享的 Go 语言相关内容,周日发布。

本周刊开源(GitHub:polaris1119/golangweekly),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue

鉴于一些人可能没法坚持把英文文章看完,因此,周刊中会尽可能推荐优质的中文文章。优秀的英文文章,我们的 GCTT 组织会进行翻译。

题图:来自 @System32Comics

刊首语

2021 年 1 月 12 日,官方正式提出将泛型特性加入 Go 语言,且最新的草案设计已经更新,预计 Go1.18 加入泛型,官方博文见:https://docs.studygolang.com/blog/generics-proposal

本期题目:以下代码输出什么?

package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan int)
    go fmt.Println(<-ch1)
    ch1 <- 5
    time.Sleep(1 * time.Second)
}

A:5、B:不能编译;C:运行时死锁

资讯

1、gofakeit 6.0.0 发布

随机伪数据生成器。具有 160 多种功能,可用于生成名称,电子邮件,位置,颜色,用户代理等等。

2、Bleve 2.0 发布

Go 全文搜索和索引。

3、GoLand 计划保存时执行 go fmt

你觉得怎么样?

4、Resty 2.4 发布

用于 Go 的简单 HTTP 和 REST 客户端库。

文章

1、2021 年这 8 种编程语言最流行:Go 入榜原来是这个原因

怎样判断哪种编程语言最流行?正如要挑选最受欢迎的冰激凌一样,每个人都有自己的最爱。

2、学到了:goroutine 可能使程序变慢

下面,我们将会展示一个关于 for 循环的代码,将输入分成几个序列添加到 Goroutines 里面!

3、请接收37岁老码农寒冬里给年轻人上的一节 Go 面经课

面试的公司是二线及以下。不包括阿里,头条,快手,美团,拼多多。面试的职位是 Go 后端研发。

4、第 77 期周刊题解:关于 goroutine 数量的,你答对了吗?

这道题的正确率很低。这篇文章给大家解惑!

5、用 Go 如何实现精准统计文章字数

今天要聊的内容应该可以当做一道面试题,你可以先想想该怎么实现。

6、惊呆了:我用这个 Go 框架一周实现了一个中台系统

使用 go-zero。

7、为什么要学习更多的编程语言?同时认为 Go 是最佳

作者学了好几门语言。

8、Golang 类型断言 vs 类型转换

这是一篇译文,原文出处:https://www.sohamkamani.com/golang/type-assertions-vs-type-conversions/。

9、Go内置数据结构原理

从C++切换到Go语言一年多了,有必要深入了解一下Go语言内置数据结构的实现原理,本文结合示例与Go源码深入到Go语言的底层实现。

10、Golang 时间操作大全

平时开发过程中,时间相关的操作用的还是很多的。接下来就与大家一起总结下与时间有关的操作,主要涉及到 time 包,核心数据结构是 time.Time。

11、写一个 panic blame 机器人

实现一个 panic blame 机器人比较简单,但考虑服务稳定性的话,还是有一些点要注意的。

12、一文带你解密 Go 语言之通道 channel

这篇文章主要是针对 Go channel 的重点分析。

13、聊聊 gorm 的 IsolationLevel

本文主要研究一下 gorm 的 IsolationLevel。

开源项目

1、gocache

完整的 Go 缓存库,为你带来多种管理缓存的方式。

2、go-oci8

Oracle 的 Go 驱动,使用标准库 database/sql。

3、juicefs

基于 redis 和 S3 构建的分布式 POSIX 文件系统。

4、go-jwt-middleware

Go 编程语言中间件,用于检查 HTTP 请求上的 JWT。

5、gobook

基于 golive 实现的在浏览器中运行的交互式解释器。

6、GistFS

实现了go 1.16的 io/fs 接口,支持从 github gist 读取文件。

7、colorgrad

Go 色标库,支持自定义颜色渐变、预设梯度、硬边渐变等色彩方案。

8、sorvor

适用于现代 Web 应用程序的超快速,零配置服务器。

9、atoll

密码安全且高度随机的秘密生成器。

10、dvid

分布式,版本化,面向图的数据服务。

11、heart

使用 Go 实现的高性能 lua web 服务器。

资源&&工具

1、Go Slice Tricks Cheat Sheet

Go Wiki 上共享的“切片技巧”更直观的表示。

2、act

在本地运行 GitHub Action。

3、re-txt

将文本格式从一种转换为另一种,如果要将 json 文件重新格式化为 yaml,toml 为 yaml,csv 为 yaml 等,这非常有用。

4、jira-cli

jira 命令行交互工具。

5、iron-chart-go

基于 Github 自动部署 Go Web 服务。

6、5 分钟内学习 Go(英文)

你觉得可能吗?

7、Go 实现一个简单的编程语言

它包含了个手写的递归下降解析器和一个简单的解释器。

8、mnm

一种电子邮件的替代品。

9、go-git-semver

Go 编写的 git 的 semver 插件。

10、播客第 162 期

和 “CI/CD with Docker and Kubernetes” 一书作者一起谈 CI/CD。

11、nancy

用于查找 Go 依赖包中漏洞的工具。

12、swag

一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。这里有一篇介绍文章:https://studygolang.com/topics/12949

订阅

这个周刊每周日发布,同步更新在Go语言中文网微信公众号

微信搜索"Go语言中文网"或者扫描二维码,即可订阅。

wechat


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

9028 次点击  
加入收藏 微博
14 回复  |  直到 2021-01-26 09:43:31
GotoLove-LoonGL
GotoLove-LoonGL · #1 · 4年之前

死锁了,为什么???????

Charming-Victim
Charming-Victim · #2 · 4年之前

为啥死锁了啊

1034992601
1034992601 · #3 · 4年之前

用这种方式就能达到预期:

go func() {
        fmt.Println(<-ch1)
    }()
caofengl
caofengl · #4 · 4年之前
10349926011034992601 #3 回复

用这种方式就能达到预期: ``` go go func() { fmt.Println(<-ch1) }() ```

请教一下,这个原理怎么解释呢?

saberlong
saberlong · #5 · 4年之前
caofenglcaofengl #4 回复

#3楼 @1034992601 请教一下,这个原理怎么解释呢?

我的理解是原因在于调用函数需要将参数压栈。题中虽然有go,还是得先从chan中拿到值才能进行参数压栈

focusonline
focusonline · #6 · 4年之前
saberlongsaberlong #5 回复

#4楼 @caofengl 我的理解是原因在于调用函数需要将参数压栈。题中虽然有go,还是得先从chan中拿到值才能进行参数压栈

你理解的没错的,go使用的函数, 其直接参数是立即计算的, 计算完成后才入栈.如果遇到了题目的这种情况, 就会阻塞在计算参数的阶段, 这个没完成, go就一直停留在这里, 之所以一下的方式可用也是因为并非使用了直接参数需要入栈的缘故.

go func() {
        fmt.Println(<-ch1)
    }()

之前也感到迷惑, go的注意点还有很多.不按常理出牌啊, 只能规避.

hasbug
hasbug · #7 · 4年之前

Goroutines

go f(x, y, z)

The evaluation of f, x, y, and z happens in the current goroutine and the execution of f happens in the new goroutine.

GotoLove-LoonGL
GotoLove-LoonGL · #8 · 4年之前
focusonlinefocusonline #6 回复

#5楼 @saberlong 你理解的没错的,go使用的函数, 其直接参数是立即计算的, 计算完成后才入栈.如果遇到了题目的这种情况, 就会阻塞在计算参数的阶段, 这个没完成, go就一直停留在这里, 之所以一下的方式可用也是因为并非使用了直接参数需要入栈的缘故. ```go go func() { fmt.Println(<-ch1) }() ``` 之前也感到迷惑, go的注意点还有很多.不按常理出牌啊, 只能规避.

原来我在大气层

GotoLove-LoonGL
GotoLove-LoonGL · #9 · 4年之前
focusonlinefocusonline #6 回复

#5楼 @saberlong 你理解的没错的,go使用的函数, 其直接参数是立即计算的, 计算完成后才入栈.如果遇到了题目的这种情况, 就会阻塞在计算参数的阶段, 这个没完成, go就一直停留在这里, 之所以一下的方式可用也是因为并非使用了直接参数需要入栈的缘故. ```go go func() { fmt.Println(<-ch1) }() ``` 之前也感到迷惑, go的注意点还有很多.不按常理出牌啊, 只能规避.

学到了

robertchen
robertchen · #10 · 4年之前
hasbughasbug #7 回复

[Goroutines](https://tour.golang.org/concurrency/1) ```go go f(x, y, z) ``` > The **evaluation of f, x, y, and z happens in the current goroutine** and the execution of f happens in the new goroutine.

感谢解答和提供的官方文档!

GotoLove-LoonGL
GotoLove-LoonGL · #11 · 4年之前
focusonlinefocusonline #6 回复

#5楼 @saberlong 你理解的没错的,go使用的函数, 其直接参数是立即计算的, 计算完成后才入栈.如果遇到了题目的这种情况, 就会阻塞在计算参数的阶段, 这个没完成, go就一直停留在这里, 之所以一下的方式可用也是因为并非使用了直接参数需要入栈的缘故. ```go go func() { fmt.Println(<-ch1) }() ``` 之前也感到迷惑, go的注意点还有很多.不按常理出牌啊, 只能规避.

你说的计算完才入栈,是处于GMP模型里的创建G的这一步吗??

focusonline
focusonline · #12 · 4年之前

#6楼 @focusonline 你说的计算完才入栈,是处于GMP模型里的创建G的这一步吗??

我觉得可以这么说

GotoLove-LoonGL
GotoLove-LoonGL · #13 · 4年之前
focusonlinefocusonline #12 回复

#11楼 @GotoLove-LoonGL 我觉得可以这么说

看来我需要去看看GMP的具体实现的过程

AllenLiu
AllenLiu · #14 · 4年之前

学习了,谢谢~

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传