【问题标题】:Conversion between slices with similar element type具有相似元素类型的切片之间的转换
【发布时间】:2020-06-29 22:06:38
【问题描述】:

我研究过this post,但我不知道如何在我的情况下使用它。

第一个包

我有第一个这种类型的包裹:

type Vertex struct {
    X, Y, Z float32
}

有一个像这样的切片:

var V []Vertex

第二包

第二个包的 API 无法修改。在第二个包中,有这个功能:

func Compute(points []struct{X, Y, Z float32}) (err error) {
    // ...
    return
}

第一个包调用第二个包

在第一个包裹内,我打算调用第二个包裹。没有将所有字段从源复制到目标的循环:

err = secondpackage.Compute(V)

但我收到此错误:

不能使用“V”(类型 []Vertex)作为类型 []struct {...}

没用

受到this post的启发,我尝试通过以下方式转换:

points := []struct {
    X, Y, Z float32
}(V)
err = secondpackage.Compute(points)

但我收到此错误:

无法将'[]Vertex'类型的表达式转换为'[]struct { X, Y, Z float32 }'类型

【问题讨论】:

  • 那么,隐藏切片的最快方法是什么?
  • 写一个for循环并显式转换每个切片元素。
  • 最快的方式是func convert(vs []Vertex) []struct { X, Y, Z float32 }{ return nil },但这可能不是最正确的方式。实际上只有一种方法:写一个循环。
  • here ... but you can't change the name (and method set) of elements of a composite type ... 我很想知道为什么?是因为哲学限制吗?是因为方法限制吗?

标签: go


【解决方案1】:

请注意,您正在尝试创建切片:

points := []struct {
    X, Y, Z float32
}(V)

但您并没有真正给出切片应填充的值。为此,您应该使用 {V} 而不是 (V)

工作示例:

https://play.golang.org/p/yYaQM-mPPjB

package main

import (
    "fmt"
)

type Vertex struct {
    X, Y, Z float32
}

var V []Vertex

func Compute(points []struct{ X, Y, Z float32 }) (err error) {
    fmt.Printf("%v\n", points)
    return nil
}
func main() {
    v := Vertex{1, 2, 3}
    points := []struct {
        X, Y, Z float32
    }{v}
    Compute(points)
}

或者,您可以更明确:

points := []struct {
    X, Y, Z float32
}{{v.X, v.Y, v.Z}}

【讨论】:

  • 谢谢 :) 问题是我有V := []tri.Vertex{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 这是一个切片:(
猜你喜欢
  • 2012-08-09
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2012-09-10
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多