如何從 Golang 中的函數引用開啟的資料庫連線
在許多 Golang 應用程式中,需要與資料庫互動。通常,資料庫連接是在主函數中開啟的。但是,在定義需要存取資料庫的函數時,您可能會遇到引用開啟的資料庫連線的問題。
要解決此問題,有幾種方法可用:
選項1:全域資料庫連接
解決方案是將資料庫連接聲明為全域變量,使其在整個程式中(包括在函數內)可存取。此方法很簡單,但對於具有多個資料庫連接的複雜應用程式來說可能並不理想。
選項 2:函數參數
另一個選項是將資料庫連接作為函數的參數。這種方法提供了對使用哪個資料庫連接的明確控制,並允許建立可以使用不同資料庫的函數。
選項 3:函數方法
或者,您可以將該函數定義為保存資料庫連接的結構中的方法。這種技術提供了一種更物件導向的方法,並確保函數始終可以存取正確的資料庫連接。
範例程式碼:
全域資料庫連線:
<code class="go">var db *sql.DB func main() { db = sql.Open("sqlite3", "./house.db") room := Room{} err := addRoom(room) if err != nil { // Error handling } } func addRoom(room Room) error { stmt, err := db.Prepare("INSERT INTO Rooms (Name, Size, WindowCount, WallDecorationType, Floor) VALUES(?, ?, ?, ?, ?)") if err != nil { return err } _, err = stmt.Exec(room.Name, room.Size, room.WindowCount, room.WallDecorationType, room.Floor) return err }</code>
函數參數:
<code class="go">func addRow(db *sql.DB, row Room) error { stmt, err := db.Prepare("INSERT INTO Rooms (Name, Size, WindowCount, WallDecorationType, Floor) VALUES(?, ?, ?, ?, ?)") if err != nil { return err } _, err = stmt.Exec(row.Name, row.Size, row.WindowCount, row.WallDecorationType, row.Floor) return err }</code>
函數參數:
<code class="go">type dbConn struct { db *sql.DB } func (conn dbConn) addRow(row Room) error { stmt, err := conn.db.Prepare("INSERT INTO Rooms (Name, Size, WindowCount, WallDecorationType, Floor) VALUES(?, ?, ?, ?, ?)") if err != nil { return err } _, err = stmt.Exec(row.Name, row.Size, row.WindowCount, row.WallDecorationType, row.Floor) return err }</code>
以上是如何從 Golang 中的函數存取開啟的資料庫連線?的詳細內容。更多資訊請關注PHP中文網其他相關文章!