Go语言初试——0起点 尝试用go创建项目目录
创始人
2025-06-01 15:37:18
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()
}

相关内容

热门资讯

日本央行加息25个基点 利率升... 中新社 东京12月19日电(记者 朱晨曦)日本央行19日在货币政策会议上通过决议,决定加息25个基点...
什么是处理虚拟货币或货币价值的... 处理虚拟货币或货币价值的联网无线电设备EN18031-3标准是一套针对特定无线电设备的技术规范,主要...
中东电商变局:穿透那层过时的“... 扬帆出海 作者丨以南 12月16日,据中东媒体Saudi Gazette(《沙特公报》)报道,沙特本...
黄金税改+海南封关=行业迎来合... 11月1日,黄金税收新政实施 12月18日,海南自贸港全岛封关运作 “规范”“转型”“海南机遇” 成...
六大私募展望2026:股市仍有... 【导读】六大私募把脉2026:股市仍有较好机会,成长与价值风格趋于均衡 【编者按】2025年接近尾声...
昆仑万维:关于董事辞职及补选董... 来源:新浪财经-鹰眼工作室 昆仑万维科技股份有限公司关于董事辞职及补选董事的公告 昆仑万维科技股份有...
原创 “... 曾经的“金饭碗”银行,如今正经历一场无声的“离职潮”。仅2025年上半年,国有六大行员工就净减少了2...
原创 为... 世界上任何一个国家都不敢拿出一个省来搞自贸区。因为中国有具备的几个特点是这个世界上非常独特的。可以化...
原创 中... 12月16日,中国商务部发布公告,决定对原产于欧盟的进口猪肉加征反倾销税,税率从4.9%到19.8%...
原创 炸... 12月19日,德国总理默茨在围绕冻结俄罗斯资产问题的欧盟内部讨论中,立场日趋孤立,与其他主要成员国及...
“海南封关120多万卡宴只要6... 编辑 | 高语阳 近日,话题“海南封关120多万卡宴只要60万”冲上热搜,引发公众热议。 媒体报道...
紫金国际运营总部:三亚落成,现... 【12月20日,紫金国际运营总部正式落成暨全球招商推介活动在三亚举办】该活动由紫金国控主办,主题为“...
传音控股港股IPO:非洲大本营... 作者|张宇 编辑|杨博丞 图源 |IC photo 近日,“非洲手机之王”传音控股正式向港交所递交招...
鸣鸣很忙的港股招股书或存合规风... 且读,且思~ 本月,量贩零食企业湖南鸣鸣很忙商业连锁股份有限公司(以下简称鸣鸣很忙)上市备案已获通过...
原创 希... 前不久,在哥伦比亚大学的演讲厅,发生了一幕美国政坛罕见的奇观——曾经言辞激烈、互相对立的希拉里和蓬佩...
900亿浙江国企换届,80后总... 提到浙江金华,肯定是绕不开义乌,提到义乌上市企业,必然说说小商品城。这家在浙江省内市值也高居前列的企...
原创 A... 当前大盘正站在一个“进可攻、退可守”的微妙十字路口——说它弱吧,它稳稳盘踞在3900点附近,远高于年...
原创 郑... 当下,郑州的二手房市场,正经历一场悄然的变局。最近的数据显示,其二手房的挂牌量,从125807套变成...
深度|DeepMind CEO... 图片来源:AXIOS Z Highlight AGI可能是人类历史上最具变革性的时刻之一,而它已...
寒武纪获评钛媒体2025EDG... 钛媒体App 12月21日消息,钛媒体2025 EDGE AWARDS全球创新评选榜单重磅发布。寒武...