七叶笔记 » golang编程 » Go 1.18 即将发布,这些点你值得关注

Go 1.18 即将发布,这些点你值得关注

随着计划于 2022 年第一季度发布的 Go 1.18 版本,许多新功能正在等待我们。

这个版本将是 Go 历史上最关键的包之一,我们可能会在一个月内达到 beta 版本。那么这些变化是什么?

类型参数( 泛型

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)  float 32 { 
   if x < y { 
      return x 
   } else { 
      return y 
   } 
}  

借助类型参数的强大功能,我们可以轻松定义一个可以获得所需变量类型的函数。为了定义类型,我们还遇到了一个名为 的新 运算符 tilde ~。这个操作符实际上是返回给我们类型信息的接口,所以我们可以做类型限制。让我们编写涵盖 int 和 float32 类型的相同 min 函数 ,如下所示。

 类型 OrderTypes 接口 { 
   ~int | ~float32 
}func min[P OrderTypes](x, y P) P { 
    if x < y { 
      return x 
    } else { 
      return y 
    } 
}  

它看起来很赞,对吧?Go 还提出了一个包含已定义类型组的约束库。例如,我们可以为所有有序类型实现我们的函数。

 func min[P constraints.Ordered](x, y P) P { 
    if x < y { 
      return x 
    } else { 
      return y 
    } 
}  

当然,泛型的使用不仅限于这个示例。它可能非常有用,尤其是在我们通常创建适用于多种类型的函数的 ORM 样式问题中。同样,您可以查看Go 团队分享的这些示例,也可以为您提供一些想法。如果您想观看详细信息,该团队在 GopherCon上做了一个很棒的演示。
除此之外,我们可以进行实验的在线编辑器()也将很有用。如果您想在自己的环境中尝试 1.18,您可以下载 go tip( 并使用 Go 的活动分支。

模糊测试(Fuzzy test)

使用 Golang 1.18 包,“ Fuzzing ”功能将进入我们的生活。有了这个将作为 beta 版提供的测试库,我们将能够在单元测试中自动对我们的输入进行随机突变。

作为软件开发人员,我们有时会错过单元测试的边缘案例。这种缺乏数据多样性的情况可能会被滥用并用于安全漏洞和漏洞,尤其是在关键库上。我们可以使用模糊测试来防止这种情况。

为了实现 Fuzzing 测试,您可以使用名称以 Fuzz 前缀开头的方法包装您的单元测试。您还可以使用Go 测试页面作为示例代码。

 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. decode String(enc) 
    if err != nil { 
      t.Fatalf("%v: decode: %v", in,  err ) 
    } 
    if !bytes.Equal(in, out) { 
      t.Fatalf("%v: 往返后不相等: %v ", 进, 出) 
    } 
  }) 
}  

工作区

此功能有助于开发人员同时处理多个模块的工作。虽然在 1.17 版本中可以使用替换命令更改模块版本go.mod,但在提交代码时经常忘记清除这些替换命令。每次插入或删除该行对这些开发人员来说都是一件非常麻烦的事情。

使用Workspace功能,您可以创建一个名为的新文件go.work并在其中编写替换命令。该文件允许我们更改特定于我们工作环境的模块,而无需触及现有go.mod文件。可以查看这个功能的使用手册:

 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  

相关文章