golang 泛型_Go语言爱好者周刊:第 57 期—泛型有了新的进展

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

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

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

8afc1076cd8018c380e18df04905419a.png

题图:黑白棋,Go 语言实现了这个小游戏

刊首语

黑白棋,又叫翻转棋(Reversi)、奥赛罗棋(Othello)、苹果棋或正反棋(Anti reversi)。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。有一说法是:只需要几分钟学会它,却需要一生的时间去精通它。

这里有一个 Go 语言实现的黑白棋,地址:https://piccolo.click/。可惜源码没有开放,在 Web 上通过 WebAssembly 运行的。使用 Ebiten 2D[3] 游戏库构建。

Piccolo 是一款以强大且具有竞争力的水平玩日本 Othello 战略游戏的 AI。Piccolo 结合使用 Negamax 深度优先搜索和 Alpha-Beta 修剪与启发式技术相结合来评估位置强度,并具有优雅的用户界面。

除了 Web 版本,还支持 Windows 和 Linux 客户端,不久会有 macOS 客户端。

以前没玩过,试完了几把,Level 2 级别的都输,AI 好强大还是我太菜?!

资讯

1、Task 3.0 发布[4]

任务运行器,使用 Go 语言编写。类似 GNU Make,目标是比它更简单和易于使用。

2、用于 pkg.go.dev 的 Badge 生成工具[5]

这是官方提供的工具,用于生成 Badge 放在 README 中。

3、关于 Go 泛型设计最新进展和一些问题的澄清[6]

很大可能使用方括号 [],取消类型参数前面的 type 关键字,所有类型参数必须提供 constraint,引入 “any" 预声明标识符 (interface{} 的一个 alias)等。

type Vector[T any] []T               func Print[T any](s []T "T any") { … }func Index[T comparable](s []T, e T "T comparable") { … }

文章

1、对比三款 Go Playground:你喜欢哪款?

曾几何时,语言的在线运行(Playground)似乎成了标配。确实,Playground 能够让我们可以快速试验一些想法。Go 语言在发布之初就提供了一个,这就是 https://play.golang.org。然而,由于众所周知的原因,我们访问不了。为了方便国内广大 gopher,我搞了一个国内镜像:https://play.studygolang.com,尽情使用、分享吧。

2、关于 Golang 错误处理的一些思考

如果你还没在 error 上栽跟头,那么当你栽了跟头时才会哭着想起来,当年为什么没好好思考和反省错误处理这么一个宏大的话题。

3、如果你只知道 go test 用于单元测试就太 LOW 了

go test 命令提供了许多出色的功能,比如代码覆盖率,CPU 和 内存分析。要提供这些统计信息,Go 就需要一种方式来跟踪 CPU 使用率,或在代码覆盖中跟踪一个函数何时被用到。

4、掌握了这30道MySQL基础面试题,我成了面霸

一个典型的互联网产品架构包含接入层、逻辑处理层以及存储层,其中存储层承载着数据落地和持久化的任务,同时给逻辑处理层提供数据查询功能支持。说到存储层就要说到数据库,数据库知识掌握程度也是面试考察的知识点。

5、图解 Go 内存管理与内存清理

清理内存是一个过程,它能够让 Go 知道哪些内存段最近可用于分配。但是,它并不会使用将位置 0 的方式来清理内存。

6、作为 Gopher 你一定要懂的连接池

作为一名Golang开发者,线上环境遇到过好几次连接数暴增问题(mysql/redis/kafka等)。纠其原因,Golang作为常驻进程,请求第三方服务或者资源完毕后,需要手动关闭连接,否则连接会一直存在。而很多时候,开发者不一定记得关闭这个连接。这样是不是很麻烦?于是有了连接池。

7、Viper 加载远程配置的填坑之旅

关于 viper,无须多言,它是 Golang 社区里最流行的配置文件工具,除了常见功能之外,它还支持很多高级功能,比如可以加载远程配置,正好我最近在研究 etcd,于是我打算把二者结合起来,没想到就此开启了填坑之旅。

8、Go 读取文件方式那么多,到底应该用哪一种呢

Go 语言在进行文件操作的时候,可以有多种方法。最常见的比如直接对文件本身进行Read和Write;除此之外,还可以使用bufio库的流式处理以及分片式处理;如果文件较小,使用ioutil也不失为一种方法。面对这么多的文件处理的方式,那么初学者可能就会有困惑:我到底该用那种?它们之间有什么区别?笔者试着从文件读取来对 go 语言的几种文件处理方式进行分析。

9、从头教你使用 Hugo 搭建自己的博客

手把手教你。

10、微服务的战争:按什么维度拆分服务

微服务,这三个字正在席卷着目前的互联网软件行业,尤其在近几年云原生迸发后,似乎人人都对微服务有了更广泛的使用和理解,张口就是各种各样的问号,有着强大的好奇心。但微服务的拆分维度是什么?

11、TiDB 在知乎万亿量级业务数据下的实践和挑战

2019 年底的分享。

12、如何使得你的 Go 命令行程序变得友好?

从一个故事开始~

13、Go 项目实战:Golang HTTP 验证码

网站必备的功能。

14、优化 Docker 镜像大小常见方法

平时我们构建的 Docker 镜像通常比较大,占用大量的磁盘空间,随着容器的大规模部署,同样也会浪费宝贵的带宽资源。本文将介绍几种常用的方法来优化 Docker 镜像大小,这里我们使用 Docker Hub 官方上的 Redis 镜像进行说明。

15、通过 Go 语言代码理解大小端模式

Go 语言底层实现的为小端模式,因为计算机进行计算时,都是从低位开始进行计算的,这样计算效率比较高。而大端模式比较方便用户阅读,比较符合我们的阅读习惯。

16、聊聊自己学Go一年来的经历与成长[7]

今天偶然在掘金上看到了关于 Go 的征文稿,恰逢赶上自己学 Go 一周年的时间,最近也在部门内做了关于《Let's Go ! Go 语言入门与实践》的分享,结合自身在字节跳动的业务开发经历,整体聊聊自身关于 Go 的一些学习感悟与成长。

17、golang net/http 超时引发大量 fin-wait2[8]

通过 grafana 监控面板,发现几个高频的业务缓存节点出现了大量的 fin-wait2,而且 fin-wait2 状态持续了不短的时间。

开源项目

1、ent[9]

Go 的实体框架。简单而强大的 ORM,用于建模和查询数据。官网 https://entgo.io/,Facebook 出品。最初是一个“ Facebook 孵化器”项目,但自本周发布的 v0.4.0 起,它已成为 Facebook 的正式项目。

77142f4fc1907302898ec0c2a30456a3.png

2、tracesite[10]

tracesite 是 traceroute 工具的简单 Go 实现,作者写了一篇文件介绍它:https://blog.kalbhor.xyz/post/implementing-traceroute-in-go/。

不过这个项目结构不符合 Go 规范,里面不应该有 src。

3、askgit[11]

使用 SQL 查询 git 存储库。比如:askgit "SELECT * FROM commits,该库之前叫做:gitqlite。

4、guora[12]

Go 类似知乎的私有部署问答应用,包含问答、评论、点赞、管理后台等功能。

5、ebiten[13]

Go 的简单 2D 开源游戏库。Ebiten 的简单 API 使您可以快速轻松地开发可在多个平台上部署的 2D 游戏。

6、govalidator[14]

用于字符串,数字,切片和结构的验证程序。

7、 babygo[15]

从头开始编写的 Go 编译器。

8、 logr[16]

mattermost 开源的 go log 工具。

资源&&工具

1、nali[17]

一个查询 IP 地理信息和 CDN 提供商的离线终端工具。

2、grpc 的那些事儿[18]

峰云就她了 博主的分享 PPT。

3、GopherCon Russia 2020 大会[19](俄文)

疫情没有阻挡大会的正常进行。

4、lsif-go[20]

Language Server 索引格式生成器。

5、回放第 101 期 2020-08-16 黑板 go-zero 微服务框架的架构设计[21]

Go 夜读 第 101 期晓黑板 go-zero 微服务框架分享。

6、第 102 期官方标准编译器中实现的优化集锦[22]

Go101 作者分享。

7、油管视频[23]

从 OO 语言到 Go 的历程。

参考资料

[1]

polaris1119/golangweekly: https://github.com/polaris1119/golangweekly

[2]

提交 issue: https://github.com/polaris1119/golangweekly/issues

[3]

Ebiten 2D: https://ebiten.org/

[4]

Task 3.0 发布: https://github.com/go-task/task/releases/tag/v3.0.0

[5]

用于 pkg.go.dev 的 Badge 生成工具: https://pkg.go.dev/badge/

[6]

关于 Go 泛型设计最新进展和一些问题的澄清: https://groups.google.com/g/golang-nuts/c/iAD0NBz3DYw/m/VcXSK55XAwAJ

[7]

聊聊自己学Go一年来的经历与成长: https://juejin.im/post/6863680036407345166

[8]

golang net/http 超时引发大量 fin-wait2: http://xiaorui.cc/archives/6999

[9]

ent: https://github.com/facebook/ent

[10]

tracesite: https://github.com/kalbhor/tracesite

[11]

askgit: https://github.com/augmentable-dev/askgit

[12]

guora: https://github.com/meloalright/guora

[13]

ebiten: https://github.com/hajimehoshi/ebiten

[14]

govalidator: https://github.com/asaskevich/govalidator

[15]

babygo: https://github.com/DQNEO/babygo

[16]

logr: https://github.com/mattermost/logr

[17]

nali: https://github.com/zu1k/nali

[18]

grpc 的那些事儿: http://xiaorui.cc/static/grpc.pdf

[19]

GopherCon Russia 2020 大会: https://www.youtube.com/watch?v=dGcI1OsDCio&list=PLJTW0ZQ22rrEtvqbz0rxhNQTm0bkJV4Nb

[20]

lsif-go: https://github.com/sourcegraph/lsif-go

[21]

回放第 101 期 2020-08-16 晓黑板 go-zero 微服务框架的架构设计: https://talkgo.org/t/topic/729

[22]

第 102 期官方标准编译器中实现的优化集锦: https://talkgo.org/t/topic/702

[23]

油管视频: https://www.youtube.com/watch?v=1ZjvhGfpwJ8&feature=youtu.be

[24]

Go语言中文网: https://studygolang.com/go/weekly

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Golang中,泛型接口是一种接口类型,可以用于处理不同类型的数据。泛型接口在编程中非常有用,因为它允许我们编写可重用、灵活的代码,而无需针对特定类型进行硬编码。 在Golang中,泛型接口可以通过使用空接口(`interface{}`)来实现。空接口是一个没有任何方法的接口,可以接受任何类型的值。通过使用空接口,可以实现泛型的功能,使得接口可以接收任何类型的数据。 使用泛型接口,我们可以在不改变接口定义的情况下,接受不同类型的参数。例如,我们可以定义一个泛型接口`Container`,用于表示一个可以容纳不同类型元素的容器。这个接口可以定义添加元素、删除元素以及获取元素等方法。 使用泛型接口的好处是可以编写灵活的代码,尽可能减少重复代码的编写。由于泛型接口可以处理多种类型的数据,我们可以将相同的逻辑应用于不同的数据类型,实现代码的重用。 然而,目前Golang没有原生支持泛型接口的功能,因此在实现泛型接口时可能需要一些额外的代码处理。一种常见的做法是使用类型断言来判断接口的实际类型,然后进行相应的操作。 总而言之,虽然Golang没有内置的泛型功能,但通过使用空接口和类型断言,我们可以实现泛型接口从而处理不同类型的数据,提高代码的重用性和灵活性。 ### 回答2: Go语言是一种静态类型的编程语言,其最近的版本Go 1.18中引入了泛型接口的概念。泛型指的是在编写代码时不指定具体类型,而是允许使用者在使用时根据自己的需求来指定具体的类型。 在传统的面向对象编程中,常用的接口表示方式是通过接口类型断言来判断对象是否实现了某个接口。但是这种方式在处理不同类型的数据时需要进行类型转换,不够灵活且有一定的性能损耗。 而泛型接口则可以在接口定义时使用类型参数,通过类型参数来指定接口的具体类型。这样一来,在使用时就可以直接将对应类型的数据传入接口中,无需进行类型转换。 泛型接口的引入为Go语言提供了更加灵活和高效的编程方式。通过泛型接口,我们可以编写更加通用和复用的代码。它还能帮助我们更好地约束函数和数据类型之间的关系,提高代码的健壮性和可读性。 不过需要注意的是,泛型接口的引入也会带来一定的复杂性。在使用泛型接口时,我们需要仔细考虑类型参数的合理性和边界条件,并且需要充分测试以确保代码的正确性。 总之,引入泛型接口是Go语言进一步发展的一大步。它提供了更多的编程方式,并且可以在一定程度上简化代码和提高效率。希望未来随着泛型接口的进一步成熟和普及,我们可以看到更多高质量、灵活和通用的Go代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值