赞
踩
目录
更多关于Go的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
Go语言(也称为Golang)是由Google开发的一种全新的静态强类型、编译型、语言级别的并发型的开源编程语言,以及具有自动垃圾回收功能的编程语言,以及具有丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性。Go语言于2007年开始设计,并于2009年正式发布。它的设计目标是提供一种简单、高效、可靠的编程语言,适用于大规模的软件开发项目。风格介于强类型语言和动态类型语言之间。
由于后台不少粉丝留言咨询关于Go方面的学习资料,所有经过整整一个周末的时间哪里也没去,大概整理了如下88篇文章清单,将在公众号CTO Plus后面的文章陆续总结分享,有问题欢迎后台留言交流。
1. 《Go语言的高级特性,发展趋势,以及推荐最热门的开源项目》
2. 《Go 1.21稳定版和新特性详解》
3. 《Go的多端开发环境与编译器的搭建详解(图文)》
4. 《Go编码,规范先行》
5. 《Go的代码包以及自定义包的开发详细介绍》
6. 《Go的命令操作总结教程》
7. 《Go语言的打印输出方法总结》
8. 《Go语言变量与标识符探秘:灵活存储数据》
9. 《Go语言常量解密:恒定不变的值(const与iota)(附代码示例)》
10. 《Go语言变量的生命周期与作用域》
11. 《深入了解Go语言的数据类型》
12. 《Go语言字符串操作大揭秘:高效处理文本》
13. 《Go的流程控制(if、for、switch、goto)全面解析与刨坑》
14. 《Go中字符串的遍历技巧:轻松操作文本》
15. 《Go语言中的类型转换利器gconv:无缝转换数据详解》
16. 《使用strconv进行Go的 int、float、string类型相互转换:灵活转换数据类型》
17. 《Go的运算符解密:探索计算的奥秘》
18. 《Go的表达式解析:理解代码的核心》
19. 《Go的切片(slice)技巧:灵活操作有序集合》
20. 《Go的切片(slice)make、append、copy、pop/sub等操作的使用技巧,以及提升代码效率详解》
21. 《Go的切片(slice)自动扩容策略的实现》
22. 《深入理解与深度解析Go语言的切片(Slice):探索底层机制》
23. 《Go高级:常用数据结构之切片(Slice)性能及陷阱》
24. 《Go的范围(range)遍历揭秘:掌握迭代技巧,高效处理数据集合,比较for和range的性能》
25. 《Go的rune解析:深入了解字符处理》
26. 《Go语言关键字解析:理解关键代码元素》
27. 《Go语言映射(Map)技巧:灵活操作数据集合》
28. 《Go语言Map(字典、键值对、集合)操作大揭秘:掌握高效映射技巧》
29. 《Go语言赋值与(深浅)拷贝解析:深入分析数据处理》
30. 《Go的数组初始化使用方法以及作为函数参数的使用方法》
31. 《解析Go语言的数组:高效处理有序数据》
32. 《Go内置数据结构数组(array)、切片(slice)、字典(map)之间的区别和特点对比》
33. 《Go指针的奇妙世界:解析Go语言中的指针用法》
34. 《Go方法的魅力:掌握Go语言中的方法使用技巧》
35. 《Go模块化编程探秘:Go语言中模块的设计与使用》
36. 《Go函数的奇妙之旅:深入理解Go语言中的函数特性》
37. 《Go递归函数的魅力:探索Go语言中递归的妙用》
38. 《Go高效内置函数大揭秘:开发中常用的Go语言内置函数》
39. 《Go函数与方法的区别:揭秘它们的共性与差异》
40. 《Go函数式编程探秘:优劣势与模块应用实战详解》
41. 《Go高阶函数的魅力:掌握Go语言中的函数式编程》
42. 《Go接口(interface)的奇妙世界:深入理解Go语言中的接口特性》
43. 《Go延迟语句(defer statement)的作用、功能特性、底层原理详细介绍》
44. 《Go散列表(Hash Table)的作用、功能特性、底层原理详细介绍》
45. 《Go结构体(struct)解析:掌握Go语言中结构体的使用技巧》
46. 《Go性能测试技巧大揭秘:优化Go语言程序的性能》
47. 《Go调试&单元测试:Go语言开发中的调试和测试技巧》
48. 《Go时间操作大全解析:掌握时间处理的技巧》
49. 《Go函数闭包底层实现:深入探讨Go语言中闭包的原理》
50. 《Go并发安全的奥秘:深入理解Go语言中的并发安全性sync.Map的实现原理》
51. 《Go并发编程基础之上下文的奇妙世界:什么是上下文以及探索Go语言中上下文的应用与实践》
52. 《Go的反射(reflect)深入理解和实战示例》
53. 《Go的反射(reflect)机制详解》
54. 《探究Go的面向对象编程》
55. 《Go快速集成日志模块:Go语言框架中的日志模块(zap)集成指南》
56. 《Go的包管理器工具mod使用介绍详解》
57. 《Go依赖管理工具dep》
58. 《Go语言的包管理工具对比:Go Modules和dep》
59. 《如何在Go中使用日志包》
60. 《Go垃圾回收的黑盒解析:探究Go语言中的内存管理和垃圾回收机制》
61. 《Go中的标准库(内置包)fmt详解和代码实战案例》
62. 《Go中的标准库(内置包)os详解和代码实战案例》
63. 《Go中的标准库(内置包)strconv详解和代码实战案例》
64. 《Go中的标准库(内置包)time详解和代码实战案例》
65. 《Go中的标准库(内置包)net/http详解和代码实战案例》
66. 《Go中的标准库(内置包)sync详解和代码实战案例》
67. 《Go好用的扩展包:使用扩展包对时间进行格式化》
68. 《Go好用的第三方库:json包的使用技巧》
69. 《Go好用的第三方库:测试库GoConvey详解》
70. 《Go好用的第三方库:validator的使用详解》
71. 《Go好用的第三方库:glow的使用详解》
72. 《Go好用的第三方库:gjson的使用详解》
73. 《Go好用的第三方库:authboss的使用详解》
74. 《Go好用的第三方库:Go-underscore的使用详解》
75. 《总结Go第三方库validator、glow、gjson、authboss、Go-underscore的作用、区别以及功能特点》
76. 《Go的内存模型》
77. 《Go的内存逃逸分析》
78. 《Go的错误处理艺术:深入探讨Go语言的错误处理机制》
79. 《Go中的error优缺点和应用场景详细剖析》
80. 《Go性能优化之测试Golang代码性能》
81. 《Go并发编程之并发与并行,分布式,多核化和集群化详细介绍》
82. 《Go并发编程:执行体间的通信》
83. 《Go并发编程之并发模式实践》
84. 《Go并发编程:管道》
85. 《Go并发编程:协程》
86. 《Go从源码角度剖析Channel》
87. 《Go调用第三方系统API方法实践》
88. 《Go的生产环境项目部署方案》
Go programming language在github上拥有111k+ star,算是非常火热了。
本篇文章将介绍以下内容:
Go的语言特性、用途和应用场景介绍。
Go的Windows/Linux系统的安装与配置。
Go的相关变量配置。
Go的开发工具和环境变量配置和搭建,安装和编写第一行 Go 代码所需的工具。
Go的三个主要环境变量介绍和配置方法。
Go的代码目录结构规划
Go的设计理念很明确,就是将动态类型语言的编程容易度和静态类型语言的安全效率结合起来。Go的主要特点是简单、简洁、快速、高效、安全、并发等,适用于大规模的系统开发。
如果对C和Python都比较了解的人,Go给人的感觉就如同C和Python中间的完美结合。Go弥补了Python追求代码的速度和并行化的需求。同时Golang又保留了C的一些风格,比如指(但不能做一些指针方面的计算)针、引用等,还屏蔽了面向对象编程语言C++和Java一些比较耐人寻味的繁琐的高级特性,比如没有独立的OO,但通过struct和interface也能实现OO,没有exceptions等等。
在公众号CTO Plus前面的文章《Go语言的高级特性,发展趋势,以及推荐最热门的开源项目》中已经对Go的大部分高级特性做了一个概览介绍,接下来再补充和介绍些Go语言的几个典型特点,这也是为什么Go值得学习的原因之一。
静态语言,强类型,以及类型推导
Go语言是静态类型语言,即在编译时会检查变量的类型。静态编译能帮我们检查出来大量的错误,这有助于减少运行时错误,并提高代码的可读性和可维护性。Go的强类型则体现在不支持隐式的类型转换。同时,Go语言也支持类型推导,可以根据变量的初始化值自动推导出其类型,减少冗余的类型声明。
易于运维部署
Go语言的程序可以编译成一个单独的可执行文件,直接放到服务器上,而不依赖于外部的运行时环境(直接编译成二进制)。这使得部署和分发Go程序变得非常简单,只需要将可执行文件拷贝到目标机器上即可运行。
相比于Python,则需要事先安装一堆的环境依赖包简单多了。当然,如果有cgo,我们也需要将对应的动态库给扔过去。
更多现代的特性
和C比较,Go完全就是一门现代化语言,原生支持的Unicode, garbage collection, Closures(functional programming language)等。
Go可以调用C/C++程序,又提供了太多的便利,速度上稍有牺牲,但并不大。在绝大部分场景下Go能给你带来媲美C的性能,而对于某些确实性能过于关键的场合,也可以通过cgo让Go和C搭配。
高效性能
Go语言通过编译成机器码来运行,具有很高的执行效率。它的垃圾回收机制也相对高效,可以有效地管理内存。
简洁和简单易学
Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣。Go语言的语法简洁明了,去除了一些冗余的语法元素,使得代码更加清晰易读。它的语法规范也很简单,学习起来相对容易。
丰富而强大的标准库
Go语言拥有一个强大而丰富的标准库,涵盖了网络、文件、加密、并发编程、加密解密、数据库、测试等各个方面的功能。这些库的设计简洁而功能强大,这使得开发者可以快速地构建高效可靠的应用程序,减少了对第三方库的依赖。
开发效率
虽然go是静态语言,但我个人感觉开发效率真的挺高,直觉上面跟python不相上下。对于我个人来说,最好的例子就是我用go快速开发了非常多的开源组件,譬如ledisdb,go-mysql等,而这些最开始的版本都是在很短的时间里面完成的。对于我们项目来说,我们也是用go在一个月就重构完成了第一个版本,并发布。
关于Go的其他高级特性可以参考公众号CTO Plus文章:《Go语言的高级特性,发展趋势,以及推荐最热门的开源项目》
Go应用于系统编程、webserver、分布式存储、适合高并发场合。Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
Go语言由于其独特的特性和优势,Go语言在各个领域都有广泛的应用和使用场景。以下是Go语言的一些常见用途和应用场景的总结:
1. 后端开发:Go语言的并发模型和高效的网络库使其非常适合构建高性能的后端服务。许多大型互联网公司如Google、Uber、Dropbox等都在使用Go语言来构建后端服务和API。以及Go提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
2. 分布式系统:Go语言的并发模型和轻量级的goroutine使其非常适合构建分布式系统。它可以轻松处理大量的并发请求,并且通过通道和协程的调度机制,实现了高效的消息传递和同步。在分布式系统的领域里,Go语言无疑比大多数其它语言有着更高的开发效率和执行效率。
3. 微服务架构:Go语言的轻量级和快速编译的特性使其成为构建微服务架构的理想选择。它可以快速启动和部署,同时具有良好的性能和可扩展性。
4. 命令行工具:Go语言的静态编译特性使得生成的可执行文件可以轻松地在不同的平台上运行。这使得Go语言成为构建命令行工具和实用程序的理想选择。
5. 网络编程:Go语言提供了丰富的网络编程库,使其非常适合构建网络应用和服务器。它可以轻松处理高并发的网络请求,并且具有良好的性能和可靠性。
6. 数据库:Go语言提供了许多用于操作各种数据库的库和驱动程序。无论是关系型数据库还是NoSQL数据库,都可以使用Go语言来进行开发和操作。
7. 云计算和容器技术:Go语言在云计算和容器技术领域也有广泛的应用。例如,Docker和Kubernetes等流行的容器编排工具就是使用Go语言开发的。
总的来说,对于高性能Go语言具有静态类型、自动垃圾回收、内存安全、并发编程等特性,很方便的被广泛应用于网络编程、分布式系统、云计算、容器化等领域。
接下来,我们开始介绍下在Windows和Linux上安装Go环境。
访问官网https://go.dev/dl/或https://studygolang.com/dl,根据自己系统情况进行版本下载
这里我下载的是1.20(虽然目前最新版本是1.21)
一路安装下去之后通过go version命令能查看到版本信息即可表示安全成功
当然第一个程序的代码示例和特点也可以参考文章《Golang vs Python:一场高效编程语言对决》。
接下来这里编写第一个Go程序,新建一个.go的文件,内容如下:
然后执行这个Go程序,终端上执行指令:go run 1.go即可
打包go程序为exe可执行文件,指令:go build 1.go,该命令同样适用于Linux
以下是一个简单的Golang代码示例:
package main
//fmt 是 Go 语言的一个标准库/包,用来处理标准输入输出,类似于Python中的import os。不同点是Go中需要使用双引号把包名括起来
import "fmt"
// main 函数是整个程序的入口,main 函数所在的包名也必须为 main。类似于C语言中的主入口函数main,但是C的main函数定义为int main 或void main。
func main() {
//调用 fmt 包的 Println 方法,打印出 Hello, SteveRocket!,并自带一个换行。
fmt.Println("Hello, SteveRocket!")
}
执行以上代码输出
go run 1.go
go run 1.go,其实是执行了两步操作:
1. go build 1.go:这个命令表示将源码1.go编译成二进制可执行程序
2. ./1.exe:执行该程序
也可以使用build生成二进制文件
go build 1.go
下载Linux下的Go源码包,之后进行解压,解压到/usr/local目录下
tar -C /usr/local -xzf go1.20.linux-amd64.tar.gz
tar -zxvf go1.20.linux-amd64.tar.gz
此时的/usr/local/go也就是GOROOT,将/usr/local/go/bin目录添加至 PATH 环境变量,编辑文件/etc/profile
export GOROOT=/usr/local/go #设置为go安装的路径
export GOPATH=$HOME/gocode #默认安装包的路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
配置完后,执行source /etc/profile,使环境变量生效
注意:MAC 系统下你可以使用 .pkg 结尾的安装包直接双击来完成安装,安装目录在/usr/local/go/下
注意该文件的权限
查看Go的版本(哈哈,这个版本是1.7.4,是我很久以前安装的一个环境)
查看go 安装目录/usr/local/go(Windows 下默认安装到C:\Program Files\Go)
同样,也可在Linux上查看安装之后的Go版本
其他环境变量的配置
export K8STECHROOT=$HOME/k8stech
export GOPATH=$K8STECHROOT # 覆盖 GOPATH 环境变为 k8stech
export PATH=$K8STECHROOT/bin:$PATH #
export PROROOT=/opt/GoProject
export GOROOT=/usr/local/goroot
export GOPATH=$GOROOT
export PATH=$PATH:$GOROOT/bin
配置完毕后,可以执行source /etc/profile 更新系统环境变量。
需要在 GOPATH 文件夹下创建一个src 目录用于存放我们的源代码
[root@localhost ~]# mkdir -p $GOPATH/src
[root@localhost ~]# echo $GOPATH/src
/usr/local/goroot/src
在src 目录下面新建hello/hello.go 的文件
打包go脚本为可执行文件
如果我们项目需要第三方包,则为了使第三方包下载通过国内镜像,避免出现官方网址被屏蔽无法访问的问题,我们也可以配置GOPROXY
变量名:GOPROXY
值:https://goproxy.cn
或者Windows下打开Powershell输入以下2个命令设置代理
或执行指令:
go env -w GOPROXY=https://goproxy.cn,direct
GO111MODULE是Go语言1.11版本引入的一个环境变量,用于控制Go语言的模块支持。它可以取三个值:off、on和auto。
当GO111MODULE的值为off时,表示禁用Go模块支持,无模块支持,此时Go语言将使用传统的GOPATH和vendor目录来管理(寻找)依赖包,Go命令行将不会支持module功能,。
当GO111MODULE的值为on时,表示启用Go模块支持,Go命令行会使用modules,此时Go语言将使用go.mod和go.sum文件来管理依赖包, 而一点也不会去GOPATH目录下查找。
当GO111MODULE的值为auto时(默认值),表示自动判断是否启用Go模块支持(Go命令行将会根据当前目录来决定是否启用module功能)。当项目目录下存在go.mod文件时,Go模块支持将被启用,否则将使用传统的GOPATH和vendor目录来管理依赖包。这种情况下可以分为两种情形:
(1)当前目录在GOPATH/src之外且该目录包含go.mod文件,开启模块支持。
(2)当前文件在包含go.mod文件的目录下面。
使用Go模块支持可以更方便、更灵活地管理依赖包,我们可以通过go.mod文件明确指定项目的依赖包和版本,同时可以使用go get命令来下载和更新依赖包。避免了传统的GOPATH目录约定和vendor目录管理的一些问题,以及Go模块支持还提供了一些其他的功能和特性,例如:
不同项目使用同一依赖包的版本冲突问题。
依赖包的版本更新和管理问题。
依赖包的下载和更新速度问题。
支持私有仓库和离线依赖包管理。
支持依赖包的版本锁定和更新。
支持依赖包的替换和本地调试等。
可以通过下面的方式来设置go modules,执行以下命令行:
go env -w GO111MODULE=auto
具体的使用方法,可以关注公众号CTO Plus后面的文章《Go的包管理器工具mod使用介绍详解》
到这里,我们就要开始为编码做准备了,编码,我们不可能去拿一个txt记事本来编写,那样效率太低,这里我分享三个用于开发Go程序的编辑器分别是VScode、IDEA和Goland。
我们可以使用VScode来编写Go代码,得先安装Go插件,在扩展中搜索Go,然后进行安装即可
设置go的开发环境,由于Visual Studio Code没有建立Go项目的选项,所以一开始需要自己建立文件夹。
手动创建文件夹,选择Open Folder,选择文件夹
接下来使用VScode编写Go程序,新建一个go的代码文件
写入如下示例代码
代码编写完后执行:Ctrl+F5直接运行
则可能会遇到运行报错
go: go.mod file not found in current directory or any parent directory; see 'go help modules' (exit status 1)
此时需要使用终端命令行,输入指令go mod init ***,***代表项目文件夹名称:
再次按F5,重新运行即可。
也可以根据自己情况对VScode做一些自定义配置setting.json
{
"go.buildOnSave": "workspace",
"go.lintOnSave": "package",
"go.vetOnSave": "package",
"go.buildTags": "",
"go.buildFlags": [],
"go.lintFlags": [],
"go.vetFlags": [],
"go.coverOnSave": false,
"go.useCodeSnippetsOnFunctionSuggest": false,
"go.formatOnSave": true,
"go.formatTool": "goreturns",
"go.goroot": "C:\\Program Files\\Go",
"go.gopath": "D:\\me\\go",
"go.gocodeAutoBuild": false
}
部分配置选项释义如下:
1. files.autoSave:
files.autoSave是VS Code编辑器中的一个设置选项,用于控制文件的自动保存行为。
可以设置为 "off"、"afterDelay" 或"onFocusChange",分别表示关闭自动保存、在一定延迟后自动保存或在焦点变化时自动保存。
自动保存可以提高开发效率,避免因忘记保存而丢失代码更改。
2. editor.formatOnSave:
editor.formatOnSave是VS Code编辑器中的一个设置选项,用于在保存文件时自动进行代码格式化。
可以设置为true或false,表示是否开启在保存文件时自动进行代码格式化。
自动代码格式化可以提高代码的可读性和一致性,减少手动调整代码格式的工作量。
3. go.gopath:
go.gopath是Go语言插件中的一个设置选项,用于指定GOPATH环境变量的值。
可以设置为一个字符串,表示GOPATH的路径,如果设置为${workspaceRoot}:/Users/SteveRocket/golib 则表示当前工作空间${wordspaceRoot}加上系统 GOPATH 目录。
GOPATH是Go语言的工作目录,用于存放项目的源代码、依赖包和编译生成的可执行文件。
4. go.goroot:
go.goroot是Go语言插件中的一个设置选项,用于指定GOROOT环境变量的值。
可以设置为一个字符串,表示GOROOT的路径。
GOROOT是Go语言的安装目录,用于存放Go语言的标准库和工具。
5. go.formatOnSave:
go.formatOnSave是Go语言插件中的一个设置选项,用于在保存Go文件时自动进行代码格式化。
可以设置为true或false,表示是否开启在保存Go文件时自动进行代码格式化。
自动代码格式化可以提高代码的可读性和一致性,减少手动调整代码格式的工作量。
6. go.formatTool:
go.formatTool是Go语言插件中的一个设置选项,用于指定代码格式化工具的路径。
可以设置为一个字符串,表示代码格式化工具的路径。
Go语言插件默认使用gofmt作为代码格式化工具,但可以通过设置go.formatTool来指定其他的代码格式化工具,比如使用goimports、goreturns等。
7. go.buildOnSave:
go.buildOnSave是Go语言插件中的一个设置选项,用于在保存Go文件时自动进行代码编译。
可以设置为true或false,表示是否开启在保存Go文件时自动进行代码编译。
自动代码编译可以及时发现代码中的错误和问题,提高代码的质量和可靠性。
8. go.lintOnSave:
go.lintOnSave是Go语言插件中的一个设置选项,用于在保存Go文件时自动进行代码静态分析。
可以设置为true或false,表示是否开启在保存Go文件时自动进行代码静态分析。
代码静态分析可以发现代码中的潜在问题和不规范的写法,提高代码的质量和可维护性。
9. go.vetOnSave:
go.vetOnSave是Go语言插件中的一个设置选项,用于在保存Go文件时自动进行代码静态检查。
可以设置为true或false,表示是否开启在保存Go文件时自动进行代码静态检查。
代码静态检查可以发现代码中的潜在问题和错误,提高代码的质量和可靠性。
10. go.coverOnSave:
go.coverOnSave是Go语言插件中的一个设置选项,用于在保存Go文件时自动进行代码覆盖率检查。
可以设置为true或false,表示是否开启在保存Go文件时自动进行代码覆盖率检查。
代码覆盖率检查可以评估测试用例的覆盖范围,帮助开发人员编写更全面的测试用例。
11. go.useCodeSnippetsOnFunctionSuggest:
go.useCodeSnippetsOnFunctionSuggest是Go语言插件中的一个设置选项,用于在函数建议时使用代码片段。
可以设置为true或false,表示是否在函数建议时使用代码片段。
使用代码片段可以加快代码编写的速度,提供常用代码模板和自动补全功能。
12. go.gocodeAutoBuild:
go.gocodeAutoBuild是Go语言插件中的一个设置选项,用于在保存Go文件时自动构建gocode。
可以设置为true或false,表示是否在保存Go文件时自动构建gocode。
gocode是Go语言的自动补全工具,自动构建gocode可以保持补全功能的最新状态。
这些设置选项可以根据开发者的需求进行配置,以提高开发效率和代码质量。通过自动保存、自动格式化、自动编译、自动静态分析、自动检查覆盖率等功能,可以减少开发者的手动操作,提供更好的开发体验。
我们也可以使用IntelliJ IDEA开发Go项目,这款工具就提供了Go项目的创建
填写项目名和项目所在的目录,点击Finish即可
最后,也就是Goland这款工具,这款工具是专为Go语言开发而定制的一款IDE开发工具(我最喜欢这款)
安装完开发工具后,依次选择File -> New -> Project
选择Go,以及选择项目的目录
完成后,会自动生成一个go.mod的文件
然后我们可以建立一个src目录,在目录里面新建main.go的源码文件即可。
在Go语言中,有一些重要的环境变量和目录约定,它们对于正确设置和管理Go项目非常关键。这些环境变量包括GOROOT、GOPATH和GOBIN,而GOPATH目录约定又包括三个子目录:src、pkg和bin。下面我们将详细介绍它们的作用和用法。
GOPATH是Go语言项目的工作目录,它指示Go编译器在哪里查找源代码、依赖包和编译生成的可执行文件。
GOPATH可以设置为任意的目录,但建议设置为一个独立的目录,以便于管理和组织项目。
GOPATH可以包含多个路径,多个路径之间使用操作系统的路径分隔符(例如Unix系统中的冒号(:)或Windows系统中的分号(;))分隔,当有多个GOPATH时,默认将go get获取的包存放在第一个目录下。
在GOPATH目录下,应该按照约定的目录结构组织项目的源代码、依赖包和可执行文件。
GOPATH目录约定有以下三个子目录:
src目录:用于存放项目的源代码文件(如:.go .c .h .s等),每个项目通常对应一个子目录。按照golang默认约定,这个目录是go run,go install等命令的当前工作路径(即在此路径下执行上述命令)。
pkg目录:用于存放编译生成的包文件(中间文件,比如:.a),每个包对应一个子目录。
bin目录:用于存放编译生成的可执行文件,每个可执行文件对应一个文件,为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目录。
GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/mymath表示mymath这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包,这个package会在公众号CTO Plus后续文章做详细介绍。
GOROOT是Go语言安装的根目录,它指示Go编译器和标准库的位置,即安装好Go后就已经存在。
GOROOT默认情况下会被设置为Go安装的目录,例如/usr/local/go或C:\Go。
GOROOT中包含了Go语言的标准库、编译器和工具链等。
在使用Go语言开发项目时,不需要手动设置GOROOT,系统会自动识别。
GOBIN是Go语言编译器生成的可执行文件的存放目录。
默认情况下,GOBIN会被设置为GOPATH的bin子目录,即$GOPATH/bin。
可以将GOBIN添加到系统的PATH环境变量中,以便于在任何位置都可以直接运行Go语言编译生成的可执行文件。
首先看一下结构:
GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/mymath 表示mymath这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包,这个会在后续详细介绍package。
我们通常是在project目录下执行go build
现在需要编译main.go,golang会自动去src下代码目录,因为我的main.go中代码的开通导入了packag main包,所以可以编译成可执行文件,但是这样默认在当前目录下生成可执行文件,也可以指定目录。
还有两个非常好用的命令:go get 和go install,关于go的命令详细使用和介绍请参考文章:《Go的命令操作总结教程》
在Windows和Linux下都可以通过命令go env来查看Go的环境变量信息
C:\Users\Administrator>go env
set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=D:\project
set GORACE=
set GOROOT=D:\BaiduNetdiskDownload\go
set GOTOOLDIR=D:\BaiduNetdiskDownload\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
set CXX=g++
set CGO_ENABLED=1
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
通过正确设置和管理GOROOT、GOPATH和GOBIN,以及按照GOPATH目录约定的三个子目录组织项目,可以方便地进行Go语言项目的开发、编译和运行。同时,也可以更好地管理项目的依赖包和可执行文件,提高开发效率和代码的可维护性。
GO111MODULE变量的作用是控制Go语言的模块支持,它的取值可以为off、on和auto。使用Go模块支持可以更方便、更灵活地管理依赖包,避免了传统的GOPATH目录约定和vendor目录管理的一些问题,并提供了一些其他的功能和特性。
参考资料
Go官网:https://go.dev/dl/
Go官网:https://studygolang.com/dl
GitHub:https://github.com/golang/go
更多精彩,关注我公号,一起学习、成长
推荐阅读:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。