资讯详情

Golang之路 环境搭建及包的使用、测试和管理 (1)

文章目录

  • 前言
  • 一、Golang起源及安装
    • 1.go的起源
    • 2.go的安装
  • 二、Golang环境建设、配置
  • 三、如何下载包和自定义
    • 1.运行你的第一个go项目
    • 2.调用外包中的代码
    • 3.上传你的go并下载项目
  • 四、如何进行代码测试?
  • 练习:如何将gin项目包装成可执行文件?


前言

本专栏将学习最新的golang技术,以及gin框架、例题等(当你看到例子时,你不妨先试试)。

本章需要一点github如果有错误或需要优化的代码,可以在评论中指出(本系列的所有操作都将在那里windows10中进行) 。

一、Golang起源及安装

1.go的起源

Go它是一种快速、静态的编译语言,感觉像一种动态的解释语言。

其优点在于:

  • Go 具有表现力、高效
  • 并发机制使编写充分利用多核和联网机的程序变得容易
  • 支持灵活模块化程序构建的新型系统(1.8后新增泛型
  • 快速编译为机器码
  • 垃圾收集的便利性和运行过程中反射的强大功能

golang的强大背景(创造golang开发人员是计算机界的大神,谷歌的维护)让它在云计算、虚拟化、区块链、后端服务器等方面表现出色。

2.go的安装

下载地址:https://golang.google.cn/dl/go1.18.3.windows-amd64.msi

下载后一直确认(本章以F:GO为安装目录)

推荐goland工具:https://download.jetbrains.com.cn/go/goland-2021.3.2.exe

使用教程:https://pan.baidu.com/s/15aDSp_WQV5eNvCEKIjyNmA?pwd=p6e8

二、Golang环境建设、配置

Go代码必须放在工作空间。它实际上是一个包含三个子目录的目录

  • src 目录包含Go它们被组织成包(每个目录对应一个包)
  • pkg 包含对象的目录
  • bin 目录包含可执行命令

目录结构如下(本示例)D:\all_project\GolandProjects工作环境变量根目录):

D:\all_project\GolandProjects  - src   -github.com    - user    - pkg  - bin 

这些目录需要手动创建

为了方便将来定义包,我们可以src下面再建一个github.com/user(这里所有的user换成你的github账号的名字)文件夹,至于怎么使用我们下面会讲到。

设置环境变量 在这里插入图片描述

bin目录如图:

三、如何下载包和自定义

1.运行你的第一个go项目

在这里,我们可以养成习惯github.com/user创建/目录go方便我们后续上传和阅读项目。

创建hello/hello.go代码如下:

package main  import (  "fmt" ) func main() { 
          fmt.Printf("Hello,World") }  

这里package main相当于主入口,所有代码都将通过main函数

我们在这里介绍了一个fmt文件(其中包含格式化文本的功能,包括打印到控制台),我们正在安装这个包 Go 标准库包之一

以下是如何导入我们编写的包或从外部命令下载的包。

go有三种项目运行方式:

  • go run . (编译执行的常用方法)
  • go install (包装项目exe格式在bin目录下)
  • go build -o 包名 (包装项目exe格式在当前目录下)

记住,在那里目前项目的根下面执行,我将在每个命令的具体使用场景中解释配合例题

但在此之前,在go介绍了新版本的到来mod,该文件的作用相当于配置文件,创建方法如下:

go mod init github.com/user/hello // 命名规范很容易上传到github中供人下载 

此时,当前目录将生成一个目录go.mod内容如下:

module github.com/user/hello  go 1.18 )  

默认初始化是这样的,我们将根据后续的需要添加

通过go run . 执行控制台打印如下:

Hello,World 

2.调用外包中的代码

前面我们通过导入标准库包fmt如果结果打印在控制台上,我们应该如何编写或下载其他人?呢?先讲如何下载他人的包并导入

我们将修改hello.go代码如下:

package main

import "fmt"

import "rsc.io/quote"

func main() { 
        
    fmt.Println(quote.Go())
}

此时我们可以通过两种命令去下载模块

  • go get 包名(.代表下载所有依赖)
  • go mod tidy(等于 go get . 不过这是在当前目录下载依赖)

此时我们执行go mod tidy时有可能下载不了,我们需要通过设置代理才可以下载

// 通过 go env 可以查看我们的go配置信息
go env -w GOPROXY=https://goproxy.cn

下载成功后,我们不着急运行,先看看我们的go.mod文件如下:

module github.com/user/hello

go 1.18

require (
	rsc.io/quote v1.5.2
)

require (
	golang.org/x/text v0.3.6 // indirect
	rsc.io/sampler v1.3.0 // indirect
)

可以看到go默认的帮我们导入到了mod文件中(添加quote模块作为要求,以及用于验证模块的 go.sum 文件),并附带了版本号(默认情况下是最新的版本)。

可选: 了解更多mod知识

此时我们通过 go build 生成可执行文件在当前目录下执行:

.\hello.exe

控制台打印:

Don't communicate by sharing memory, share memory by communicating.

下面我们来介绍一下怎么自己编写包,并调用

在github.com/user目录下创建一个stringutil/revere.go如下:

package stringutil

// Reverse 将其实参字符串以符文为单位左右反转。
func Reverse(s string) string { 
        
	r := []rune(s)
	for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { 
        
		r[i], r[j] = r[j], r[i]
	}
	return string(r)
}

这里有一个小细节我要讲,对于我们现在生成的函数Reverse时,这个函数开头要大写,这是go的规范(公用的),如果你使用小写命名函数,那么这个函数将只能在当前文件中使用(私有的) 。

函数里的代码是如何实现字符串翻转的现在不用管,我们创建mod文件

go mod init github.com/user/stringutil

好的,此时我们按照规范写好了,现在我们该修改hello.go文件如下:

package main

import (
	"fmt"
	"github.com/user/stringutil"
	"rsc.io/quote"
)

func main() { 
        
	fmt.Println(quote.Go())
	fmt.Printf(stringutil.Reverse("!risoaiM ,olleH"))
}

此时我们回到hello根目录通过go mod tidy 下载是肯定不行的,因为我们并没有将stringutil文件夹上传到github上,所以我们需要配置一下go.mod文件如下:

module github.com/user/hello
// 这里是重定向
replace github.com/user/stringutil => ../stringutil

go 1.18

require (
	github.com/user/stringutil v1.0.0
	rsc.io/quote v1.5.2
)

require (
	golang.org/x/text v0.3.6 // indirect
	rsc.io/sampler v1.3.0 // indirect
)

这个操作相当于我们将路径重定向到了我们编写该路径的文件夹下

那么此时再通过go mod tidy 运行变会不再出现问题

也可以通过控制台命令生成如下:

go mod edit -replace github.com/user/stringutil=../stringutil

go mod tidy

此时效果和上面手动配置的一样,不过版本会变成随机的(因为这是我们没有上传到github上自己在文件夹中调用的,所以不存在版本,需自己修改版本后再上传到github上)。

通过go run . 运行 控制台打印如下:

Don't communicate by sharing memory, share memory by communicating.
Hello, Miaosir!

3.上传你的go项目并下载下来

现在我们该如何的发布我们的包,供其他人下载调用呢?本次示例我们将上传stringutil文件夹下的内容到github上。

创建好仓库后,控制台输入:

git init
git add .
git commit -m "first commit"
git remote add origin git@github.com:user/stringutil.git
git tag -a v1.0.0 -m "第一次写版本"
git push -u origin --tags
git push -u origin master

上传完毕后就可以让使用者通过地址下载下来自己使用了

测试一下,将hello文件夹下go.mod修改如下:

module github.com/user/hello

go 1.18

require (
	rsc.io/quote v1.5.2
)

require (
	golang.org/x/text v0.3.6 // indirect
	rsc.io/sampler v1.3.0 // indirect
)

hello.go如下:

package main

import (
	"fmt"
	"github.com/user/stringutil"
	"rsc.io/quote"
)

func reverse() string { 
        
	return stringutil.Reverse("!risoaiM ,olleH")
}

func main() { 
        
	fmt.Println(quote.Go())
	fmt.Printf(reverse())
}

运行 go mod tidy 进行下载,通过 go list -f ‘{ {.Target}}’ 可以查看文件目录

通过 go install 将hello.exe打包到bin目录,因为我们写了环境变量,所以可以直接调用,通过控制台输入:

hello

控制台打印:

Don't communicate by sharing memory, share memory by communicating.
Hello, Miaosir!

四、如何进行代码测试?

虽然我们现在写的项目代码量不多,出现问题也能调试出来,不过往往在真正开发环境中,你写的很多的函数,这时候你需要通过测试来查看函数返回的结果是否为你预期的结果,不然真正的上线项目后会带来许多的问题。

我们这里就通过我们之前上传到github上的字符串翻转函数改进并进行测试,然后再重新上传成一个新版本。

stringutil.go代码如下:

package stringutil

import "errors"

// 将字符串翻转
func Reverse(s string) (string, error) { 
        
	if s == "" { 
        
		return s, errors.New("请输入字符串")
	}
	r := []rune(s)
	for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { 
        
		r[i], r[j] = r[j], r[i]
	}
	return string(r), nil
}

这里的改进是判断字符串是否为空的情况下,是否能按照预期返回对应结果,并且多加了一个异常(不为空则error为nil)。

对于go的规范而言,以 _test.go 结尾的文件名告诉go test命令该文件包含测试函数(提供了内置的标准包testing)

创建stringutil_test.go如下:

package stringutil

import (
	"testing"
)

// 测试函数翻转功能是否有效
func TestReverse(t *testing.T) { 
        
	name := "Test"
	msg, err := Reverse("tseT")
	if err != nil || name != msg { 
        
		t.Fatalf(`Reverse("") = %q, %v, want "", error`, msg, err)
	}
}

// 测试我们的代码是否正确通过字符串为空得到报错结果
func TestReverseEmpty(t *testing.T) { 
        
	msg, err := Reverse("")
	if msg != "" || err == nil { 
        
		t.Fatalf(`Reverse("") = %q, %v, want "", error`, msg, err)
	}
}

此时控制台输入

go test -v

打印结果:

=== RUN   TestReverse
--- PASS: TestReverse (0.00s)
=== RUN   TestReverseEmpty
--- PASS: TestReverseEmpty (0.00s)
PASS
ok      github.com/user/stringutil     0.040s

然后将git代码进行更新

git add .
git commit -m "测试完成"
git tag -a v1.0.1 -m "测试版本生成"
git push origin master
git push origin --tags

本次使用的例子:https://github.com/miaojiaxi2004/stringutil/

练习:如何将gin写的项目打包成可执行文件?

Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了 httprouter,速度提高了 40 倍 。

示例地址:https://github.com/gin-gonic/examples/tree/master/assets-in-binary/example01

要求:根据其要求使用该包,并删除assets.go尝试自己通过其提供的其他包生成一个assets.go。

结果:执行./assets-in-binary.exe后服务器直接运行

按照上面的链接给出的文档,先执行

go get github.com/gin-gonic/gin
go get github.com/jessevdk/go-assets-builder

然后

go-assets-builder html -o assets.go

这里直接这样写肯定是不行的,要用到我们前面说的go install 生成全局的exe文件,然后才可以调用该方法,那么我们该从哪里入手呢?

我们下载其他人的包的时候默认会在pkg下,然后从那个网站下载下来的后缀名+它的包名

这里的话总路径就是 pkg/mod/github.com/jessevdk下,那么我们直接去查看,发现这里是没有go.mod文件的。

那么这时候我们要自己手动创建go.mod文件进行编写,然后生成全局的exe文件,在进行打包操作。

不过再次之前我们需要在它的目录中找到main函数入口,查看它导入了什么,这里是builder.go如下:

package main

import (
	"github.com/jessevdk/go-assets"
	"github.com/jessevdk/go-flags"
	"os"
)

func main() { 
        
	// 不用管
}

可以看到导入了go-assets和go-flags这两个是它自己的包,而os是标准库包,不需要导入

所以go.mod如下:

module github.com/jessevdk/go-assets-builder

require (
	github.com/jessevdk/go-assets v0.0.0-20160921144138-4f4301a06e15
	github.com/jessevdk/go-flags v1.5.0
)

go 1.18

好了,现在配置完成后就可以在go-assets-builder目录下进行编译打包了执行 go install,此时在我们全局的bin目录下就出现了打包成功的go-assets-builder.exe文件了。

那么我们回到之前被我们删除assets.go文件的example01目录,按照上面链接文档提示执行

go-assets-builder html -o assets.go

此时就没问题了,执行完成后就会生成新的assets.go文件了

然后继续往下执行

go build -o assets-in-binary.exe

这个命令是打包exe文件到当前文件夹目录,并取名为assets-in-binary

成功后执行 ./assets-in-binary.exe 控制台将会开启服务器如下:

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> main.main.func1 (1 handlers)
[GIN-debug] GET    /bar                      --> main.main.func2 (1 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.

此时浏览器访问http://localhost:8080/即可访问看到Hello,World

下载下来的模块中还有一个example02目录(这里的是已经写好的,通过 go build -o assets-in-binary2.exe 即可生成exe文件)

使用的打包方法是在go1.16之后提供了embed这个标准库包,然后按照其规范导入图片和模板。

有兴趣的朋友可以把这个当最后的练习看看:https://pkg.go.dev/embed@master

此时运行 ./assets-in-binary2.exe

浏览器访问:http://localhost:8080/public/assets/images/example.png

你会看到一只会魔法的土拨鼠…

标签: revere传感器csprevere传感器kis

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台