2017-09-26 66 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