大白话学Go语言(3) 理解Go的基本代码结构.md

2022/6/13 Go语言

# 写在前面

在此假设大家都有一定的python或者其他语言的基础,那么我们通过横向对比学习,能够最快掌握go的语法。

比如go里面的xxx,我会把它类比为python里面的xxx,这样大家就一目了然,知道这玩意是干啥的了。甚至都不太需要细说。

# Go代码结构

还记得我们day01学过的hello world程序吗?当时只简单介绍了,我们现在来深入剖析一下

package main

import "fmt"


func main() {
	fmt.Println("Hello World");
}
1
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。不信咱们看个例子:

day02目录下有个day02.go

定义了一个名为Hello的方法,方法里面打印了你好

我们来看看day02_import.go里面是否能使用这个Hello方法:

可以看到,能够智能提示,也不需要引入Hello方法

添加完毕后没有红线,说明没有报错

刚才又思考了一下,package之所以需要命名,是因为多模块的项目(有很多个子应用),里面可能会有很多main方法,一般main方法要跑在package main下面才能正常工作。所以需要声明package也有这样的原因吧。

# 引入包(当不需要引入包时可省略)

第一个例子我们就见识到了

import "fmt"
1

没错,在go语言里面,import后面的内容是需要带上引号的。那我们怎么引入带目录的包呢?以我们现有的目录为例,我们可以这样引入day02:

import "youhuo/day02"
1

如果我设置别名怎么办?我们都知道Python里面可以用import xxx as xx

go里面可以这样做:

import second_day "youhuo/day02"
1
Python golang
引入方式 可以用from也可以用import 不可以用from
引入目录 用.连接目录 /连接目录
是否需要引号 不需要 需要英文双引号
引入别名 需要在包名之前加上别名 末尾加上 as 别名
多个引入 写很多行 通过括号括起来,省略import若干
相对导入 支持 支持但不推荐
自动清理 不会 如果import了包不使用,会被自动清理,主动保留则会编译不通过

注意: go是一门需要编译的语言,所谓编译,就是编译器检查你代码的过程,一旦有诸如引用了变量没使用,引用了包没使用,都会被编译器察觉并导致编译失败,从而程序跑不起来!

注意看fmt和day02

# 包内全局变量(可省略)

全局变量可以被自己包内部/外部引用,比如常见的时间格式等。

# 函数(可省略)

不定义函数的话,这个文件就约等于一个空文件,或者配置类文件。

# 注释(可省略)

大概一个go文件的构成就是这样了!

# 本节总结

  1. go的包声明必不可少,哪怕是空的go文件也需要
  2. go的包导入可设置别名,一般通过module名+目录定位具体的包
  3. go的包声明一般与目录保持一致

# 下期介绍

go语言的基础语法介绍。

本节全部代码:

  • day02/day02_import.go
package day02

func Haha() {
	Hello()
}
1
2
3
4
5
  • day02/day02.go
package day02

import "fmt"

func Hello() {
	fmt.Println("你好")
}

1
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)
}

1
2
3
4
5
6
7
8
9
10
11
12