内容
活动
关注

【Golang】(1)Go的运行流程步骤与包的概念

简介: 初次上手Go语言!先来了解它的运行流程吧!在Go中对包的概念又有怎样不同的见解呢?

1. 快速入门

所有的go开发,都必须存在并包含在某一个包内

.go 是go语言程序的后缀名

1.1 编译

通过使用 go build 命令对该go文件进行编译,生成.exe文件

1.2 运行

运行刚刚生成出来的test.exe文件既可,不过并不不是双击,而是在命令行中执行这个文件

你也可以不通过编译命令,直接运行,使用 go run 命令即可

但是在工作环境中,流程上还是必须要先编译,再运行

go run 命令,其实并没有跳过编译这个步骤

编译的步骤其实只是被隐藏了起来,没有创建出 **.exe这个文件 。

在底层中已经帮你完成了go build命令

2. 执行流程

  • 如果是对源码编译后,再执行,Go的执行流程则是上图中上侧的流程
  • 而如果是对源码直接执行 go run 源码,Go的执行流程则是上图中下侧的流程

区别:

  1. 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有Go开发环境的机器上,仍然可以运行
  2. 如果我们直接 go run go源代码,那么如果要在另外的一个机器上这么运行,也需要go开发环境,否则无法执行
  3. 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以可执行文件变大了很多

3. 编译和运行的注意事项

  • 有了Go源文件,通过编译器将其编译成机器可以识别的二进制文件
  • 在该源文件目录下,通过go build 对 源文件 进行编译,可以指定生成的可执行文件名,在windows下必须是 .exe后缀
go build -o 指定的文件名+后缀名 源代码名称+后缀名
  • 如果程序没有错误,没有任何提示,会在当前目录下出现一个可执行文件
    (windows下是.exe,linux下是一个可执行文件),该文件是二进制文件,也是可以被执行的程序
  • 如果程序有错误,在编译时,会在错误的那行报错

3.1 开发注意事项

  1. Go源文件以“go”为扩展名
  2. Go应用程序的执行入口是main()函数
  3. Go语言严格区分大小写
  4. Go方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性
  5. Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
  6. Go语言定义的变量或import的包如果没有使用到,带吧不能够编译通过
  7. 大括号都是成对出现的,缺一不可

关于注释:在go语言中,更加推荐行注释,而不是块注释

4. 导入

4.1 直接导入

package main // 把这个test.go 归属到main import "fmt" // 引入一个包 fmt func main() {  // 打印  fmt.Println("see,is\n",  "go!") }

使用import "包名"进行导入包名,在go中,所有的显式导入操作最好都要使用它。

在这个例子中,导入了“fmt”包,使用了该包下的Println方法。

4.2 匿名导入

package main import _ "fmt" // 匿名导入 func main() { }

如果只导入不调用,通常这么做是为了调用该包下的 init 函数

我们只需在导入包的前面加上**下划线_**就说明了该包是以匿名状态导入 import _ "包名"

4.3 批量导入

package main // 批量导入 import (  "fmt"  _ "fmt"  "math" ) func main() {  fmt.Println(math.Abs(15)) }

使用括号,可以达到批量导入包的效果,当然,多行import引入包也是没问题的。

注意细节,匿名导入的包没有进行使用方法的权力,该例在调用Println方法时,重新再显式引入了一次fmt包

4.4 导入注意事项

在Go中,是严禁循环导入的。

不管是直接的还是间接的导入都是不允许的。

例如:

  • A导入了B,同时B也导入了A,那么这种就是直接循环导入
  • A导入了B,B导入了C,C导入了A,这种就是间接循环导入

在Go中存在循环导入的问题,将会无法通过编译

5. 导出

在Go中想暴露某个类,没有public和private这种对于方法或类的定义。

导出和访问控制都是通过命名来进行实现的。如果想要对外暴露一个函数或者一个变量,只需要将其名称首字母大写即可,例如该例子中的Test方法

package main // 方法名首字母大写:可以被包外访问 func Test() string {  return "this is test...." }

如果不想被访问,设置为私有的。那么将方法名设置为小写的即可

package main // 方法名首字母小写:不可以被包外访问 func test() string {  return "this is test...." }

对外暴露的函数和变量可以被包外的调用者导入和访问,如果是不对外暴露的话,那么仅包内的调用者可以访问,外部将无法导入和访问,该规则适用于整个Go语言,例如后续会学到的结构体及其字段,方法,自定义类型,接口等等。

6. 内部包

go中约定,一个包内名为internal 包为内部包,外部包将无法访问内部包中的任何内容,否则的话编译不通过,下面看一个例子。

/home/user/go/  src/  crash/  bang/ (go code in package bang)  b.go  foo/ (go code in package foo)  f.go  bar/ (go code in package bar)  x.go  internal/  baz/ (go code in package baz)  z.go  quux/ (go code in package main)  y.go

由文件结构中可知,crash包无法访问baz包中的类型。

7. 标识符

标识符就是一个名称,用于包命名,函数命名,变量命名等等,命名规则如下:

  • 只能由字母,数字,下划线组成
  • 只能以字母和下划线开头
  • 严格区分大小写
  • 不能与任何已存在的标识符重复,即包内唯一的存在
  • 不能与Go任何内置的关键字冲突
break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var

其实,大部分的关键字的规则都基本一直

除了几个陌生的关键字:fallthrough、select、struct、range、defer…

8. 😍前篇知识回顾

9. 💕👉 其他好文推荐

全文资料学习全部参考于:Golang中文学习文档

目录
相关文章
|
3月前
|
存储 人工智能 Go
Go-Zero全流程实战即时通讯
Go-Zero 是一个功能丰富的微服务框架,适用于开发高性能的即时通讯应用。它具备中间件、工具库和代码生成器,简化开发流程。本文介绍其环境搭建、项目初始化及即时通讯功能实现,涵盖用户认证、消息收发和实时推送,帮助开发者快速上手。
263 0
|
1月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
125 4
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
113 1
|
4月前
|
设计模式 Kubernetes Go
​​什么是Golang项目的“主包精简,逻辑外置”?​
“主包精简,逻辑外置”是Go语言项目的一种设计原则,强调将程序入口保持简单,核心逻辑拆分至其他包,以提升代码可维护性、可测试性及扩展性,适用于CLI工具、Web服务等场景。
109 7
|
4月前
|
人工智能 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
持续集成与持续部署(CI/CD)是现代软件开发的关键实践,尤其适用于Go语言项目。本文探讨了Go项目中常见的CI/CD问题,如测试覆盖不足、版本不一致和构建时间过长,并提供解决方案及GitHub Actions示例代码,帮助开发者优化流程,提升交付效率和质量。
133 5
|
4月前
|
人工智能 Java Linux
Go 调度器:一个线程的执行流程
本文详细解析了Go语言运行时调度器的初始化流程,重点介绍了GMP模型的构建过程。内容涵盖调度器初始化函数`runtime·schedinit`、线程与处理器的绑定、P结构体的创建与初始化,以及主Goroutine的启动流程。通过源码分析,帮助读者深入理解Go运行时的底层机制。
102 0
|
6月前
|
Go 调度
GO语言函数的内部运行机制分析
以上就是Go语言中函数的内部运行机制的概述,展示了函数在Go语言编程中如何发挥作用,以及Go如何使用简洁高效的设计,使得代码更简单,更有逻辑性,更易于理解和维护。尽管这些内容深入了一些底层的概念,但我希望通过这种方式,将这些理论知识更生动、更形象地带给你,让你在理解的同时找到编程的乐趣。
103 5
|
9月前
|
Go
golang快速入门:流程控制
Go 语言的流程控制语句用于设定计算执行次序和逻辑结构,主要包括条件语句(if、else、else if)、分支语句(switch、case、select)、循环语句(for、range)和跳转语句(goto、break、continue)。条件语句无需圆括号,必须使用花括号;分支语句支持多条件合并和跨分支执行;循环语句仅支持 for 关键字,可通过 for-range 遍历集合;跳转语句支持标签结合,改变默认跳转逻辑。灵活组合这些控制语句可实现复杂业务逻辑。
212 16
golang快速入门:流程控制
|
11月前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
1680 14
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
586 4
Golang语言之管道channel快速入门篇

推荐镜像

查看更多
下一篇