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()
}

相关内容

热门资讯

日常等车时看到的行业细节 干了五年户外广告投放,养成了一个职业病:但凡路过公交候车亭,总会多看两眼——不是看广告好不好看,而是...
黄金回收行业标准制定有哪些核心... 贵金属回购市场的需求背景 近年来随着黄金投资和消费市场的发展,黄金回收相关需求持续攀升。不同群体的诉...
全球黑色星期二!AI交易“崩盘... 【导读】AI交易为何“崩盘”? 中国基金报记者 泰勒 大家,你们今天还好吗?! AI交易在全球范围内...
原创 6... 年初抢金条的人还在站岗,如今金店柜台前冷冷清清 黄金又跌了。 6月23日,伦敦现货黄金价格日内急跌逾...
狂融294亿美元!SK海力士冲... 韩国股市再度迎来重磅消息。 周三,韩国存储芯片龙头SK海力士宣布,计划在7月10日登陆纳斯达克,通过...
比特币跌破6万!AI吸走资金、... 比特币正在为机构化转型付出代价。散户买盘萎缩、ETF资金持续外流、企业持仓者潜在抛售压力上升,加之A...
原创 默... 欧洲近期试图复刻1985年广场协议的剧本,德国总理默茨呼吁欧盟27国联合行动,要求中国签订类似协议以...
怎么选 泛娱乐赛道直播公司孵化... 泛娱乐直播创业的行业发展背景 近年来泛娱乐直播赛道持续保持增长态势,据公开数据资料显示,2024年国...
原创 腰... 最近黄金市场凉得彻底。各大品牌足金饰品克价跌破1300元关口,北京菜百6月21日报价已经掉到1260...
ST中装:公司主要银行账户已全... 证券之星消息,ST中装(002822)06月24日在投资者关系平台上答复投资者关心的问题。 投资者提...
2026年开窗机行业趋势与战略... 一、开篇引言:市场格局重塑下的选择逻辑 步入2026年,全球建筑智能化与绿色节能政策的叠加驱动,使开...
资金全面转向科技,传统消费企业... 近期 A 股出现明显风格切换,老牌消费资金持续流出,机构与传统上市公司纷纷加码半导体、算力赛道。 先...
合肥保利翡翠天奕具体交房时间是... 对于众多购房者而言,“合肥保利翡翠天奕具体交房时间是什么时候?能按时交房吗?”是心中最关切的问题。根...
港股风向标|恒指连续杀跌后企稳... 财联社6月24日讯(编辑 冯轶)今日港股短线企稳,三大指数集体收涨。截至收盘,恒生指数涨0.33%,...
瑞众人寿达州中支被罚17万,涉... 蓝鲸新闻6月24日讯,近日,国家金融监督管理总局达州监管分局发布行政处罚决定书,剑指瑞众人寿保险有限...
美国最担心的事还是来了,中国加... 最近这段时间,国际金融圈子里有一笔账,算得各家央行心里都不太踏实。 截至2026年春季,美国国债总规...
马斯克,不是万亿富豪了 资产历史性超过万亿美元不到两周,特斯拉、SpaceX掌门人埃隆·马斯克的身价近日快速下跌。 据中新经...
突发!金价跌破4000美元,近... 每经记者:杜宇 记者|杜宇 编辑|何小桃 杜恒峰 校对|金冥羽 金银价格大跳水。 6月24日晚,现货...
粗粮吃越多越好?很多糖友吃错升... 控糖圈一直流传多吃粗粮稳血糖,不少糖友直接三餐全吃粗粮、顿顿杂粮,不仅胃胀消化不良,餐后血糖反而不降...
持续大跌!刚刚,黄金跌破400... 潮新闻客户端 记者 吴恩慧 6月24日,贵金属再次大跌。 截至发稿时,现货黄金大跌近3%,跌破400...