我是 golang 和 MySQL 的新手,我正在使用開發框創建一個簡單的網頁,使用 golang(來自 2 個文件的代碼在下面)來獲取輸入,將輸入存儲到數據庫中并在網頁上顯示輸入。目前在本地使用 MySQL 作為我的數據庫,我的用戶名是 root,密碼是 abc,我的數據庫也被命名為 abc。在頂部我已經導入: import ( _"github.com/go-sql-driver/mysql" "database/sql" )當我提供我的網頁時,我調用我的 connectDB 函數: func init(){ INDEX_HTML , _ = ioutil.ReadFile("./templates/index.html") connectDb() } func connectDb(){ //socket : var/run/mysqld/mysqld.sock /* connection string examples : db, err := sql.Open("mysql", "user:password@/dbname") user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true TCP using default port (3306) on localhost: user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped Use the default protocol (tcp) and host (localhost:3306): user:password@/dbname No Database preselected: user:password@/*/ db, err := sql.Open("mysql", "root:abc@/abc") log.Println("DB: ", db) checkErr(err) // Open doesn't open a connection. Validate DSN data: checkErr(err) }我的理解和根據https://github.com/go-sql-driver/mysql SQL.open 返回一個 * sql.DB,并且當程序遇到上面的以下代碼時:/* At the top of my code i have var db = *sql.DB */log.Println("DB: ", db)我在命令提示符中得到以下內容,上面的代碼注釋中記錄了所有類型的示例連接字符串:DB: &{0x99c410 root:abc@/abc 0 {0 0} [] [] 0 0xc820072180 false map[] map[] 0 0 0 < nil >}我的 MySQL 數據庫使用給定的用戶名和密碼通過命令行在本地運行良好,我可以通過手動插入以下查詢獲得一些項目。mysql>mysql> select * from ListItems -> ;+-------+| items |+-------+| item1 || item2 |+-------+我試圖了解消息是什么以及如何連接到 mysql 數據庫以運行查詢并插入數據庫。也許我的連接字符串有問題?嘗試插入數據庫時的錯誤示例:016/06/20 02:22:36 http: panic serving 10.1.0.5:41861: runtime error: invalid memory address or nil pointer dereferencegoroutine 7 [running]:
1 回答

躍然一笑
TA貢獻1826條經驗 獲得超6個贊
db問題是您聲明的全局變量var db *sql.DB從未被賦值。所以它保持它的默認值,即nil. 并且試圖取消引用一個 nil 指針會給你錯誤。
您可能認為在init函數中為該變量分配了新創建的DB實例。但是:=會創建一個新的局部變量來保存新DB實例。全局db變量保持不變。見例子。
所以改為這樣做,
var err error
db, err = sql.Open("mysql", "root:abc@/abc")
同樣根據我使用全局變量的經驗,當您可以避免它導致難以調試的錯誤時。(就像這個。)我認為你可以通過connectDb返回一個DB實例來避免它。
- 1 回答
- 0 關注
- 235 瀏覽
添加回答
舉報
0/150
提交
取消