up 搭建完
go
的运行环境 可以开始写程序代码了我们先来写个hello world
up 在 GoProject
目录 src
下创建一个 study
项目目录,之后up又创建了 day01
目录来存放今天学习的代码
首先右键创建一个 go
文件
文件名填写 main
回车
创建成功后你会发现创建的文件里自动书写了 package day01
代码,我们需要把 day01
改成 main
,应为一个独立可执行的 Go
语言程序必须有 package main
声明。
并书写以下代码并执行
package main
import "fmt"
func main() {
fmt.Print("hello world!")
}
如果不出意外 hello world!
变打印出来了 第一个 Go 程序就完成了, 这里面有些需要注意的。
下面我们来了解一下 package
package
是Go
管理代码的重要工具
每一个 Go
语言程序都必须是一些包的一部分,一个独立可执行的 Go
语言程序必须有 package main
声明。如果一个程序是 main
包的一部分,那么在 go install
则会生成一个二进制文件,在执行时则会调用 main
函数。如果一个程序除了 main
包外还是其他包的一部分,那么在使用 go install
命令时会创建包存档文件。
package
。package
下可以嵌套package
。但每个.go
文件的package
以其所在的当前文件夹为准。GoLand
中新建文件夹时,在该层目录下新建的.go
文件,其package
默认为当前文件夹名(大小写一致)。当.go
文件创建后,再去修改文件夹名时,需要注意其下的.go
文件中的package
是否自动修改。.go
文件,package
必须一致==,否则编译出错。
Go
的所有文件都需要指定其所在的包(package)
,包有两种类型,一种是main
包,使用package main
在代码的最前面声明。另外一种就是非main
包,使用package + 包名
。main包
的可以有唯一的一个main 函数
,这个函数也是程序的入口。也只有main 包
可以编译成可执行的文件。
上面写的代码就是个简单的例子
在 study
下创建了一个 day01
目录,day01
里有个main.go
文件。main.go
的第一行声明了这是一个 main 包
,因此可以定义一个 main 函数
。使用 go run
可以编译并运行 main.go
。虽然 main 包
的文件名也是 main.go
,其实包名和文件名没有直接关系。
Go
使用package
来管理源文件。package
必须在一个文件夹内,且一个文件夹内也只能有一个package
,但是一个文件夹可以有多个文件。下面自定义一个package
。
up先在day01
目录下创建个A目录
,A目录
下创建一个test.go
文件
package Atest
import "fmt"
func TestPrint() {
fmt.Println("这是一个测试 Print")
}
然后在 main.go
文件中,通过 import "study/day01/A"
引入了Atest
包所在的文件夹。最后通过 包名.包函数
调用
package main
import (
"fmt"
"study/day01/A"
)
func main() {
fmt.Println("hello world!")
Atest.TestPrint()
}
包名为 Atest
,文件夹为 A
,文件为 test.go
。它们三者的命名都是不一样的。这与很多其他语言相悖。正如前文所言,一个包可以分散在不同的同级文件里,只要都声明为一个包名即可。例如下面再增加一个文件 demo.go
package Atest
import "fmt"
func demoPrintln() {
fmt.Println("这是一个demo")
}
在 main 函数里同样使用 包名.包函数
---- Atest.demoPrintln()
调用
其实很好理解,即同样的一个包,文件内容太多,拆分成多个文件而已。文件名跟包名没有直接关系。如果只有一个文件,通常可以写成包名。但是导入的时候,必须导入包所在的文件夹的路径。其实可以这样理解,import
的是 path
(路径),那么go就去那个路径下搜索,搜索当然是查找包名。只不过通常习惯是 文件名 和 包名一致。
这包名和文件夹名不一致,是反模式。主要是为了直观的表示包名和文件夹名没有直接关系。
在 A
内再创建一个文件夹 Atest
,此时再命名一个 Atest.go
文件。即 文件夹名 和 包名 一致。其内容如下
package Atest
import "fmt"
func AtestPrint() {
fmt.Print("AtestPrint")
}
up
在用 import
导入包所在的文件夹,因此up
来修改 main.go
把 "study/day01/A/Atest"
引入进来, 但是还按照刚刚的这种方法引入编译会报错
显然,在 A 文件
内的 test.go
和demo.go
声明了 package Atest
。在 A/Atest
文件夹里的 Atest.go
也声明为 Atest
。这是同名的两个包,但是在main 函数
里,都是使用包名引用函数。由于名字冲突,无法确定到底使用那个 Atest
包,进而报错。解决方法也很简单,给包名增加一个别名即可。
package main
import (
"fmt"
Atest "study/day01/A"
testNew "study/day01/A/Atest"
)
func main() {
fmt.Println("hello world!")
Atest.TestPrint()
Atest.DemoPrintln()
testNew.AtestPrint()
}
这样Atest
与testNew
两者空间就相互隔离了,在次运行代码 AtestPrint
便被打印出来了
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。