(实践)GO语言工程实践课后作业:实现思路、代码以及路径记录| 青训营

52 阅读3分钟

课后实践功能要求

1.支持发布帖子 2.本地ID生成需要保证不重复、唯一性 3.Append文件,更新索引,注意Map的并发安全问题 使用Gin框架实现了支持发布帖子的功能,确保本地ID生成的唯一性,并使用Append文件方式更新索引,同时解决了Map的并发安全问题。

  • 示例
package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"sync"
	"time"

	"github.com/gin-gonic/gin"
)

type Post struct {
	ID      string `json:"id"`
	Content string `json:"content"`
}

var (
	indexMap = make(map[string]string)
	mutex    sync.Mutex
)

func main() {
	r := gin.Default()

	// 发布帖子的API接口
	r.POST("/posts", createPost)

	// 运行服务
	r.Run(":8080")
}

// 创建帖子
func createPost(c *gin.Context) {
	content := c.PostForm("content")

	// 生成唯一的ID
	postID := generateUniqueID()

	// 保存帖子内容到文件
	err := savePostToFile(postID, content)
	if err != nil {
		c.JSON(500, gin.H{
			"error": "Failed to save post",
		})
		return
	}

	// 更新索引
	updateIndex(postID)

	c.JSON(200, gin.H{
		"message": "Post created successfully",
		"postID":  postID,
	})
}

// 生成唯一的ID(使用时间戳+随机数)
func generateUniqueID() string {
	timeStamp := time.Now().UnixNano()
	id := fmt.Sprintf("%d", timeStamp)
	return id
}

// 将帖子保存到文件
func savePostToFile(id, content string) error {
	fileName := id + ".txt"
	file, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Println("Error saving post:", err)
		return err
	}
	defer file.Close()

	_, err = file.WriteString(content)
	if err != nil {
		fmt.Println("Error saving post:", err)
		return err
	}

	return nil
}

// 更新索引
func updateIndex(id string) {
	mutex.Lock()
	defer mutex.Unlock()

	indexMap[id] = id + ".txt"
}

引入Gin框架

  1. 打开终端或命令行工具,在你的项目根目录下执行以下命令初始化一个新的Go模块:
go mod init <module-name>

其中,<module-name>是你的项目名,例如github.com/your-username/your-project

  1. 在项目根目录下创建一个main.go文件,作为你的程序入口文件。
  2. main.go文件中引入Gin框架:
package main

import "github.com/gin-gonic/gin"
  1. 在终端或命令行工具中执行以下命令来下载并安装Gin框架:
go get -u github.com/gin-gonic/gin

这将会在你的项目中下载Gin框架的源代码并安装到你的Go语言环境中。

然后这里我们定义了一个Post结构体来存储帖子的ID和内容,同时将其作为JSON格式进行传输。

首先,在createPost函数中,我们从请求中获取帖子的内容,并生成唯一的ID。然后,调用savePostToFile函数将帖子内容以追加方式写入文件中。在该函数中,我们使用os.OpenFile函数指定以追加方式打开文件,并将帖子内容写入。如果发生错误,我们返回错误信息给客户端。

接下来,在updateIndex函数中,我们使用互斥锁mutex确保对indexMap的并发访问安全。我们将帖子的ID作为键,对应的文件名作为值,保存到indexMap中。

最后,我们使用Gin框架建立了一个API接口/posts,当客户端发送POST请求时,会调用createPost函数来发布帖子。我们通过JSON格式返回发布结果给客户端。

个人感悟

完成上述功能,需要考虑以下几个方面:

首先对于生成唯一ID:为了保证ID的不重复性和唯一性,可以使用时间戳+随机数的方式生成唯一ID。 对于发布帖子,使用一个HTTP POST请求来接收用户发布的帖子内容,可以使用Gin框架来处理路由和请求。在处理函数中,获取用户提交的帖子内容,并生成一个唯一的ID。然后,将帖子内容写入文件系统中的一个单独文件,以ID为文件名,或者使用数据库进行存储。 更新索引可以使用一个并发安全的数据结构(如sync.Map)来存储帖子的ID和对应的文件名。每当有新的帖子发布时,将其ID与文件名存储到该数据结构中。这样,在需要查询、删除或其他操作时,可以从索引中快速找到对应的文件。 最后关于确保并发安全,可以使用互斥锁(sync.Mutex)或读写锁(sync.RWMutex)来控制对共享数据的访问。在更新索引的操作中,先锁定互斥锁,更新完毕后再解锁。

希望我的思考对大家有所帮助!