100天精通Golang(基础入门篇)

您所在的位置:网站首页 常用的代码语言 100天精通Golang(基础入门篇)

100天精通Golang(基础入门篇)

2024-07-17 11:40| 来源: 网络整理| 查看: 265

🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐥

Go语言的执行原理及常用命令、编码规范和常用工具引言:

在学习和使用Go语言过程中,了解其执行原理和常用命令是非常重要的。同时,编写规范的代码和使用常用工具也是提高开发效率和代码质量的关键。本文将深入探讨Go语言的执行原理,介绍常用的命令,以及详细讲解编码规范和常用工具的使用方法。

摘要:

本文通过介绍Go语言的执行原理和常用命令,帮助读者全面了解Go的工作原理和常用命令的使用。同时,详细解释了Go编码规范的各个方面,包括命名规范、注释规范和代码风格。此外,还介绍了一些常用的工具,以提升开发效率和代码质量。通过学习本文,读者可以更好地掌握Go语言的使用技巧和开发规范。

Go语言的执行原理及常用命令一、Go的源码文件

Go 的源码文件分类:

如上图,分为三类:

1、命令源码文件:

声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。

命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,就会安装到 GOBIN 指向的目录下。

命令源码文件是 Go 程序的入口。

同一个代码包中最好也不要放多个命令源码文件。多个命令源码文件虽然可以分开单独 go run 运行起来,但是无法通过 go build 和 go install。

代码语言:javascript复制package main import "fmt" func main() { fmt.Println(`Hello Go!`) fmt.Print(`学习Go,学会Golang 就找wx: libin9iOak ! `) }

我们先打开上次课Day0的hello目录,然后复制HelloGo.go为HelloGo2.go文件,并修改里面的内容:

代码语言:javascript复制package main import "fmt" func main() { fmt.Println(`Hello Go!`) fmt.Println(`我是第二个 Hello Go!`) fmt.Print(`学习Go,学会Golang 就找wx: libin9iOak ! `) }

hello目录下有两个go文件了,一个是HelloGo.go,一个是HelloGo2.go。先说明一下,在上述文件夹中放了两个命令源码文件,同时都声明自己属于 main 代码包。

打开终端,进入hello这个目录,也可以看到这两个文件:

然后我们分别执行go run命令,可以看到两个go文件都可以被执行:

代码语言:javascript复制D:\GolandProjects\Day0-Environmental-Construction>go run HelloGo.go Hello Go! 学习Go,学会Golang 就找wx: libin9iOak ! D:\GolandProjects\Day0-Environmental-Construction>go run HelloGo2.go Hello Go! 我是第二个 Hello Go! 学习Go,学会Golang 就找wx: libin9iOak ! D:\GolandProjects\Day0-Environmental-Construction>

接下来执行 go build 和 go install ,看看会发生什么:

代码语言:javascript复制D:\GolandProjects\Day0-Environmental-Construction>go build # Day0-Environmental-Construction .\HelloGo2.go:5:6: main redeclared in this block .\HelloGo.go:5:6: other declaration of main D:\GolandProjects\Day0-Environmental-Construction>go install # Day0-Environmental-Construction .\HelloGo2.go:5:6: main redeclared in this block .\HelloGo.go:5:6: other declaration of main

运行效果图:

这也就证明了多个命令源码文件虽然可以分开单独 go run 运行起来,但是无法通过 go build 和 go install。

同理,如果命令源码文件和库源码文件也会出现这样的问题,库源码文件不能通过 go build 和 go install 这种常规的方法编译和安装。具体例子和上述类似,这里就不再贴代码了。

所以命令源码文件应该是被单独放在一个代码包中。

2、库源码文件

库源码文件就是不具备命令源码文件上述两个特征的源码文件。存在于某个代码包中的普通的源码文件。

库源码文件被安装后,相应的归档文件(.a 文件)会被存放到当前工作区的 pkg 的平台相关目录下。

3、测试源码文件

名称以 _test.go 为后缀的代码文件,并且必须包含 Test 或者 Benchmark 名称前缀的函数:

代码语言:javascript复制func TestXXX( t *testing.T) { }

名称以 Test 为名称前缀的函数,只能接受 *testing.T 的参数,这种测试函数是功能测试函数。

代码语言:javascript复制func BenchmarkXXX( b *testing.B) { }

名称以 Benchmark 为名称前缀的函数,只能接受 *testing.B 的参数,这种测试函数是性能测试函数。

现在答案就很明显了:

命令源码文件是可以单独运行的。可以使用 go run 命令直接运行,也可以通过 go build 或 go install 命令得到相应的可执行文件。所以命令源码文件是可以在机器的任何目录下运行的。

举个栗子:

比如平时我们在 LeetCode 上刷算法题,这时候写的就是一个程序,这就是命令源码文件,可以在电脑的任意一个文件夹新建一个 go 文件就可以开始刷题了,写完就可以运行,对比执行结果,答案对了就可以提交代码。

但是公司项目里面的代码就不能这样了,只能存放在 GOPATH 目录下。因为公司项目不可能只有命令源码文件的,肯定是包含库源码文件,甚至包含测试源码文件的。

二、Go的命令

目前Go的最新版1.20里面基本命令有以下18个。

我们可以打开终端输入:go help即可看到Go的这些命令以及简介。

代码语言:javascript复制 Go is a tool for managing Go source code. Usage: go [arguments] The commands are: bug start a bug report build compile packages and dependencies clean remove object files and cached files doc show documentation for package or symbol env print Go environment information fix update packages to use new APIs fmt gofmt (reformat) package sources generate generate Go files by processing source get add dependencies to current module and install them install compile and install packages and dependencies list list packages or modules mod module maintenance work workspace maintenance run compile and run Go program test test packages tool run specified go tool version print Go version vet report likely mistakes in packages Use "go help " for more information about a command. Additional help topics: buildconstraint build constraints buildmode build modes c calling between Go and C cache build and test caching environment environment variables filetype file types go.mod the go.mod file gopath GOPATH environment variable gopath-get legacy GOPATH go get goproxy module proxy protocol importpath import path syntax modules modules, module versions, and more module-get module-aware go get module-auth module authentication using go.sum packages package lists and patterns private configuration for downloading non-public code testflag testing flags testfunc testing functions vcs controlling version control with GOVCS Use "go help " for more information about that topic.

其中和编译相关的有build、get、install、run这4个。接下来就依次看看这四个的作用。

在详细分析这4个命令之前,先罗列一下通用的命令标记,以下这些命令都可适用的:

名称

说明

-a

用于强制重新编译所有涉及的 Go 语言代码包(包括 Go 语言标准库中的代码包),即使它们已经是最新的了。该标记可以让我们有机会通过改动底层的代码包做一些实验。

-n

使命令仅打印其执行过程中用到的所有命令,而不去真正执行它们。如果不只想查看或者验证命令的执行过程,而不想改变任何东西,使用它正好合适。

-race

用于检测并报告指定 Go 语言程序中存在的数据竞争问题。当用 Go 语言编写并发程序的时候,这是很重要的检测手段之一。

-v

用于打印命令执行过程中涉及的代码包。这一定包括我们指定的目标代码包,并且有时还会包括该代码包直接或间接依赖的那些代码包。这会让你知道哪些代码包被执行过了。

-work

用于打印命令执行时生成和使用的临时工作目录的名字,且命令执行完成后不删除它。这个目录下的文件可能会对你有用,也可以从侧面了解命令的执行过程。如果不添加此标记,那么临时工作目录会在命令执行完毕前删除。

-x

使命令打印其执行过程中用到的所有命令,并同时执行它们。

1. go run

专门用来运行命令源码文件的命令,注意,这个命令不是用来运行所有 Go 的源码文件的!

go run 命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于 main 包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么 go run 命令就只会打印错误提示信息并退出,而不会继续执行。

这个命令具体干了些什么事情呢?来分析分析,我们先重新创建一个新文件:HelloGo.go,并加入以下代码:

代码语言:javascript复制package main import "fmt" func main() { fmt.Println(`Hello Go!`) fmt.Print(`学习Go,学会Golang 就找wx: libin9iOak ! `) }

执行go run 配合-n:

代码语言:javascript复制D:\GolandProjects\Day0-Environmental-Construction>go run -n HelloGo.go mkdir -p $WORK\b001\ cat >$WORK\b001\importcfg.link go run -work HelloGo.go WORK=C:\Users\DELL\AppData\Local\Temp\go-build3848787815 Hello Go! 学习Go,学会Golang 就找wx: libin9iOak ! D:\GolandProjects\Day0-Environmental-Construction>

我们进入:C:\Users\DELL\AppData\Local\Temp\go-build3848787815目录,可以看到如下目录结构:

可以看到,最终go run命令是生成了2个文件,一个是归档文件,一个是可执行文件。

go run 命令在第二次执行的时候,如果发现导入的代码包没有发生变化,那么 go run 不会再次编译这个导入的代码包。直接静态链接进来。

代码语言:javascript复制D:\GolandProjects\Day0-Environmental-Construction>go run -n HelloGo.go mkdir -p $WORK\b001\ cat >$WORK\b001\importcfg.link 2. go build

go build 命令主要是用于测试编译。在包的编译过程中,若有必要,会同时编译与之相关联的包。

如果是普通包,当你执行go build命令后,不会产生任何文件。如果是main包,当只执行go build命令后,会在当前目录下生成一个可执行文件。如果需要在$GOPATH/bin目录下生成相应的exe文件,需要执行go install 或者使用 go build -o 路径/可执行文件。如果某个文件夹下有多个文件,而你只想编译其中某一个文件,可以在 go build 之后加上文件名,例如 go build a.go;go build 命令默认会编译当前目录下的所有go文件。你也可以指定编译输出的文件名。比如,我们可以指定go build -o 可执行文件名,默认情况是你的package名(非main包),或者是第一个源文件的文件名(main包)。go build 会忽略目录下以”_”或者”.”开头的go文件。如果你的源代码针对不同的操作系统需要不同的处理,那么你可以根据不同的操作系统后缀来命名文件。

当代码包中有且仅有一个命令源码文件的时候,在文件夹所在目录中执行 go build 命令,会在该目录下生成一个与目录同名的可执行文件。

代码语言:javascript复制// 假设当前文件夹名叫 hello localhost:hello libin9ioak$ pwd /Users/libin9ioak/go/src/hello localhost:hello libin9ioak$ ls HelloGo.go localhost:hello libin9ioak$ go build localhost:hello libin9ioak$ ls hello HelloGo.go localhost:hello libin9ioak$ 代码语言:javascript复制Microsoft Windows [版本 10.0.22621.1778] (c) Microsoft Corporation。保留所有权利。 D:\GolandProjects\FirstGoProject>color 2 D:\GolandProjects\FirstGoProject>go build D:\GolandProjects\FirstGoProject>

于是在当前目录直接生成了以当前文件夹为名的可执行文件( 在 Mac 平台下是 Unix executable 文件,在 Windows 平台下是 exe 文件)

但是这种情况下,如果使用 go install 命令,如果 GOPATH 里面只有一个工作区,就会在当前工作区的 bin 目录下生成相应的可执行文件。如果 GOPATH 下有多个工作区,则是在 GOBIN 下生成对应的可执行文件。

代码语言:javascript复制localhost:hello libin9ioak$ go install go install hello: open /usr/local/go/bin/hello: permission denied localhost:hello libin9ioak$

这个问题是因为它需要创建bin目录,然后把可刚才的可执行文件放进去,而目前我们在gopath下还没有bin目录,那么就需要先创建这个文件,而普通用户没有直接创建文件夹的权限,这个和Go语言的命令是没有关系的。我们可以加上sodu 来执行这个命令,表示使用管理员的身份执行,然后输入密码,那么就可以创建bin这个文件夹了。

再次执行:

代码语言:javascript复制localhost:hello libin9ioak$ sudo go install Password: localhost:hello libin9ioak$

执行完 go install 会发现可执行文件不见了!去哪里了呢?其实是被移动到了 bin 目录下了(如果 GOPATH 下有多个工作区,就会放在GOBIN 目录下)。

那 go build 和 go install 究竟干了些什么呢?

先来说说 go build。go build 用于编译我们指定的源码文件或代码包以及它们的依赖包。但是注意如果用来编译非命令源码文件,即库源码文件,go build 执行完是不会产生任何结果的。这种情况下,go build 命令只是检查库源码文件的有效性,只会做检查性的编译,而不会输出任何结果文件。

go build 编译命令源码文件,则会在该命令的执行目录中生成一个可执行文件,上面的例子也印证了这个过程。

go build 后面不追加目录路径的话,它就把当前目录作为代码包并进行编译。go build 命令后面如果跟了代码包导入路径作为参数,那么该代码包及其依赖都会被编译。

go build 命令究竟做了些什么呢?我们可以执行-n这个命令来查看:

代码语言:javascript复制localhost:hello libin9ioak$ go build -n # # hello # mkdir -p $WORK/b001/ cat >$WORK/b001/importcfg $WORK/b001/importcfg.link $WORK/b001/importcfg $WORK/b001/importcfg.link 0 { } // 错误的方式 if a>0 // a ,0 和 > 之间应该空格 { // 左大括号不可以换行,会报语法错误 }4、import 规范

import在多行的情况下,goimports会自动帮你格式化,但是我们这里还是规范一下import的一些规范,如果你在一个文件里面引入了一个package,还是建议采用如下格式:

代码语言:javascript复制import ( "fmt" )

如果你的包引入了三种类型的包,标准库包,程序内部包,第三方包,建议采用如下方式进行组织你的包:

代码语言:javascript复制import ( "encoding/json" "strings" "myproject/models" "myproject/controller" "myproject/utils" "github.com/astaxie/beego" "github.com/go-sql-driver/mysql" )

有顺序的引入包,不同的类型采用空格分离,第一种实标准库,第二是项目包,第三是第三方包。

在项目中不要使用相对路径引入包:

代码语言:javascript复制// 这是不好的导入 import “../net” // 这是正确的做法 import “github.com/repo/proj/src/net”

但是如果是引入本项目中的其他包,最好使用相对路径。

5、错误处理错误处理的原则就是不能丢弃任何有返回err的调用,不要使用 _ 丢弃,必须全部处理。接收到错误,要么返回err,或者使用log记录下来尽早return:一旦有错误发生,马上返回尽量不要使用panic,除非你知道你在做什么错误描述如果是英文必须为小写,不需要标点结尾采用独立的错误流进行处理代码语言:javascript复制// 错误写法 if err != nil { // error handling } else { // normal code } // 正确写法 if err != nil { // error handling return // or continue, etc. } // normal code6、测试

单元测试文件名命名规范为 example_test.go 测试用例的函数名称必须以 Test 开头,例如:TestExample 每个重要的函数都要首先编写测试用例,测试用例和正规代码一起提交方便进行回归测试

四、常用工具

上面提到了很过规范, go 语言本身在代码规范性这方面也做了很多努力,很多限制都是强制语法要求,例如左大括号不换行,引用的包或者定义的变量不使用会报错,此外 go 还是提供了很多好用的工具帮助我们进行代码的规范,

gofmt 大部分的格式问题可以通过gofmt解决, gofmt 自动格式化代码,保证所有的 go 代码与官方推荐的格式保持一致,于是所有格式有关问题,都以 gofmt 的结果为准。

goimport 我们强烈建议使用 goimport ,该工具在 gofmt 的基础上增加了自动删除和引入包.

代码语言:javascript复制go get golang.org/x/tools/cmd/goimports

go vet vet工具可以帮我们静态分析我们的源码存在的各种问题,例如多余的代码,提前return的逻辑,struct的tag是否符合标准等。

代码语言:javascript复制go get golang.org/x/tools/cmd/vet

使用如下:

代码语言:javascript复制go vet .学习总结:

通过本文的学习,我们深入了解了Go语言的执行原理和常用命令,包括go run、go build、go install、go get等。同时,我们也学习了Go编码规范的各个方面,包括命名规范、注释规范和代码风格等。此外,我们还了解了一些常用的工具,如错误处理和测试工具等。通过遵循规范和使用工具,我们可以提高开发效率和代码质量,更好地应用Go语言进行开发。

希望本文对读者在学习和使用Go语言过程中有所帮助,让我们一起深入探索Go语言的魅力!

结语

通过今天的学习,您已经踏上了Golang的学习之旅。在未来的日子里,您将探索Golang的各个方面,从基础概念到高级技巧,从实际应用到性能优化。 学习一门编程语言是一个持续的过程,每一天都是您向Golang的精通迈进的重要一步。我鼓励您坚持每天学习,保持热情和好奇心,解决挑战并享受成功的喜悦。

在您的学习旅程中,不要忘记参与社区和与其他Golang开发者交流。分享您的见解和经验,向他人学习,并在开源项目或实际应用中展示您的技能。

如果您在学习过程中遇到困难或有任何问题,不要犹豫向社区和专家寻求帮助。持续学习,勇敢探索,您将在Golang领域取得令人瞩目的成就。

最后,感谢您的阅读和支持!祝愿您在未来的每一天中都能够成为一名精通Golang的开发者!

期待听到您在学习过程中的进展和成就。如果您需要进一步的帮助,请随时告诉我。祝您在学习Golang的旅程中取得巨大成功!

如果您在学习过程中有任何疑惑,请点击下方名片,带您一对一快速入门 Go语言 的世界 ~



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3