gobuild命令,go 编译命令
Go 的大门已经打开,来吧
Go 在 10 年间已经快速的成为了非常流行并且成功的系统编程语言。
在 Go 之前,C、C++ 、Java 还有 C# 在编程界都是大腕。Go 直到今天还是一个婴儿,但是它却为你而来。
它为开源软件打开了一个新的世界。这样一个完美的语言来的正是时候,它引发了一场计算的新时代。所有的这些知名的软件都是用 Go 编写的:
Cloud Native 将不可能抛弃 Go , Cloud Native Computing Foundation (CNCF 基金会)同样也不会。这仅仅是个开始。Go 也接管了其它部分开源软件,更别提那些大公司内部的的基础设施。
实际上,这就是为什么在开源项目(或其他项目)上大家倾向选择使用 Go 来构建产品系统和大型系统。
大家都在 Go playground (译者注:一个Golang的在线编辑网站) 上开始尝试 Go 语言。你只需要打开一个网站,写一些代码,然后运行。无需安装,在哪都能开始写代码,这是一个不错的体验。
然后你去下载一个 toolchain (译者注:工具链,一般指的就是编译工具)—— 一个二进制 go 文件。你可以通过运行 go build 命令来获一个生产级别的软件。无需学习 GCC toolchain ,C 语言,Linux ,共享对象,JVM 或其它相关技术。
不管你在开发什么,你只需专注开发的业务,而不是你需要哪些工具。Go已经为你解决了相应的工具了。
在以前的时代,编译代码后,你不能仅仅只是运行它,因为它依赖系统上的其他组件:如 共享对象、JVM 等。
go build 会输出一个可执行的二进制文件。将它发送到你的服务器上。它之所以能运行是因为已经将所需要的东西都编译进去了。 这个简单的案例展示了它的强大。好消息是你的部署过程将比以前简单的多。—— 仅需要将二进制文件传送到你的服务器即可。 你甚至可以通过少量的环境变量在不同的系统上构建。这个特性非常适合 CLIs (译者注:命令行工具)以下是最成功的几个案例:
云已经不是什么新东西了,它是一个标准。虚拟化和容器的运行与终止没有任何通知,数据流的来来往往是不可靠的,RPC 的发送与重试也是频繁的。
当下的软件需要的是能高效而正确的运行,它需要并行的操作这些所有的事件。可容错的分布式架构在今天也是一个标配了。
现在你可以获得一个简单易懂的内置基本操作。 Goroutines 和 channels 是有意义的,因为它模仿的是真实的情况。
你只需要在一个函数前加上 go 关键字,它就会以并发的方式运行。你可以很容易的理解这些并发功能,并且可以专注你的业务开发。是否看到了一个趋势?
Go 是一个无锁的强大的分布式系统,因为从根本上让并发操作更简单了。
这就是为什么我们能看到这样一个更有弹性,更快速,并且高效利用CPU的软件。用 Go ,事实上你可以开发你在研究资料中找到的东西。
关于 Go 和 系统编程 GC(译者注:指垃圾回收机制) 通常是一个有争议的话题。
在 C / C++ 中,你可以完全控制内存。什么时候如何分配和释放内存由你来决定。JVM 则是通过垃圾回收器这种方式来取代你的控制。
总的来说,GC 很方便,但世上总是有些人不想用它。难啊。
手动管理内存很难,而且在进行并发时更难。 在 Go 之前,我们面临着相互冲突的挑战:我们需要一个不会泄漏内存或者破坏程序的框架,但是程序员又必须明白这一点。
最后的结果就是有上百万的库以不同的方式进行权衡,迫使让你的程序以一种独特唯一的方式运行。
以 Go 的立场来说:
Go 是一个包含 GC 的系统编程语言。这是不会改变的。
事实上,GC 已经爆炸式的促进了 Go 。下面这些是 Go 垃圾回收的边界情况,可能会出现一些问题。但是很多 看法 都是为了让它更好的运行,默认 90% 是这样。
如果你遇到了 10% 的情况,你可以进行一个新调优,甚至比 JVM 垃圾回收调优更简单。
Go 标准库是最好的商业库之一。它不大但是却覆盖了 80% 的常用功能,并且不复杂却可以为你完成复杂的事情。
流行的 Go 包大都是高质量的,应为它们构建在一个高质量的标准库上。 比标准库更重要的是要理解代码的思想,它鼓励使用 interface 和惯例用法。例如:
这些包通常都认同这些或其它一些惯例用法,所以它们能平滑的在一起运行。 它们的理念一致,编写并复用它们。
正如文章开头所说,完美的 Go 语言来得正是时候。
我已经阐述了原因, 我们可以打开很多强大的开源软件看看,Go 让许多事情变得简单起来。
我希望 Go 能继续成为其它领域的标准——前端服务(替代 Rails / Node .js),CLIs (替换许多脚本语言),也许还能替换 GUIs 和 移动 APP 。
正值 Go 10 周年 ,它快速地崛起了。但下一个 10 年它的趋势是否会扩大10倍。
还是那句话,Go 将成为软件工程中几个大型领域的标准编程语言。
使用go命令可以定位到文件头和文件末
使用go命令可以定位到文件头和文件末
当go run 运行时会将文件转移到临时路径下,然后再进行编译和执行,分片0就是C:\Users\xxx\AppData\Local\Temp___go_build_main_go.exe;
go build编译执行时,那么分片0为执行文件的相对路径为(main.go)
fmt.Println(os.Args)
//output:[C:\Users\xxx\AppData\Local\Temp\___go_build_main_go.exe]
1
2
1
2
exec.LookPath()
根据传入的参数来从PATH中获取可执行文件的绝对路径(没有编译的)或者相对路径(编译后的);参数若带分割号就直接查询返回
func LookPath(file string) (string, error)
LookPath searches for an executable named file in the directories named by the
PATH environment variable. If file contains a slash, it is tried directly and the
PATH is not consulted. LookPath also uses PATHEXT environment variable to match a
suitable candidate. The result may be an absolute path or a path relative to the
current directory.
1
2
3
4
5
6
7
1
2
3
4
5
6
7
filepath.Abs()
根据传入的路径计算出绝对路径,如果传入的为相对路径,那么它会把当前路径拼接上
编译后返回的是真实的路径(D:\go_project\src\github.com\wzbwzt\studyGo\GetPath\main.exe)
未编译执行返回的是临时执行路径
(C:\Users\xxx\AppData\Local\Temp___go_build_main_go.exe)
go环境变量配置 (GOROOT和GOPATH)
当然, 要执行go命令和go工具, 就要配置go的可执行文件的路径:
操作如下:
在~/.bash_profile中配置如下:
export $PATH:$GOROOT/bin
如果是windows需要使用 ; 符号分割两个路径, mac和类unix都是用 : 符号分割
在~/.bash_profile中添加如下语句:
GOPATH=/Users/username/gopath
在hello.go中输入:
在项目根目录下执行 go build 命令来构建你的项目, 构建后会生成hello文件
运行生成的文件 ./hello , terminal中输出: Hello, GO !
当然你也可以直接运行命令 go run hello.go 来执行程序.
如果要上述设置生效, 可以执行命令: source ~/.bash_profile , 上述所有操作均为mac系统下的操作, 如果是非mac系统, 请自行变通.
一个编译生成的可执行程序,使用什么命令执行
一个编译生成的可执行程序,使用gobuild命令执行。根据查询相关公开信息显示,一个编译生成的可执行程序要对它们进行编译,并最终生成可执行程序test,可以使用下面这条命令:gobuild,同时处理的文件不止一个。
go的三个运行基本命令的区别,go run ,go build 和 go install
最近在自学go,遇到点基础的问题,通过自己实际操作之后得出结论
在实际操作之前,我们需要知道go有三种源码文件:
? ? ? 1,命令源码文件;声明自己属于main包,并且包含main函数的文件,每个项目只能有一个这样的文件,即程序的入口文件
? ? ? 2,库源码文件;不能直接被执行的源码文件
? ? ? 3,测试源码文件
本次操作不涉及测试源码文件。
go run : 编译并直接运行程序,不产生可执行文件,只产生临时文件,方便用户调试(即在bin目录和pkg目录不产生任何文件),其后只能+命令源码文件。
go build : 既可以+库源码文件,又可以+命令源码文件,主要功能是检查是否有编译错误
? ? ? +库源码文件:只是检查编译错误,不产生任何文件,如果库源码文件有语法错误,编译不通过会报错。
? ? ? +命令源码文件:产生一个可执行文件
go install : 执行的过程:编译库源码文件-编译命令源码文件-移动编译文件,命令源码文件的编译移到bin目录,库源码文件的编译移到pkg目录,这个移动目录的过程成为安装。
好了,go run , go build 和 go install三者的区别就到这里了。
Go语言的跨平台能力到底有多强?看完你就知道了
对比于其他语言的程序,Go语言的跨平台能力是真的强,拿.Net和JAVA来说吧,.Net在.Net core出现之前是不能跨平台的,只能在windows上编译运行,即使是.net core出现以后,跨平台的程序也是相当的麻烦。而java虽然一直都可以跨平台,但是运行JAVA程序的机器上也必须要有JAVA程序运行环境JRE。而相对于Go程序,跨平台就简单的多了,只需要在编译指定目标程序运行的架构和环境即可编译出指定操作系统和架构的程序。
以上是指定了go的环境变量后执行的go build命令进行目标程序的构建,这种方式会一直生效的,如果不让他一直生效,可以在构建的时候临时指定环境变量,下面以window的环境为例,来介绍临时指定环境变量的方式构建可以在Linux环境下运行的可执行程序:
可以根据不同的架构和操作系统将其编写为不同的.bat的可执行文件放置在程序的根目录,Linux的和MAC的也一样编写成脚本文件放置在程序的根目录,这样在构建的时候就不用再敲命令了,直接运行脚本就可以了。
Java程序编译打包后为war包或者是java包,必须执行java -jar 命令或者将其放置到tomcat的指定目录下,运行tomcat程序。而Go语言编写的程序最终为可执行的文件(window下编译出的是.exe的可执行文件),只需要将其赋予可执行的权限就可以直接运行了。
构建JAVA程序的镜像需要指定java的基础镜像,否则就需要在镜像中安装java的运行环境了,下面展示的是构建的一个JAVA程序的镜像,构建出来镜像的体积相对比较大
而Go程序制作出的镜像就不需要安装任何的依赖环境,因为他在打包的时候就已经将依赖的包一块打包到一起了
拿着这个镜像就可以到处运行了。
通过对比我们可以发现,如果没有之前的技术和业务的积累,重新开发一个新的项目,使用go去开发无疑是最容易上手的,所以现在很多公司都使用go进行开发,也逐渐将其他语言的项目逐步的用go语言进行改造。其实用什么语言不重要,合适的才重要,开发项目在选择语言的时候也会综合多方面来考虑选择合适的语言和架构,毕竟很多公司都不是搞研究的,都需要项目来赚钱,所以开发的速度、客户的满意度、项目交付的时间才是驱动公司技术的主要因素。
我们个人也应该不断完善自己的技术栈,不应该太依靠某种语言,最重要的还是自己的架构思想和底层架构知识,只有掌握了这些才能够不被 社会 和公司“优化”。