通常是这样的
func main() {
my_map := myFunc()
fmt.Println(my_map)
}
func myFunc() map[string]interface{} {
// .... create a map....
return map
}
当我运行这样的模式时,我几乎总是在尝试打印出 my_map 时遇到段错误。
如果我返回一个 []byte 类型,也会发生这种情况。
事情是这样的:我想明白为什么返回在 myFunc() 中创建的 []byte 会导致在 main 中打印它时出现段错误: slice 正在引用在 myFunc 中创建的数组,因此一旦 myFunc 返回,该数组就会被垃圾回收删除,从而导致段错误。
我假设 map 上发生了类似的事情。
在 C++ 中,它会简单地创建映射的副本,然后返回 --> 没问题。如果我返回一个数组,则相同。
为什么在 go 中,我不能简单地返回一个创建的映射,什么是返回映射(在函数内部创建)而不会在该函数返回到 main 时立即导致段错误的最佳方法?
func twitterRequest(query string, token string) map[string]interface{} {
req, err := http.NewRequest("GET", query, nil)
if err != nil {
log.Fatal(err.Error())
}
req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
client := &http.Client{}
resp, err2 := client.Do(req)
if err2 != nil {
log.Fatal(err.Error())
}
defer resp.Body.Close()
respBody, _ := ioutil.ReadAll(resp.Body)
var jsonResp interface{} // turns into map[string]interface{}
err = json.Unmarshal(respBody, &jsonResp)
if err != nil {
log.Fatal("wrong")
}
return jsonResp.(map[string]interface{})
}
func searchTweets(queries string, token string) {
builder := strings.Builder{}
builder.WriteString(tweetSearchUrl)
builder.WriteString("q=")
builder.WriteString(queries)
queryUrl := url.QueryEscape(builder.String())
map1 := twitterRequest(queryUrl, token)
fmt.Println(map1) // SEG FAULT HERE
}
最佳答案
在 Go 中返回在函数内部创建的值是完全可以的并且被广泛使用。编译器使用逃逸分析,如果不能证明一个值没有从函数中逃逸,就会分配到堆上,函数返回时不会销毁,函数返回后可以使用.
错误不可能来自打印 map 的行(除非它包含递归数据结构,但它不包含,因为它是 JSON 解码的结果)。打印空甚至 nil map 是可能的,并且不会导致错误。
最有可能的错误是在您的 twitterRequest() 函数中,可能是在您执行返回值的类型断言时:
return jsonResp.(map[string]interface{})
如果 jsonResp 为 nil,或者它持有的值不是 map[string]interface{ 类型,则此类型断言会导致运行时 panic }。如果响应体是无效的JSON,它可能是nil,如果响应体是有效的JSON,它可能是其他类型的值,但例如它是一个JSON数组。
首先,检查所有错误,包括阅读正文时的错误:
respBody, _ := ioutil.ReadAll(resp.Body)
这样做:
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
// Handle error, optionally return
}
您还应该使用特殊形式的类型断言:
m, ok := jsonResp.(map[string]interface{})
if !ok {
// jsonResp is nil or is not a map!
// Handle this error case and return
}
return m // all ok
这种特殊形式的类型断言永远不会 panic,相反如果断言不成立,ok 变量将为 false,您可以检查并妥善处理.如果ok是true,那说明jsonResp不是nil,里面的值确实是一个值类型 map[string]interface{},它存储在 m 中,您可以安全地返回它。
关于json - 每当引用从函数返回的 slice 或映射时为空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50795541/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":