我在以下测试代码中尝试转换res为a ListSociete时并没有完全理解问题所在:
res
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" }吗?
[]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