#runtime error: invalid memory address or nil pointer dereference
自作で簡単なAPIサーバーを作っているのですが,サーバーにリクエストを送るとTerminalに上のようなエラーが出てしまいます。解決できる方法を探しいます、よろしくお願いします。
##試したこと
GetAllBooks関数の
rows, err := db.Query("SELECT * FROM book;") if err != nil { log.Fatal(err) }
以下をコメントアウトしてリクエストを送っても、上のエラーが表示されるのですが上のコードもコメントアウトしたらブラウザーにHello worldが表示されます。なのでもしかしたら上のコードに問題があるかもしれません..
##全てのコード
Go
1package main 2 3import ( 4 "database/sql" 5 "encoding/json" 6 "fmt" 7 "github.com/go-sql-driver/mysql" 8 "github.com/gorilla/mux" 9 "log" 10 "net/http" 11 "os" 12) 13 14var db *sql.DB 15 16type Book struct { 17 ID string `json:"id"` 18 Title string `json:"title"` 19 Page int `json:"page"` 20 Price int `json:"price"` 21} 22 23type Error struct { 24 Message string `json:"message"` 25} 26 27func GetAllBooks(w http.ResponseWriter, r *http.Request){ 28 fmt.Fprintf(w, "Hello world") 29 var error Error 30 rows, err := db.Query("SELECT * FROM book;") 31 if err != nil { 32 log.Fatal(err) 33 } 34 var books []Book 35 36 if err != nil { 37 error.Message = "Cant not get data from database" 38 w.Header().Set("Content-Type", "application/json") 39 json.NewEncoder(w).Encode(error.Message) 40 return 41 } 42 43 for rows.Next() { 44 var book Book 45 if err := rows.Scan(&book.ID, &book.Title, &book.Page, &book.Price); err != nil { 46 error.Message = "Cant not get data from database" 47 w.Header().Set("Content-Type", "application/json") 48 json.NewEncoder(w).Encode(error.Message) 49 return 50 } 51 books = append(books, book) 52 } 53 if err := rows.Err(); err != nil { 54 error.Message = "Cant not get data from database" 55 w.Header().Set("Content-Type", "application/json") 56 json.NewEncoder(w).Encode(error.Message) 57 return 58 } 59 w.Header().Set("Content-Type", "application/json") 60 json.NewEncoder(w).Encode(books) 61 defer rows.Close() 62} 63 64func main(){ 65 cfg := mysql.Config{ 66 User: os.Getenv("DBUSER"), 67 Passwd: os.Getenv("DBPASS"), 68 Net: "tcp", 69 Addr: "127.0.0.1:3306", 70 DBName: "bookAPI", 71 } 72 var err error 73 db, err := sql.Open("mysql", cfg.FormatDSN()) 74 defer db.Close() 75 if err != nil { 76 log.Fatal(err) 77 } 78 pingErr := db.Ping() 79 if pingErr != nil { 80 log.Fatal(pingErr) 81 } 82 fmt.Println("Connected to database!") 83 84 router := mux.NewRouter() 85 router.HandleFunc("/books", GetAllBooks).Methods("GET") 86 log.Fatal(http.ListenAndServe(":8000", router)) 87}
エラーはどの行に対して出力されましたか?
エラー内容を見ても何行目を見ればいいのかわからないです... エラー内容の画像を追加したのでもしよければ見てください
回答1件
あなたの回答
tips
プレビュー