亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 golang 獲取 mysql 連接時出錯

使用 golang 獲取 mysql 連接時出錯

Go
翻閱古今 2022-01-17 19:52:14
我是 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實例來避免它。


查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 235 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號