У меня есть структура для представления вектора в трехмерном пространстве.
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))
Итак, можем ли мы привести их без явного создания нового значения?