go 语言快速开发


​ 笔记内容按照 中文文案排版指北 进行排版,以保证内容的可读性。
自动化排版工具 ,clone 下来之后,点击 index.html 就可以使用了

go 语言快速开发

​ 最近在学习 go 语言的第三方库 (这里有很多库,可以选择一些进行学习),发现项目结构都差不多,而且库学习刚开始基本上都是 CV 代码,改一改。。浪费大部分时间在 ide 上,感觉没必要,就索性写了一个脚本来加快学习速度。

项目结构

​ 参考 Go 社区推荐的结构化目录项目 (https://github.com/golang-standards/project-layout),由于这里只是简单的学习第三方库,故使用以下目录结构即可

├── cmd
├── go.mod
├── internal
│   └── fmtStudy
│       └── fmtStudy.go
└── main.go

cmd 目录用于存放生成的二进制文件
internal 目录用于存放库代码 (这里以 fmt 库为例)

如果还要学习 flag 库,结构应该如下:

├── cmd
├── go.mod
├── internal
│   ├── flagStudy
│   │   └── flagStudy.go
│   └── fmtStudy
│       └── fmtStudy.go
└── main.go

对于库文件以 fmtStudy.go 为例,大致结构如下

packge fmtStudy
// Print 系列
func FmtTest01() {
	fmt.Print("111")
	name := "小明"
	fmt.Printf("我是:%s\n", name)
	fmt.Println("在终端打印单独一行显示")
}

// Fprint 系列
// Fprint 系列函数会将内容输出到一个 io.Writer 接口类型的变量 w 中,我们通常用这个函数往文件中写入内容。
func FmtTest02() {
	fmt.Fprintln(os.Stdout, "向标准输出写入内容")
	fileObj, err := os.OpenFile("./internal/fmtStudy/1.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("打开文件出错,err:", err)
		return
	}
	content := "666"
	fmt.Fprintf(fileObj, "往文件中写如信息:%s", content)
}

// Sprint 系列
// Sprint 系列函数会把传入的数据生成并返回一个字符串。
func FmtTest03() {
	s1 := fmt.Sprint("123")
	name := "小明"
	age := 18
	s2 := fmt.Sprintf("name:%s,age:%d", name, age)
	s3 := fmt.Sprintln("666")
	fmt.Println(s1, s2, s3)
}

...

需求分析

对于 fmt 库

1.需要创建./internal/fmtStudy 目录
2.创建 fmtStudy.go 文件
3.在 fmtStudy.go 文件中有如下内容
packge fmtStudy

//
func FmtTest01() {
	
}

// 
func FmtTest02() {
	
}

// 
func FmtTest03() {
	
}
...

对于 main.go,需要以下内容

//模块 fmt
func test() {
	fmtStudy.FmtTest01()
	fmtStudy.FmtTest02()
	fmtStudy.FmtTest03()
	...
}

这里我使用的是 golang,import 会自动添加进来,如果是其他编译器,可以手动添加

import “{ProjectName}/internal/fmtStudy”
分析完之后,直接写脚本,选择的是 shell 脚本

工具一:自动框架脚本

脚本名 ./BatchGenerateFunc.sh(位于工程根目录下,即与 main.go 在同一目录下)

#!/bin/bash
#判断参数是否为 0 个
if [ $# == 0 ]; then
  echo "please use ./BatchGenerateFunc.sh [create|delete|main] [args...]"
else
  #记录下所有参数
  args=("$@")
  len=${#args[@]}
  if [ $1 == "create" ]; then
    if [ $# == 1 ]; then
      echo "please use ./BatchGenerateFunc.sh create [要创建的模块名 ]"
    else
      echo "输入的功能为:${args[0]},参数个数为$(($len - 1))"
      for ((i = 1; i < ${len}; i++)); do
        moduleName=${args[i]}
        moduleName=${moduleName,,}
        echo "------------create ${moduleName} module--------------"
        dir="./internal/${moduleName}Study"
        if [ -d "$dir" ]; then
          echo "$dir Directory already exists"
          continue
        else
          mkdir -p "$dir"
          echo "$dir Directory created"
        fi
        echo "package ${moduleName}Study" >${dir}/${moduleName}Study.go
        echo >>${dir}/${moduleName}Study.go
        for j in {1..10}; do
          echo "//" >>${dir}/${moduleName}Study.go
          echo "func ${moduleName^}Test${j}(){" >>${dir}/${moduleName}Study.go
          echo >>${dir}/${moduleName}Study.go
          echo "}" >>${dir}/${moduleName}Study.go
          echo >>${dir}/${moduleName}Study.go
          echo >>${dir}/${moduleName}Study.go
        done
        echo "模块${moduleName} 创建成功!"
      done
    fi
  elif [ $1 == "delete" ]; then
    if [ $# == 1 ]; then
      echo "please use ./BatchGenerateFunc.sh delete [要删除的模块名 ]"
    else
      echo "输入的功能为:${args[0]},参数个数为$(($len - 1))"
      for ((i = 1; i < ${#args[@]}; i++)); do
        moduleName=${args[i]}
        moduleName=${moduleName,,}
        rm -r ./internal/${moduleName}Study
        if [ $? == 0 ]; then
          echo "模块${moduleName} 删除成功!"
        else
          echo "模块${moduleName} 删除失败!"
        fi
      done
    fi
  elif [ $1 == "main" ]; then
    echo "请输入模块名:"
    read -r moduleName
    moduleName=${moduleName,,}
    echo "请输入编号:(如 3-->test3)"
    read -r num
    echo "请输入子函数个数:"
    read -r funcNum
    echo "-----------------以下是生成的内容------------------"
    printf "//模块%s\n" ${moduleName}
    printf "func test%s() {\n" ${num}
    for ((i = 1; i <= ${funcNum}; i++)); do
      printf "    %sStudy.%sTest%d()\n" ${moduleName} ${moduleName^} ${i}
    done
    printf "}\n"
  else
    echo "error:Wrong parameter!"
    echo "please use ./BatchGenerateFunc.sh create|delete|main [args...]"
  fi
fi

测试

1.添加模块

用法:./BatchGenerateFunc.sh create [要创建的模块名 ]

(base) 是指 anachore 的 base 环境,不用管,libraryStudy 是工程名,也不用管,后面的为命令
(base) ➜  libraryStudy tree
.
├── BatchGenerateFunc.sh
├── cmd
├── go.mod
├── internal
│   └── fmtStudy
│       └── fmtStudy.go
└── main.go

3 directories, 4 files
(base) ➜  libraryStudy ./BatchGenerateFunc.sh create module1 module2
输入的功能为:create,参数个数为 2
------------create module1 module--------------
./internal/module1Study Directory created
模块 module1 创建成功!
------------create module2 module--------------
./internal/module2Study Directory created
模块 module2 创建成功!
(base) ➜  libraryStudy tree                                         
.
├── BatchGenerateFunc.sh
├── cmd
├── go.mod
├── internal
│   ├── fmtStudy
│   │   └── fmtStudy.go
│   ├── module1Study
│   │   └── module1Study.go
│   └── module2Study
│       └── module2Study.go
└── main.go

5 directories, 6 files

2.删除模块

用法: ./BatchGenerateFunc.sh delete [要删除的模块名 ]
(base) ➜  libraryStudy ./BatchGenerateFunc.sh delete module1 module2
输入的功能为:delete,参数个数为 2
模块 module1 删除成功!
模块 module2 删除成功!

3.main 模块

用法: ./BatchGenerateFunc.sh main,之后要分别输入模块名,编号以及子函数个数

(base) ➜  libraryStudy ./BatchGenerateFunc.sh main          
请输入模块名:
module1
请输入编号:(如 3-->test3)
3
请输入子函数个数:
10
-----------------以下是生成的内容------------------
//模块 module1
func test3() {
    module1Study.Module1Test1()
    module1Study.Module1Test2()
    module1Study.Module1Test3()
    module1Study.Module1Test4()
    module1Study.Module1Test5()
    module1Study.Module1Test6()
    module1Study.Module1Test7()
    module1Study.Module1Test8()
    module1Study.Module1Test9()
    module1Study.Module1Test10()
}

测试完毕,非常完美!

最后放一下我常用 Makefile(go 语言版本的哦),对于使用命令行的朋友们非常有效:)

工具二:Makefile(自动构建)

TARGET            = main
DEBUG_TARGET      = $(TARGET).debug
RELEASE_TARGET    = $(TARGET).release
SRC               = $(wildcard *.go)
GO               ?= go
BUILD_DEBUG_FLAGS    := -gcflags=all="-N -l" -ldflags "-s -w -compressdwarf=false"
BUILD_RElEASE_FLAGS  :=


## build: build the target
build: $(TARGET)
$(TARGET):$(SRC)
    $(GO) build $(BUILD_RElEASE_FLAGS) -o $@ $^

## release: build release version of the target,strip symbol table and debug information
release: $(RELEASE_TARGET)
$(RELEASE_TARGET):$(TARGET)
    strip -o $@ $^

## debug: build debug version of the target
debug: $(DEBUG_TARGET)
$(DEBUG_TARGET):$(SRC)
    $(GO) build $(BUILD_DEBUG_FLAGS) -o $@ $^

## all: build debug and release and default version of the target
all:$(RELEASE_TARGET) $(DEBUG_TARGET)

## clean: clean the intermediate file
clean:
    rm -rf $(TARGET) $(TARGET).release $(TARGET).debug


## help: print this help message
help: ./Makefile
    @echo -e "\nUsage: make <TARGETS> ...\n\nTargets:"
    @sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /'
    @echo

.PHONY: build release debug all clean help

用法:

第一行-->TARGET            = main 这里的 main 可以修改为你项目的 app 名字
make help 查看使用说明

​ 最后,赶紧写 demo 了,速度学起来。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值