前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 学习笔记 第二弹 初识编写第一个Go程序与package

Go 学习笔记 第二弹 初识编写第一个Go程序与package

原创
作者头像
风清醉
修改2020-02-20 09:35:47
4160
修改2020-02-20 09:35:47
举报

第一个Go程序

up 搭建完 go 的运行环境 可以开始写程序代码了我们先来写个 hello world

up 在 GoProject 目录 src 下创建一个 study 项目目录,之后up又创建了 day01 目录来存放今天学习的代码

1241241
1241241

首先右键创建一个 go 文件

文件名填写 main 回车

package是 go管理代码的重要工具
package是 go管理代码的重要工具

创建成功后你会发现创建的文件里自动书写了 package day01 代码,我们需要把 day01 改成 main ,应为一个独立可执行的 Go 语言程序必须有 package main 声明。

并书写以下代码并执行

代码语言:txt
复制
package main

import "fmt"

func main()  {
	fmt.Print("hello world!")
}

如果不出意外 hello world! 变打印出来了 第一个 Go 程序就完成了, 这里面有些需要注意的。

  • 程序中必须包含main包
  • func表示后面跟的是一个函数
  • main函数是整个程序的入口,所有的包围main包
  • 每行代码结尾都没有分号
  • Print() 函数首字母大写

下面我们来了解一下 package

package 基本使用

packageGo管理代码的重要工具

每一个 Go 语言程序都必须是一些包的一部分,一个独立可执行的 Go 语言程序必须有 package main 声明。如果一个程序是 main 包的一部分,那么在 go install 则会生成一个二进制文件,在执行时则会调用 main 函数。如果一个程序除了 main 包外还是其他包的一部分,那么在使用 go install 命令时会创建包存档文件。

  • 项目中的每个文件夹都是一个packagepackage下可以嵌套package。但每个.go文件的package以其所在的当前文件夹为准。
  • GoLand中新建文件夹时,在该层目录下新建的.go文件,其package默认为当前文件夹名(大小写一致)。当.go文件创建后,再去修改文件夹名时,需要注意其下的.go文件中的package是否自动修改。
  • ==同一层目录下的.go文件,package必须一致==,否则编译出错。

package main

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,其实包名和文件名没有直接关系。

自定义 package

Go 使用 package 来管理源文件。package 必须在一个文件夹内,且一个文件夹内也只能有一个package,但是一个文件夹可以有多个文件。下面自定义一个 package

up先在day01目录下创建个A目录A目录下创建一个test.go 文件

代码语言:txt
复制
package Atest

import "fmt"

func TestPrint()  {
	fmt.Println("这是一个测试 Print")
}

然后在 main.go 文件中,通过 import "study/day01/A" 引入了Atest 包所在的文件夹。最后通过 包名.包函数 调用

代码语言:txt
复制
package main

import (
	"fmt"
	"study/day01/A"
)
func main()  {
	fmt.Println("hello world!")
	Atest.TestPrint()
}
输出结果如上图
输出结果如上图

包名为 Atest,文件夹为 A,文件为 test.go。它们三者的命名都是不一样的。这与很多其他语言相悖。正如前文所言,一个包可以分散在不同的同级文件里,只要都声明为一个包名即可。例如下面再增加一个文件 demo.go

代码语言:txt
复制
package Atest

import "fmt"

func demoPrintln()  {
	fmt.Println("这是一个demo")
}

在 main 函数里同样使用 包名.包函数 ---- Atest.demoPrintln() 调用

其实很好理解,即同样的一个包,文件内容太多,拆分成多个文件而已。文件名跟包名没有直接关系。如果只有一个文件,通常可以写成包名。但是导入的时候,必须导入包所在的文件夹的路径。其实可以这样理解,import 的是 path(路径),那么go就去那个路径下搜索,搜索当然是查找包名。只不过通常习惯是 文件名 和 包名一致。

这包名和文件夹名不一致,是反模式。主要是为了直观的表示包名和文件夹名没有直接关系。

内嵌 package

A 内再创建一个文件夹 Atest,此时再命名一个 Atest.go 文件。即 文件夹名 和 包名 一致。其内容如下

代码语言:txt
复制
package Atest

import "fmt"

func AtestPrint()  {
	fmt.Print("AtestPrint")
}

up 在用 import 导入包所在的文件夹,因此up来修改 main.go"study/day01/A/Atest" 引入进来, 但是还按照刚刚的这种方法引入编译会报错

显然,在 A 文件内的 test.godemo.go 声明了 package Atest。在 A/Atest 文件夹里的 Atest.go 也声明为 Atest。这是同名的两个包,但是在main 函数里,都是使用包名引用函数。由于名字冲突,无法确定到底使用那个 Atest 包,进而报错。解决方法也很简单,给包名增加一个别名即可。

代码语言:txt
复制
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()
}

这样AtesttestNew两者空间就相互隔离了,在次运行代码 AtestPrint 便被打印出来了

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一个Go程序
  • package 基本使用
    • package main
      • 自定义 package
        • 内嵌 package
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档