go连接数据库提供web服务
Table of Contents
在 Go 语言中连接数据库和提供 Web 服务可以通过标准库和第三方库实现
一、连接数据库(以 MySQL 为例)
1. 安装数据库驱动
go get -u github.com/go-sql-driver/mysql
2. 连接数据库代码
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 连接字符串格式:用户名:密码@协议(地址:端口)/数据库名
dsn := "user:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True"
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
defer db.Close()
// 检查连接是否成功
err = db.Ping()
if err != nil {
panic(err)
}
fmt.Println("数据库连接成功!")
// 示例:查询数据
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
panic(err)
}
fmt.Printf("ID: %d, Name: %s\n", id, name)
}
}
二、提供 Web 服务
1. 使用标准库 net/http
package main
import (
"fmt"
"net/http"
)
func main() {
// 注册路由和处理函数
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "欢迎访问首页!")
})
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
// 启动服务器,监听8080端口
fmt.Println("服务器启动,监听地址:http://localhost:8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic(err)
}
}
三、结合数据库和 Web 服务
1. 完整示例:查询数据并返回 JSON
package main
import (
"database/sql"
"encoding/json"
"net/http"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
// 连接数据库
dsn := "user:password@tcp(127.0.0.1:3306)/testdb"
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
defer db.Close()
// 注册HTTP路由
http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
// 查询数据库
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer rows.Close()
// 解析结果
var users []User
for rows.Next() {
var u User
if err := rows.Scan(&u.ID, &u.Name); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
users = append(users, u)
}
// 返回JSON响应
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(users)
})
// 启动服务器
http.ListenAndServe(":8080", nil)
}
四、关键注意事项
-
连接池配置
通过db.SetMaxOpenConns(100)
等方法优化数据库连接池。 -
防止 SQL 注入
使用参数化查询,避免直接拼接 SQL:result, err := db.Exec("INSERT INTO users (name) VALUES (?)", "Alice")
-
错误处理
始终检查并处理数据库操作和 HTTP 请求中的错误。 -
性能优化
对于复杂路由,可以使用高性能路由库如gorilla/mux
或gin
。
明天再详细了解一下 Android 的 Window 和 WindowManager