Go语言调试Feed结构体:RetrieveFeeds调用报错及空输出问题
解决Go代码的两个问题:编译错误与返回nil排查
咱们一步步来搞定你遇到的问题哈:
第一个问题:multiple-value search.RetrieveFeeds() in single-value context编译错误
这个错误的原因很直接:你定义的RetrieveFeeds()函数会返回两个值——[]*Feed类型的Feed数组,以及error类型的错误信息,但你的主函数里只用了一个变量feeds来接收返回值,Go编译器可不允许这种“偷懒”行为~
你只需要修改main.go的代码,同时接收两个返回值并处理错误就好:
package main import ( "fmt" "search" ) func main() { fmt.Println("Hello") // 同时接收返回的feeds和error feeds, err := search.RetrieveFeeds() if err != nil { // 如果有错误,直接打印错误信息 fmt.Printf("获取Feed失败:%v\n", err) return } fmt.Printf("%v\n", feeds) }
第二个问题:修改路径后输出<nil>
出现<nil>说明你的feeds变量是空的,大概率是文件没找到或者JSON解码出错了,但之前你没处理错误,所以根本不知道问题出在哪。按照上面修改后的代码加上错误处理,你就能直接看到具体的错误原因了。
常见的路径问题排查
你的项目结构是:
项目根目录/ ├─ src/ │ ├─ data/ │ │ └─ data.json │ ├─ main/ │ │ └─ main.go │ └─ search/ │ └─ feed.go
- 如果你是在项目根目录下运行命令
go run src/main/main.go,那const dataFile = "src/data/data.json"这个路径是正确的; - 如果你是进入
src/main目录后运行go run main.go,那程序的工作目录是src/main,这时候src/data/data.json就会变成src/main/src/data/data.json,显然不存在,自然会返回错误。
额外的调试技巧
你可以在RetrieveFeeds()函数里先打印当前工作目录,确认路径是否正确:
func RetrieveFeeds() ([]*Feed, error){ // 打印当前工作目录 wd, err := os.Getwd() if err != nil { return nil, err } fmt.Printf("当前工作目录:%s\n", wd) file, err := os.Open(dataFile) if err != nil { return nil, err } defer file.Close() var feeds []*Feed err = json.NewDecoder(file).Decode(&feeds) return feeds, err }
这样你就能清楚知道程序在哪个目录下运行,从而调整dataFile的路径了。另外,你的JSON字段和结构体tag的映射是正确的,只要文件能正确读取,解码就不会有问题~
内容的提问来源于stack exchange,提问作者somejkuser
相关产品推荐
相关产品推荐

