草庐IT

Golang/新主义 : calling methods of objects returned by query leads to panic

coder 2023-06-28 原文

当尝试调用通过调用 neoism.CypherQuery 返回的 Node 对象的方法时,我不断收到“无效内存地址或 nil 指针取消引用” panic 。查询返回一些东西(访问 NodeData 属性有效),但调用任何方法都会导致 panic 。这些方法有接收器 *Node,而不是 Node,但是 AFAIK 应该仍然有效吗?无论如何,我已经尝试获取指向该对象的指针并调用该对象的方法,但这也没有用。我真的被困在这里......

重现问题的示例代码(需要新主义和 go-uuid 包以及在本地主机上运行的 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

最佳答案

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

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

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

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

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

res[0].Node.Db = neo

关于Golang/新主义 : calling methods of objects returned by query leads to panic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27405705/

有关Golang/新主义 : calling methods of objects returned by query leads to panic的更多相关文章

  1. ruby-on-rails - not_nil 有 Ruby 或 Ruby 主义吗?与零相反?方法? - 2

    我没有使用Ruby的经验,所以我的代码感觉“丑陋”而且不符合地道:deflogged_in?!user.nil?end我宁愿有类似的东西deflogged_in?user.not_nil?end但是找不到这样一个对立nil?的方法 最佳答案 您似乎过分关注bool值。deflogged_in?userend如果用户为nil,那么logged_in?将返回一个“假”值。否则,它将返回一个对象。在Ruby中,我们不需要返回true或false,因为我们有像JavaScript中一样的“truthy”和“falsey”值。更新如果您使用的

  2. javascript - 适用于 iPhone 的极简主义可缓存 jQuery/javascript 库? - 2

    鉴于iPhone's25klimitforcachingoffiles,我想知道是否有人对将缓存作为顶级目标的iPhone优化的javascript库感兴趣。因为它只是iPhone,所以它可以摆脱大多数跨浏览器的障碍并依赖于safari的特定功能,希望减少一些周长并保持在25k。JohnResigdiscussesthisbriefly,尽管看起来主要是为了驳回它。他确实提到:ifyou'reparticularlyexcitedaboutbreakingjQuerydownintolittlechunksyoucangrabtheindividualpiecesfromSVNandb

  3. javascript - 极简主义的微型 Javascript 模板系统? - 2

    我正在为javascript寻找一个极简主义的模板系统,alaJohnResig'sJavascriptMicroTemplating.越小越好,如果它是基于jquery的就更好了。推荐?我尝试了John的微模板,但遇到了一些问题,想看看是否有更多成熟/更好的打包解决方案。[更新]我再次尝试了Resig的微模板,它对我来说效果很好。仍然想听听其他替代方案(如果有的话)。 最佳答案 还有Mustache.js,它有一个简洁的语法IMO。 关于javascript-极简主义的微型Javasc

  4. 华为OD机试Golang解题 - 任务总执行时长 - 2

    华为Od必看系列华为OD机试全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理已参加机试人员的实战技巧华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典文章目录华为Od必看系列使用说明本期题目:任务总执行时长题目输入输出示例一输入输出说明go代码实现华为OD其它语言版本

  5. 【编程实践】Golang 获取HTTP请求的IP地址 - 2

    目录Golang获取HTTP请求的IP地址HTTP的发展历史3,HTTP所在的网络层次4,HTTP请求与响应

  6. Golang SQL 查询语法 - 2

    关闭。这个问题需要debuggingdetails.它目前不接受答案。编辑问题以包含desiredbehavior,aspecificproblemorerror,andtheshortestcodenecessarytoreproducetheproblem.这将有助于其他人回答问题。关闭4年前。Improvethisquestion在golang代码中使用sql查询获取语法错误。golang中此SQL查询所需的正确语法:rows,errQuery:=dbCon.Query("SELECTB.LatestDate,A.SVRNameASServerName,A.DRIVE,A.Tot

  7. go - 在golang中的表达式中检查括号是否平衡[保持] - 2

    给定表达式字符串exp,编写程序检查exp中“{”、“}”、“(”、“)”、“[”、“]的对和顺序是否正确。packagemainimport("fmt"stack"github.com/golang-collections/collections/stack")funcmain(){s:="(a[0]+b[2c[6]])){24+53}"stackO:=stack.New()stackmap:=map[string]string{"[":"]","(":")","{":"}"}varstr=""for_,num:=ranges{str=string(num)if(str=="{"||

  8. Golang libphonenumber - 2

    关闭。这个问题是notreproducibleorwascausedbytypos.它目前不接受答案。这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这个问题的解决方式不太可能帮助future的读者。关闭3年前。Improvethisquestion如何通过使用此库在golang中传递数字来获取国家代码:https://godoc.org/github.com/nyaruka/phonenumbers?

  9. go - func 的语法 Golang 错误 - 2

    为什么下面的代码会抛出意外的函数错误?我看到错误./func_correct.go:4:syntaxerror:unexpectedfunc,expectingnamepackagemainfunc(st*Stack)Pop()int{v:=0forix:=len(st)-1;ix>=0;ix--{ifv=st[ix];v!=0{st[ix]=0returnv}}return0}funcmain(){Pop()} 最佳答案 定义堆栈类型在main中为其创建一个变量对其调用Pop代码:packagemainimport"fmt"typ

  10. go - 进程花费了太长时间程序退出:Golang错误 - 2

    Thisquestionalreadyhasanswershere:ForloopoftwovariablesinGo(3个答案)2年前关闭。我正在通过Gotour在Go中使用for循环我跑的时候packagemainimport"fmt"funcmain(){sum:=1forsum程序运行正常,输出为1024但是当我更改sum:=0时packagemainimport"fmt"funcmain(){sum:=0forsum它给出了错误的说法processtooktoolongProgramexited.编辑:我沉迷于Go巡回赛,以至于我无法意识到,我犯了一个逻辑错误:P。

随机推荐