来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《从函数返回时无法接收正确的对象》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!
问题内容在函数 demo1_callfindall()
中,我尝试从数据库返回一个对象。
在 foo()
中,使用 print 后我看不到它。但是,我调用 demo1_callfindall
函数,并且可以看到其中的对象数组。
请解释原因并更正我的代码。
func foo(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
var tags = Demo1_CallFindAll()
fmt.Println(tags) // Here I see nothing
js, err := json.Marshal(tags)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write(js)
json.NewEncoder(w).Encode("OKOK")
}
func Demo1_CallFindAll()(products []entities.Product) {
db,err:=config.GetMySQLDB()
if err !=nil{
fmt.Println(err)
}else{
productModel := models.ProductModel{
Db:db,
}
products,err := productModel.FindAll()
if err !=nil{
fmt.Println(err)
}else{
fmt.Println(products)//[{1 Nokia1 10 2 true} {2 Nokia2 11 22 false}]
fmt.Println("Product List")
}
}
return
}
解决方案
错误在这一行:products,err := ProductModel.FindAll()
。您在 Demo1_CallFindAll()
函数中使用了命名返回参数。命名的返回参数被初始化为零值(参考:https://golang.org/doc/effective_go.html#named-results)。
但是在 products,err := ProductModel.FindAll()
行中,您创建了一个新变量(通过 :=
)products
并在其中设置结果,而不是在返回参数 products
中。这就是为什么您在 foo()
函数中看不到任何内容的原因。要解决此问题,请将 :=
更改为 =
, products,err = ProductModel.FindAll()
。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持编程网!更多关于Golang的相关知识,也可关注编程网公众号。