关注微信公众号《云原生CTO》更多云原生干货等你来探索
专注于 云原生技术
分享
提供优质 云原生开发
视频技术培训
面试技巧
,及技术疑难问题 解答

云原生技术分享不仅仅局限于Go
、Rust
、Python
、Istio
、containerd
、CoreDNS
、Envoy
、etcd
、Fluentd
、Harbor
、Helm
、Jaeger
、Kubernetes
、Open Policy Agent
、Prometheus
、Rook
、TiKV
、TUF
、Vitess
、Argo
、Buildpacks
、CloudEvents
、CNI
、Contour
、Cortex
、CRI-O
、Falco
、Flux
、gRPC
、KubeEdge
、Linkerd
、NATS
、Notary
、OpenTracing
、Operator Framework
、SPIFFE
、SPIRE
和 Thanos
等


快速指南:Go 1.18 特性
随着计划于 2022
年第一季度发布的 Go 1.18
版本,许多新功能正在等待我们。
这个版本将是 Go
历史上最关键的包之一,我们可能会在一个月内到达测试版。那么这些变化是什么呢?

类型参数(泛型)
Go
中期待已久的“类型参数”功能 实际上在其他一些语言中被称为泛型。有了这个特性,我们可以为我们的函数提供动态类型。让我们深入研究一个简单的例子并编写一个函数来查找任意两个int
变量的最小值。
func minInt(x int, y int) int {
if x < y {
return x
} else {
return y
}
}
当我们需要为 float32
提供相同的功能时,我们也需要为 float32
重写相同的内容。
func minFloat(x float32, y float32) float32 {
if x < y {
return x
} else {
return y
}
}
借助类型参数的强大功能,我们可以轻松定义一个可以获得所需变量类型的函数。为了定义类型,我们还会遇到一个名为tilde ~
的新运算符。这个操作符实际上是返回给我们类型信息的接口,所以我们可以做我们的类型限制。让我们编写覆盖 int
和 float32
类型的相同 min
函数,如下所示。
type OrderTypes interface {
~int | ~float32
}
func min[P OrderTypes](x, y P) P {
if x < y {
return x
} else {
return y
}
}
看起来很结实吧?Go
还提出了一个约束库,其中包含已定义的类型组。例如,我们可以为所有有序类型实现我们的函数。
func min[P constraint.Ordered](x, y P) P {
if x < y {
return x
} else {
return y
}
}
约束库:https://github.com/golang/go/blob/master/src/constraints/constraints.go
当然,泛型的使用不限于此示例。它可能非常有用,尤其是在我们通常创建可用于多种类型的函数的 ORM
风格的问题中。同样,您可以查看Go
团队共享的这些示例,也可以给您一些想法。如果您想观看详细信息,该团队在 GopherCon
上进行了精彩的演示。
示例:https://github.com/golang/go/tree/dev.go2go/src/cmd/go2go/testdata/go2path/src
演示:https://youtu.be/KepBhuQJT9E
在线编辑器:https://gotipplay.golang.org/
gotip: https://pkg.go.dev/golang.org/dl/gotip
除此之外,我们可以进行实验的在线编辑器(游乐场)也很有用。如果您想在自己的环境中尝试 1.18
,您可以下载gotip
并使用 Go
的活动分支。
模糊测试
有了 Golang 1.18
包,“ Fuzzing
”功能将走进我们的生活。有了这个将作为测试版提供的测试库,我们将能够在单元测试中自动对我们的输入进行随机更改。
Fuzzing: https://go.dev/blog/fuzz-beta
作为软件开发人员,我们有时会错过单元测试的边缘情况。这种数据多样性的缺乏可能会被滥用并用于安全漏洞和漏洞,尤其是在关键库上。我们可以使用模糊测试来防止这种情况。
为了实现模糊测试,您可以使用名称以 Fuzz
前缀开头的方法包装单元测试。您还可以使用Go Testing
页面作为示例代码。
GO Testing: https://pkg.go.dev/testing@master#hdr-Fuzzing
func FuzzHex(f *testing.F) {
for _, seed := range [][]byte{{}, {0}, {9}, {0xa}, {0xf}, {1, 2, 3, 4 }} {
f.Add(seed)
}
f.Fuzz(func(t *testing.T, in []byte) {
enc := hex.EncodeToString(in)
out, err := hex.DecodeString(enc)
if err != nil {
t.Fatalf("%v: decode: %v", in, err)
}
if !bytes.Equal(in, out) {
t.Fatalf("%v: 往返后不相等:%v ", 进, 出)
}
})
}
工作区
此功能有助于同时处理多个模块的开发人员的工作。虽然在go.mod1.17
版本中可以使用 replace
命令更改模块版本,但在提交代码时经常忘记清除这些替换命令。每次插入或删除该行对于这些开发人员来说都是一件非常麻烦的事情。
使用工作区功能,您可以创建一个名为的新文件go.work
并在那里编写替换命令。该文件允许我们更改特定于我们工作环境的模块,而无需触及现有go.mod
文件。例如,您可以查看该属性的建议页面。
工作区:https://go.googlesource.com/proposal/+/master/design/45713-workspace.md
多模块工作区 cmd/go: https://go.googlesource.com/proposal/+/master/design/45713-workspace.md
go 1.17
directory (
./baz // foo.org/bar/baz
./tools // golang.org/x/tools
)
replace golang.org/x/net => example.com/fork/net v1.4.5
因此,
Go 1.18
带有有用的Fuzzing
和Workspaces
功能,以及一年多来讨论和介绍的泛型功能。除此之外,此版本还将进行许多改进和修复。您可以通过此链接了解版本的状态及其包含的内容
https://github.com/golang/go/milestone/201

参考地址[1]
参考资料
参考地址: https://medium.com/@emreodabas_20110/quick-guide-go-1-18-features-e236d5b351ef




