Nic*_*all 3 struct type-conversion go
这个问题跟我的另一个问题有关.
我没有完全弄清楚我在以下测试代码中转换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
}
Run Code Online (Sandbox Code Playgroud)
是不是[]struct{Name string}一个[]struct{Name string json:"a.name" }?
或者是ListSociete与[]struct{Name string}?
谢谢.
您目前正在处理两种不同的类型:
type Societe struct {
Name string
}
Run Code Online (Sandbox Code Playgroud)
和匿名的:
struct {
Name string `json:"a.name"`
}
Run Code Online (Sandbox Code Playgroud)
如果不是标签,这两个将是相同的.在围棋规格的状态(我的重点):
如果两个结构类型具有相同的字段序列,并且相应的字段具有相同的名称,相同的类型和相同的标记,则它们是相同的.两个匿名字段被认为具有相同的名称.来自不同包的小写字段名称总是不同的.
所以,你不能在两者之间进行简单的转换.此外,您正在转换这两种类型的切片这一事实使转换成为问题.我可以看到两个选项:
复制迭代:
这是安全且推荐的解决方案,但它也更冗长,更慢.
ls := make(ListSociete, len(res))
for i := 0; i < len(res); i++ {
ls[i].Name = res[i].Name
}
return ls, nil
Run Code Online (Sandbox Code Playgroud)
不安全的转换:
由于两种类型都具有相同的底层数据结构,因此可以进行不安全的转换.
然而,这可能会在以后爆炸.被警告!
return *(*ListSociete)(unsafe.Pointer(&res)), nil
Run Code Online (Sandbox Code Playgroud)
游乐场示例: http ://play.golang.org/p/lfk7qBp2Gb
| 归档时间: |
|
| 查看次数: |
4126 次 |
| 最近记录: |