一尘不染

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

go

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


阅读 222

收藏
2020-07-02

共1个答案

一尘不染

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)

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

2020-07-02