Go语言初试——0起点 尝试用go创建项目目录
创始人
2025-06-01 16:49:19
0

Go语言初试——0起点

做了一段时时间前端,想学习一点后端内容,决定从go语言开始。

首先配置开发go的sdk,这里我参考的是ReCclay大佬的文章Go学习之 GoLand-IDE安装并实现HelloWorld(附学生免费注册流程)

在这里插入图片描述
这是现在项目的要配置的目录结构,我当然可以使用手动建文件夹的方式来创建目录,不过既然学习了go,那就尝试一下用go来自动生成项目目录。

首先根据目录结构写接送文件。

{"text": "src","childrn": [{"text": "api"},{"text": "cmd"},{"text": "conf"},{"text": "dao"},{"text": "global"},{"text": "log"},{"text": "middleware"},{"text": "model"},{"text": "router"},{"text": "service","children": [{"text": "dto"}]},{"text": "utils"}]
}

这是我目前项目的目录结构
在这里插入图片描述
接下通过在test.go的文件编写代码生成目录。
这是test.go最开始的样子,每一个go文件被当做一个package,main为文件入口。

package mainimport 	"fmt"func main() {fmt.Println("hello,world")
}

运行一下
在这里插入图片描述

接下来写函数,处理逻辑

先声明几个变量:

var stRootDir string 
var stSeparator string
var iJsonData map[string]anyvar stJsonFileName = "dir.json"

在写一个加载json文件的方法

func loadJson() {stSeparator = string(filepath.Separator)stWorkDir, _ := os.Getwd()stRootDir = stWorkDir[:strings.LastIndex(stWorkDir, stSeparator)]fmt.Println(stSeparator)fmt.Println(stWorkDir)fmt.Println(stRootDir)
}

func TestGenDir() {loadJson()
}
func main() {TestGenDir()
}

运行结果
在这里插入图片描述

对于错误

// os.ReadFile // 通过这个方法来读取文件
func loadJson() {stSeparator = string(filepath.Separator)stWorkDir, _ := os.Getwd()stRootDir = stWorkDir[:strings.LastIndex(stWorkDir, stSeparator)]gnJsonBytes, _ := os.ReadFile(stWorkDir + stSeparator + stJsonFileName)err := json.Unmarshal(gnJsonBytes, &iJsonData) // 用来处理错误if err != nil {panic("load JSON file Erro")}
}

接下来处理json数据

先写一个函数parseMap,定义两个参数mapData和stParentDir。

可以先对数据做循环,然后判断是string,还是[]any,分别处理两种情况,

func parseMap(mapData map[string]any, stParentDir string) {// 这里可以采用循环来for k, v := range mapData {switch v.(type) {case string: {// 一种情况}case []any:{// 一种情况}}}}

首先是string

如果是字符串,则表示需要创建一个文件夹

				path, _ := v.(string)if path == "" {continue}// 如果父目录不为空,则将当前目录加入到父目录中if stParentDir != "" {path = stParentDir + stSeparator + pathif k == "text" {stParentDir = path}} else {stParentDir = path}createDir(path)
// 这是createDir()
func createDir(path string) {if path == "" {return}os.MkdirAll(stRootDir+stSeparator+path, fs.ModePerm)}

如果是[]any

如果值是[]any类型,则使用值和stParentDir作为参数调用parseArray函数。

			case []any:{parseArray(v.([]any), stParentDir)}

parseArray
接受一个any类型的切片和一个字符串stParentDir作为参数。该函数遍历切片,对于每个元素,它使用

mapV,_:= v。(map [string] any)

语句将其转换为字符串到any类型的映射。然后,它使用映射和stParentDir作为参数调用parseMap函数。

func parseArray(giJsonData []any, stParentDir string) {for _, v := range giJsonData {mapV, _ := v.(map[string]any)parseMap(mapV, stParentDir)}
}

OK,功能就算实现了

来看看全部。

package mainimport ("encoding/json""io/fs""os""path/filepath""strings"
)var stRootDir string
var stSeparator string
var iJsonData map[string]anyvar stJsonFileName = "dir.json"func loadJson() {stSeparator = string(filepath.Separator)stWorkDir, _ := os.Getwd()stRootDir = stWorkDir[:strings.LastIndex(stWorkDir, stSeparator)]gnJsonBytes, _ := os.ReadFile(stWorkDir + stSeparator + stJsonFileName)err := json.Unmarshal(gnJsonBytes, &iJsonData)if err != nil {panic("load JSON file Erro")}}func parseMap(mapData map[string]any, stParentDir string) {for k, v := range mapData {switch v.(type) {case string:{path, _ := v.(string)if path == "" {continue}// 如果父目录不为空,则将当前目录加入到父目录中if stParentDir != "" {path = stParentDir + stSeparator + pathif k == "text" {stParentDir = path}} else {stParentDir = path}createDir(path)}case []any:{parseArray(v.([]any), stParentDir)}}}}
func parseArray(giJsonData []any, stParentDir string) {for _, v := range giJsonData {mapV, _ := v.(map[string]any)parseMap(mapV, stParentDir)}
}func createDir(path string) {if path == "" {return}os.MkdirAll(stRootDir+stSeparator+path, fs.ModePerm)}func TestGenDir() {loadJson()parseMap(iJsonData, "")
}
func main() {TestGenDir()
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...