暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

快速指南:Go 1.18 特性

云原生CTO 2021-12-14
1929

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]

参考资料

[1]

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


文章转载自云原生CTO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论