2017-09-26 68 views
0

我正試圖將數據寫入數據庫。 但我有錯誤「的恐慌:運行時錯誤:無效的內存地址或零指針引用」 在這個函數中,我等待數據從客戶機將數據發送到數據庫時出錯

func handlePacket(conn net.Conn) { 
    rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) 
    defer conn.Close() 

    packet := model.RegistrationMessage{} 
    client := JsonDecoderMessage(rw).Decode(&packet) 
    if client != nil { 
     puts("Error from Decode.Please NO :(") 
    } 

    if packet.MessageType == model.AUTH_MESSAGE { 
     puts("Auth") 
    } else if packet.MessageType == model.REGS_MESSAGE { 
     puts("Regs") 
     Registration(packet.Login, packet.Password) 
     puts("good") 
    } 
} 

在這裏,我建立一個數據庫和我聯繫嘗試在DB

var db *sql.DB 

func InitDataBase() { 
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+ 
     "password=%s dbname=%s sslmode=disable", 
     host, port, user, password, dbname) 
    db, err := sql.Open("postgres", psqlInfo) 
    if err != nil { 
     panic(err) 
    } 
    defer db.Close() 

    err = db.Ping() 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println("Successfully connected!") 
} 
func Registration(email, password string) { 
    sqlStatement := `INSERT INTO account0(email,password) 
     VALUES ($1, $2) RETURNING id` 
    id := 0 
    err := db.QueryRow(sqlStatement, email, password).Scan(&id) 
    if err != nil { 
     panic(err) 
    } 
} 
+0

將推遲db.Close()放入您的主函數中。 –

回答

7

defer db.Close()InitDataBase()的回報,所以當你在Registration使用db,它會導致一個錯誤將被執行發送數據。

您應該在程序退出前或在完成數據庫工作之後,以先到者爲準,致電db.Close()

0

謝謝大家。我找到了答案。您需要將db, err: = sql.Open ("postgres", psqlInfo)更改爲db, err= sql.Open ("postgres", psqlInfo)。 在此鏈接中找到的答案enter link description here