Golang:结构切片之间的类型转换

尼古拉斯·马歇尔:

是我的另一个问题

在以下测试代码中尝试转换res为a 并没有完全理解问题所在ListSociete

import (
    "errors"
    "fmt"
    "github.com/jmcvetta/neoism"
)

type Societe struct {
    Name string
}

type ListSociete []Societe

func loadListSociete(name string) (ListSociete, error) {
    db, err := neoism.Connect("http://localhost:7474/db/data")
    if err != nil {
        return nil, err
    }
    res := []struct {
        Name string `json:"a.name"`
    }{}
    cq := neoism.CypherQuery{
        Statement: `
            MATCH (a:Societe)
            WHERE a.name = {name}
            RETURN a.name
            `,
        Parameters: neoism.Props{"name": name},
        Result:     &res,
    }
    db.Cypher(&cq)
    if len(res) == 0 {
        return nil, errors.New("Page duz not exists")
    }
    r := res[0]
    return ListSociete(res), nil
}

[]struct{Name string}有所不同[]struct{Name string json:"a.name" }吗?

还是ListSociete与ListSociete不同[]struct{Name string}

谢谢。

阿尼斯:

您当前正在处理两种不同的类型:

type Societe struct {
    Name string
}

和匿名的:

struct {
    Name string `json:"a.name"`
}

如果不是标记,那么这两个将是相同的。围棋规格的状态(我的重点):

如果两个struct类型具有相同的字段序列,并且对应的字段具有相同的名称,相同的类型和相同的tag,则它们是相同的两个匿名字段被认为具有相同的名称。来自不同软件包的小写字段名称始终是不同的。

因此,您无法在两者之间进行简单的转换。同样,转换两种类型的切片的事实使转换成为问题。我可以为您看到两个选择:

通过迭代复制:

这是安全且建议的解决方案,但它又冗长且缓慢。

ls := make(ListSociete, len(res))
for i := 0; i < len(res); i++ { 
    ls[i].Name = res[i].Name
}
return ls, nil

不安全的转换:

由于两种类型都具有相同的基础数据结构,因此可能会进行不安全的转换。
但是,此后可能会炸掉您的脸。被警告!

return *(*ListSociete)(unsafe.Pointer(&res)), nil

游乐场示例: http //play.golang.org/p/lfk7qBp2Gb

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章