# 写在前面
在此假设大家都有一定的python或者其他语言的基础,那么我们通过横向对比学习,能够最快掌握
go的语法。
比如go里面的xxx,我会把它类比为python里面的xxx,这样大家就一目了然,知道这玩意是干啥的了。甚至都不太需要细说。
# Go代码结构
还记得我们day01
学过的hello world程序吗?当时只简单介绍了,我们现在来深入剖析一下
。
package main
import "fmt"
func main() {
fmt.Println("Hello World");
}
2
3
4
5
6
7
8
# 包声明(不可省略)
在.go
为后缀的文件里面,开头一定都是这句话: package xxx
,因为每个go文件都有自己所属的包名称,而package
就是用来定义包名称的。
这点和Python不太一样,Python是没有package声明这一说的。所以类比学习失败!
值得说明的是,Go的package 包名,基本上和目录名称是保持一致
的。
但package main
除外哈,package main
一般用在项目最外层(studyGolang/),和main方法配合使用。
有的人会想问了
,既然package一般和目录名称一样,为啥不做的和Python一样不用声明呢?搞这么麻烦干嘛呢?
其实是这样的,go严格控制了变量/方法/struct(类比Python的类)的访问权限,同一个包
下面的内容是互相能够访问
到的。
而Python里面则不行,比如我是这样的文件目录:
day01
- abc.py
- bcd.py
bcd文件里面想引入abc的类,我们还需要
手动import
,而golang则不需要,因为他们同属于package day01。不信咱们看个例子:
定义了一个名为Hello的方法,方法里面打印了你好
。
我们来看看day02_import.go里面是否能使用这个Hello方法:
刚才又思考了一下,package之所以需要命名,是因为多模块
的项目(有很多个子应用),里面可能会有很多main方法,一般main方法要跑在package main
下面才能正常工作。所以需要声明package也有这样的原因吧。
# 引入包(当不需要引入包时可省略)
第一个例子我们就见识到了
import "fmt"
没错,在go语言里面,import后面的内容是需要带上引号
的。那我们怎么引入带目录的包呢?以我们现有的目录为例,我们可以这样引入day02:
import "youhuo/day02"
如果我设置别名怎么办?我们都知道Python里面可以用import xxx as xx
go里面可以这样做:
import second_day "youhuo/day02"
Python | golang | |
---|---|---|
引入方式 | 可以用from也可以用import | 不可以用from |
引入目录 | 用.连接目录 | 用/ 连接目录 |
是否需要引号 | 不需要 | 需要英文双引号 |
引入别名 | 需要在包名 之前加上别名 | 末尾加上 as 别名 |
多个引入 | 写很多行 | 通过括号括起来,省略import若干 |
相对导入 | 支持 | 支持但不推荐 |
自动清理 | 不会 | 如果import了包不使用,会被自动清理,主动保留则会编译不通过 |
注意: go是一门需要编译的语言,所谓编译,就是编译器检查你代码的过程,一旦有诸如引用了变量没使用,引用了包没使用,都会被编译器察觉并导致编译失败,从而程序跑不起来!
# 包内全局变量(可省略)
全局变量可以被自己包内部/外部引用,比如常见的时间格式等。
# 函数(可省略)
不定义函数的话,这个文件就约等于一个空文件,或者配置类文件。
# 注释(可省略)
大概一个go文件的构成
就是这样了!
# 本节总结
- go的
包声明
必不可少,哪怕是空的go文件也需要 - go的包导入可设置别名,一般通过module名+目录定位具体的包
- go的包声明一般与目录保持一致
# 下期介绍
go语言的基础语法介绍。
本节全部代码:
- day02/day02_import.go
package day02
func Haha() {
Hello()
}
2
3
4
5
- day02/day02.go
package day02
import "fmt"
func Hello() {
fmt.Println("你好")
}
2
3
4
5
6
7
8
- main.go
package main
import (
"fmt"
second_day "youhuo/day02"
)
func main() {
second_day.Haha()
fmt.Println(1)
}
2
3
4
5
6
7
8
9
10
11
12