sqlrows เป็นเครื่องวิเคราะห์รหัสแบบคงที่ซึ่งช่วยค้นพบข้อบกพร่องโดยการรายงานการวินิจฉัยข้อผิดพลาดของการใช้ sql.Rows การใช้งาน
คุณสามารถรับ sqlrows by go get คำสั่ง
$ go get -u github.com/gostaticanalysis/sqlrows sqlrows Run กับ go vet ดังต่อไปนี้เมื่อ GO คือ 1.12 และสูงกว่า
$ go vet -vettool= $( which sqlrows ) github.com/you/sample_api/... เมื่อ GO ต่ำกว่า 1.12 เพียงเรียกใช้คำสั่ง sqlrows ด้วยชื่อแพ็คเกจ (เส้นทางนำเข้า)
แต่มันไม่สามารถยอมรับตัวเลือกบางอย่างเช่น --tags
$ sqlrows github.com/you/sample_api/... sqlrows ตรวจสอบข้อผิดพลาดทั่วไปเมื่อใช้ *sql.Rows
ในตอนแรกคุณต้องโทรหา rows.Close() ในฟังก์ชั่นเลื่อนเวลา การเชื่อมต่อจะไม่ถูกนำกลับมาใช้ใหม่หากคุณล้มเหลวในการสแกนเร็กคอร์ดและลืมปิด *sql.Rows โดยไม่คาดคิด
rows , err := db . QueryContext ( ctx , "SELECT * FROM users" )
if err != nil {
return nil , err
}
for rows . Next () {
err = rows. Scan ( ... )
if err != nil {
return nil , err // NG: this return will not release a connection.
}
} และหากคุณเลื่อนการเรียกใช้ฟังก์ชันเพื่อปิด *sql.Rows ก่อนที่จะตรวจสอบข้อผิดพลาดที่กำหนดว่าการส่งคืนนั้นถูกต้องหรือไม่มันจะหมายถึงคุณจะโทรหา rows.Close()
rows , err := db . QueryContext ( ctx , "SELECT * FROM users" )
defer rows . Close () // NG: using rows before checking for errors
if err != nil {
return nil , err
}มันอาจทำให้เกิดการอ้างอิงความตื่นตระหนกและไม่มีตัวชี้ แต่มันจะไม่สอนคุณอย่างชัดเจนว่าเป็นเพราะพวกเขา