IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天给大家整理了《我们可以在不“手动”构造的情况下在数组和结构之间进行转换吗?》,聊聊,我们一起来看看吧!
问题内容
我有一个结构体来表示 3D 空间中的向量。
type vec3 struct {
x, y, z float64
}
我正在使用的另一个库做了类似但不同的事情:
type vector [3]float64
根据我的理解,两种类型都应占用 24 个字节,并且一种类型中的每个 float64 应与另一种类型中的 float64 对齐。因此,我们应该能够轻松地从一个分配到另一个。然而,编译器不喜欢尝试隐式或显式地转换这些值,因此最干净(但冗长)的方法似乎是始终手动构造值:
// vec3 to vector
vec3 := vec3{1, 2, 3}
vector := vector{vec3.x, vec3.y, vec3.z}
// vector to vec3
vector := vector{1, 2, 3}
vec3 := vec3{vector[0], vector[1], vector[2]}
我发现的另一种方法如下,但它看起来同样冗长(而且可能更慢(如果其中一种类型发生变化,它不会阻止我们)。
valueOfTargetType := *(*targetType)(unsafe.Pointer(&sourceValue))
那么,我们可以在不显式构造新值的情况下转换这些值吗?
解决方案
要获得内联的简洁解决方案,请使用方法。
例如,
package main
import "fmt"
type vec3 struct {
x, y, z float64
}
func (v vec3) vector() vector {
return vector{v.x, v.y, v.z}
}
type vector [3]float64
func (v vector) vec3() vec3 {
return vec3{x: v[0], y: v[1], z: v[2]}
}
func main() {
v3 := vec3{x: 1, y: 2, z: 3}
v3v := v3.vector()
fmt.println(v3, v3v)
v := vector{4, 5, 6}
vv3 := v.vec3()
fmt.println(v, vv3)
}
输出:
{1 2 3} [1 2 3]
[4 5 6] {4 5 6}
不。
鉴于不可能在不进行复制的情况下将数组转换为结构体,我建议在程序开始时预先加载 type vec3 -> [3]float64 的复制,这样你就不会在程序开始时遇到任何惩罚主循环。
首先考虑完成该计划,看看最终用户是否可以接受性能。
根据我使用 3d 矢量的经验,在矢量上应用 3d 变换才是真正的性能杀手。之后尝试运行分析器来检查处理的哪一部分会对您的开发时间产生最大的影响。
希望这有帮助。
今天关于《我们可以在不“手动”构造的情况下在数组和结构之间进行转换吗?》的内容就介绍到这里了。