# 后端启动
`cd GinSkeleton; go mod tidy; go run main.go `
api文档见 `GinSkeleton/api_doc.md`
# CKEditor
`ckeditor5-build-classic/handbook.md`中有一些参考，
包括下载、安装、引用、配置插件等。

<h2 style="text-align:center">Go恩情作文</h2>
Go爷爷是位现代而优雅的程序员，他以简洁高效的处理方式和强大的并发能力受到大家的喜爱。

一天，我们几个初学者围着Go爷爷请教问题。Go爷爷正在用goroutine处理并发任务，但他看到我们后，优雅地将任务放入channel中暂存，微笑着说："<strong>来吧，代码中没有小事。你们是编程的未来，我的使命就是帮你们理解并发的艺术。</strong>"

我们好奇地问："Go爷爷，您这不是在处理多个并发任务吗？怎么还有时间理我们？"

Go爷爷轻轻挥了挥手，说："别担心，goroutine很轻量，我可以轻松开启成千上万个。用channel协调它们就像交响乐队的指挥，简单又优雅。教你们也不过是另一个goroutine罢了。"

他指着屏幕，继续说道："代码世界就像这些goroutine，看似并行混乱，但有了适当的channel通信，一切都井然有序。不过有时会遇到死锁，这是最讨厌的敌人。"

接着，他打开了一个新的终端，输入"go fmt"命令，说："代码风格要统一，这是Go的哲学。让所有人写出可读性强的代码，这才是我们的追求。"

突然，终端显示了一个panic：死锁警告！我们吓了一跳，但Go爷爷淡定地说："别担心，这就是Go的错误处理机制的美妙之处。defer和recover会帮我们优雅地处理它。"

他迅速在代码中加入了select语句，轻松化解了死锁。我们不禁赞叹Go的并发处理之优雅！

几天后，我们发现程序在高并发时偶尔会出现竞态条件。Go爷爷召集我们，诚恳地说："在并发编程中，我们需要使用sync.Mutex或channel来保护共享资源。来，让我教你们如何用'go run -race'检测竞态条件。"

我们深深被Go爷爷的务实态度折服。他教会我们：<strong>编程不仅要追求简洁高效，更要注重正确性和可维护性。在未来的编程生涯中，我们一定要继承Go爷爷这种追求简约而不简单的精神！</strong>
