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的执行流程则是上图中下侧的流程
区别:
- 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有Go开发环境的机器上,仍然可以运行
- 如果我们直接 go run go源代码,那么如果要在另外的一个机器上这么运行,也需要go开发环境,否则无法执行
- 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以可执行文件变大了很多
3. 编译和运行的注意事项
-
有了Go源文件,通过编译器将其编译成机器可以识别的二进制文件
-
在该源文件目录下,通过go build 对 源文件 进行编译,可以指定生成的可执行文件名,在windows下必须是 .exe后缀
go build -o 指定的文件名+后缀名 源代码名称+后缀名
-
如果程序没有错误,没有任何提示,会在当前目录下出现一个可执行文件
(windows下是.exe,linux下是一个可执行文件),该文件是二进制文件,也是可以被执行的程序
-
如果程序有错误,在编译时,会在错误的那行报错
3.1 开发注意事项
- Go源文件以“go”为扩展名
- Go应用程序的执行入口是main()函数
- Go语言严格区分大小写
- Go方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性
- Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
- Go语言定义的变量或import的包如果没有使用到,带吧不能够编译通过
- 大括号都是成对出现的,缺一不可
关于注释:在go语言中,更加推荐行注释,而不是块注释
4. 导入
4.1 直接导入
package main // 把这个test.go 归属到mainimport "fmt" // 引入一个包 fmtfunc main() {// 打印fmt.Println("see,is\n","go!")
}
使用import "包名"
进行导入包名,在go中,所有的显式导入操作最好都要使用它。
在这个例子中,导入了“fmt”包,使用了该包下的Println方法。
4.2 匿名导入
package mainimport _ "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.gofoo/ (go code in package foo)f.gobar/ (go code in package bar)x.gointernal/baz/ (go code in package baz)z.goquux/ (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. 😍前篇知识回顾
- Go的环境安装与开发工具配置
9. 💕👉 其他好文推荐
- 还不了解Git分布式版本控制器?本文将带你全面了解并掌握
- 带你认识Maven的依赖、继承和聚合都是什么!有什么用?
- 2-3树思想与红黑树的实现与基本原理
- !全网最全! ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用
- 全面深入Java GC!!带你完全了解 GC垃圾回收机制!!
- 全面了解Java的内存模型(JMM)!详细清晰!
- 在JVM中,类是如何被加载的呢?本篇文章就带你认识类加载的一套流程!
全文资料学习全部参考于:Golang中文学习文档