J'ai une structure pour représenter un vecteur dans un espace 3D.
type Vec3 struct {
X, Y, Z float64
}
Une autre bibliothèque que j'utilise fait quelque chose de similaire, mais différent :
type Vector [3]float64
D'après ce que je comprends, les deux types doivent occuper 24 octets et chaque float64
dans un type doit s'aligner sur un float64
dans l'autre type. Ainsi, nous devrions pouvoir assigner de l'un à l'autre sans trop de problème. Cependant, le compilateur n'aime pas essayer d'effectuer ces castings ni implicitement ni explicitement, donc la méthode la plus propre (mais verbeuse) semble être de toujours construire la valeur manuellement :
// 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]}
Une autre méthode que j'ai trouvée est la suivante, mais elle n'est pas moins verbeuse (et probablement plus lente, et elle ne nous arrêtera pas si jamais l'un des types change).
valueOfTargetType := *(*targetType)(unsafe.Pointer(&sourceValue))
Peut-on donc les utiliser sans construire explicitement une nouvelle valeur ?