質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

解決済

Goのruntime error: invalid memory address or nil pointer dereference

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

1回答

-1評価

0クリップ

1375閲覧

投稿2021/11/06 03:19

編集2021/11/06 05:42

#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

package main import ( "database/sql" "encoding/json" "fmt" "github.com/go-sql-driver/mysql" "github.com/gorilla/mux" "log" "net/http" "os" ) var db *sql.DB type Book struct { ID string `json:"id"` Title string `json:"title"` Page int `json:"page"` Price int `json:"price"` } type Error struct { Message string `json:"message"` } func GetAllBooks(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, "Hello world") var error Error rows, err := db.Query("SELECT * FROM book;") if err != nil { log.Fatal(err) } var books []Book if err != nil { error.Message = "Cant not get data from database" w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(error.Message) return } for rows.Next() { var book Book if err := rows.Scan(&book.ID, &book.Title, &book.Page, &book.Price); err != nil { error.Message = "Cant not get data from database" w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(error.Message) return } books = append(books, book) } if err := rows.Err(); err != nil { error.Message = "Cant not get data from database" w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(error.Message) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(books) defer rows.Close() } func main(){ cfg := mysql.Config{ User: os.Getenv("DBUSER"), Passwd: os.Getenv("DBPASS"), Net: "tcp", Addr: "127.0.0.1:3306", DBName: "bookAPI", } var err error db, err := sql.Open("mysql", cfg.FormatDSN()) defer db.Close() if err != nil { log.Fatal(err) } pingErr := db.Ping() if pingErr != nil { log.Fatal(pingErr) } fmt.Println("Connected to database!") router := mux.NewRouter() router.HandleFunc("/books", GetAllBooks).Methods("GET") log.Fatal(http.ListenAndServe(":8000", router)) }

#エラー内容
イメージ説明

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

nobonobo

2021/11/06 05:34

エラーはどの行に対して出力されましたか?
退会済みユーザー

退会済みユーザー

2021/11/06 05:43

エラー内容を見ても何行目を見ればいいのかわからないです... エラー内容の画像を追加したのでもしよければ見てください

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。