使用Golang开发基础问答系统,核心是实现问题提交、回答管理、内容查询三个核心功能模块,整体可以采用gin框架作为Web层,搭配MySQL存储业务数据,通过分层架构保证代码的可维护性。

项目基础准备
首先需要初始化项目并安装依赖,这里选择gin作为Web框架,gorm作为ORM工具操作数据库,具体步骤如下:
- 初始化Go模块:执行
go mod init qa_system - 安装gin框架:执行
go get -u github.com/gin-gonic/gin - 安装gorm及MySQL驱动:执行
go get -u gorm.io/gorm gorm.io/driver/mysql
数据库表设计
问答系统需要两张核心表,分别是问题表和回答表,表结构如下:
| 表名 | 字段名 | 类型 | 说明 |
|---|---|---|---|
| questions | id | bigint | 问题ID,主键自增 |
| title | varchar(200) | 问题标题 | |
| content | text | 问题内容 | |
| author_id | bigint | 提问者ID | |
| created_at | datetime | 创建时间 | |
| answers | id | bigint | 回答ID,主键自增 |
| question_id | bigint | 关联的问题ID | |
| content | text | 回答内容 | |
| author_id | bigint | 回答者ID | |
| created_at | datetime | 创建时间 |
核心代码实现
初始化数据库连接与路由
首先编写数据库连接和路由初始化的代码,建立基础的服务框架:
package main
import (
"fmt"
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"github.com/gin-gonic/gin"
)
// 定义问题结构体,对应questions表
type Question struct {
ID uint `gorm:"primaryKey"`
Title string `gorm:"type:varchar(200)"`
Content string `gorm:"type:text"`
AuthorID uint
CreatedAt string
}
// 定义回答结构体,对应answers表
type Answer struct {
ID uint `gorm:"primaryKey"`
QuestionID uint
Content string `gorm:"type:text"`
AuthorID uint
CreatedAt string
}
var db *gorm.DB
func main() {
// 连接MySQL数据库,替换为实际的数据库账号密码
dsn := "root:password@tcp(127.0.0.1:3306)/qa_db?charset=utf8mb4&parseTime=True&loc=Local"
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("数据库连接失败: %v", err)
}
// 自动迁移表结构
db.AutoMigrate(&Question{}, &Answer{})
// 初始化gin路由
r := gin.Default()
// 问题相关路由
r.POST("/question", createQuestion)
r.GET("/question/:id", getQuestion)
// 回答相关路由
r.POST("/answer", createAnswer)
r.GET("/question/:id/answers", getAnswersByQuestion)
// 启动服务,监听8080端口
fmt.Println("服务启动在 8080 端口")
r.Run(":8080")
}
问题提交功能实现
问题提交接口需要接收前端传递的标题、内容、提问者ID,将数据存入数据库:
// 创建问题的请求参数结构体
type CreateQuestionReq struct {
Title string `json:"title" binding:"required"`
Content string `json:"content" binding:"required"`
AuthorID uint `json:"author_id" binding:"required"`
}
// 创建问题接口处理函数
func createQuestion(c *gin.Context) {
var req CreateQuestionReq
// 绑定请求参数并校验
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "参数错误"})
return
}
// 构造问题数据
question := Question{
Title: req.Title,
Content: req.Content,
AuthorID: req.AuthorID,
}
// 插入数据库
if err := db.Create(&question).Error; err != nil {
c.JSON(500, gin.H{"code": 500, "msg": "问题提交失败"})
return
}
c.JSON(200, gin.H{"code": 200, "msg": "问题提交成功", "data": question})
}
// 获取问题详情接口处理函数
func getQuestion(c *gin.Context) {
questionID := c.Param("id")
var question Question
// 查询问题数据
if err := db.First(&question, questionID).Error; err != nil {
c.JSON(404, gin.H{"code": 404, "msg": "问题不存在"})
return
}
c.JSON(200, gin.H{"code": 200, "msg": "查询成功", "data": question})
}
回答管理功能实现
回答管理包含提交回答和查询某个问题下的所有回答两个功能:
// 创建回答的请求参数结构体
type CreateAnswerReq struct {
QuestionID uint `json:"question_id" binding:"required"`
Content string `json:"content" binding:"required"`
AuthorID uint `json:"author_id" binding:"required"`
}
// 提交回答接口处理函数
func createAnswer(c *gin.Context) {
var req CreateAnswerReq
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "参数错误"})
return
}
// 先校验问题是否存在
var question Question
if err := db.First(&question, req.QuestionID).Error; err != nil {
c.JSON(404, gin.H{"code": 404, "msg": "关联的问题不存在"})
return
}
// 构造回答数据
answer := Answer{
QuestionID: req.QuestionID,
Content: req.Content,
AuthorID: req.AuthorID,
}
// 插入数据库
if err := db.Create(&answer).Error; err != nil {
c.JSON(500, gin.H{"code": 500, "msg": "回答提交失败"})
return
}
c.JSON(200, gin.H{"code": 200, "msg": "回答提交成功", "data": answer})
}
// 查询某个问题下的所有回答
func getAnswersByQuestion(c *gin.Context) {
questionID := c.Param("id")
var answers []Answer
// 查询对应问题的所有回答
if err := db.Where("question_id = ?", questionID).Find(&answers).Error; err != nil {
c.JSON(500, gin.H{"code": 500, "msg": "查询回答失败"})
return
}
c.JSON(200, gin.H{"code": 200, "msg": "查询成功", "data": answers})
}
功能测试
启动服务后,可以通过接口测试工具验证功能是否正常:
- 提交问题:发送POST请求到
http://127.0.0.1:8080/question,携带正确的JSON参数,可返回创建成功的问题数据 - 获取问题详情:发送GET请求到
http://127.0.0.1:8080/question/1,可返回ID为1的问题详情 - 提交回答:发送POST请求到
http://127.0.0.1:8080/answer,携带对应问题的ID和回答内容,可返回创建成功的回答数据 - 查询回答列表:发送GET请求到
http://127.0.0.1:8080/question/1/answers,可返回问题1下的所有回答
以上代码实现了基础问答系统的核心功能,开发者可以根据需要扩展用户模块、内容审核、点赞收藏等附加功能,完善整个系统的业务逻辑。