如何将一种数字类型的切片转换为另一种类型

use*_*949 6 go

我正在尝试 Go 语言,而且对它还很陌生。我已经成功地完成了这些教程,现在正在编写一个小程序来评估它对于我通常执行的操作类型的性能。我有一个很长的 float32 类型切片,需要尽可能高效地将其转换为 float64 类型切片。除了迭代切片的元素并通过 output[i] = float64(data[i]) 显式转换各个元素的类型之外,是否有方法可以用来转换整个切片而不需要迭代?我尝试寻找解决方案,但没有找到任何直接相关的内容。

Ala*_*air 5

Go 的级别相当低,这意味着迭代切片最有效的方法。其他语言可能有用于此类操作的内置函数,但它们所做的只是迭代切片,没有迭代就无法做到这一点。但有一些技巧,特别是使用范围并避免索引切片,因为越界检查会产生开销。这将是最有效的:

func convertTo64(ar []float32) []float64 {
   newar := make([]float64, len(ar))
   var v float32
   var i int
   for i, v = range ar {
      newar[i] = float64(v)
   }
   return newar
}

slice32 := make([]float32, 1000)
slice64 := convertTo64(slice32)
Run Code Online (Sandbox Code Playgroud)

请注意,在范围循环中使用:=是低效的,因为在当前版本的 Go 中,变量会被丢弃并每次重新创建,而不是被重用。使用range而不是for i=0; i<n; i++更有效,因为它节省了对 的边界检查ar