gpt4 book ai didi

go - 我们可以在不构造 "manually"的情况下在数组和结构之间进行转换吗?

转载 作者:IT王子 更新时间:2023-10-29 00:57:27 26 4
gpt4 key购买 nike

我有一个结构来表示 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}

关于go - 我们可以在不构造 "manually"的情况下在数组和结构之间进行转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52959285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com