如何使用Golang开发基础问答系统

来源:AI大模型作者:广州程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何使用Golang开发基础问答系统》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用Golang开发基础问答系统》有用,将其分享出去将是对创作者最好的鼓励。

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

如何使用Golang开发基础问答系统

项目基础准备

首先需要初始化项目并安装依赖,这里选择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

数据库表设计

问答系统需要两张核心表,分别是问题表和回答表,表结构如下:

表名字段名类型说明
questionsidbigint问题ID,主键自增
titlevarchar(200)问题标题
contenttext问题内容
author_idbigint提问者ID
created_atdatetime创建时间
answersidbigint回答ID,主键自增
question_idbigint关联的问题ID
contenttext回答内容
author_idbigint回答者ID
created_atdatetime创建时间

核心代码实现

初始化数据库连接与路由

首先编写数据库连接和路由初始化的代码,建立基础的服务框架:

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下的所有回答

以上代码实现了基础问答系统的核心功能,开发者可以根据需要扩展用户模块、内容审核、点赞收藏等附加功能,完善整个系统的业务逻辑。

Golang问答系统问题提交回答管理gin框架修改时间:2026-07-08 15:18:32

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。