Golang / neoism:调用查询返回的对象方法会导致恐慌

时间:2014-12-10 16:11:47

标签: go neo4j

当试图调用neoism.CypherQuery调用返回的Node对象的方法时,我不断得到“无效的内存地址或无指针解引用”恐慌。查询返回一些内容(访问Data工作的Node属性),但调用任何方法都会导致恐慌。这些方法有接收器*Node,而不是Node,但AFAIK应该可以工作吗?无论如何,我已经尝试获取指向该对象的指针并在其上调用该方法,但这也无效。我真的被困在这里......

重现问题的示例代码(需要新主义和go-uuid包以及在localhost上运行的Neo4J数据库):

package main

import (
    "code.google.com/p/go-uuid/uuid"
    "fmt"
    "github.com/jmcvetta/neoism"
)

func main() {
    neo, _ := neoism.Connect("http://localhost:7474/db/data")

    // create a node with a random id
    nodeId := uuid.New()
    _, err := neo.CreateNode(neoism.Props{"NodeId": nodeId})
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("node created, id", nodeId)

    // find the node by the id
    res := []struct {
        Node neoism.Node `json:"nodes"`
    }{}
    err = neo.Cypher(&neoism.CypherQuery{
        Statement:  `MATCH (nodes {NodeId:{NodeId}}) RETURN nodes`,
        Parameters: neoism.Props{"NodeId": nodeId},
        Result:     &res,
    })
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("query executed")

    // try to work with the query results
    if len(res) > 0 {
        // get Data -> works
        fmt.Println(res[0].Node.Data)
        // call method -> panics
        err = res[0].Node.SetProperty("TestProp", "TestValue")
        if err != nil {
            fmt.Println(err)
            return
        }
    }
}

这是堆栈跟踪的相关部分:

goroutine 1 [running]:
github.com/jmcvetta/neoism.(*entity).SetProperty(0x119abc00, 0x5d3a68, 0x8, 0x5d3a88, 0x9, ...)
        .../src/github.com/jmcvetta/neoism/entity.go:26 +0x104
main.main()
        .../src/nieware/neoprob/neoprob.go:41 +0x4cb

1 个答案:

答案 0 :(得分:2)

查看SetProperty方法的来源:https://github.com/jmcvetta/neoism/blob/master/entity.go#L22

它看起来像是来自嵌入式结构,实际上并不是Node结构上的方法。嵌入式实体结构不是指针,因此它也不应该为空。

堆栈跟踪显示紧急情况发生在第26行,因为e.Db未初始化:

resp, err := e.Db.Session.Put(url, &value, nil, &ne)

在调用SetProperty之前设置e.Db解决了问题:

res[0].Node.Db = neo