1、main包
Go语言的入口main()函数所在的包(package)叫main,main包想要引用别的代码,需要import导入!
2、package
src目录是以代码包的形式组织并保存Go源码文件的,每个代码包都和src目录下的文件夹一一对应。每个子目录都是一个代码包
代码包报名和文件目录名,不要求一致,比如文件目录叫hello,但代码包包名可以声明为main,但是同一个目录下的源码文件第一行声明的所属包,必须一致
同一个目录下的所有.go
文件的第一行添加包定义,以标记该文件所属的包,演示语法:
package 包名
包需要满足:
-
一个目录下的同级文件归属一个包,也就是说,在同一个包下面的所有文件的package名,都是一样的
-
在同一个包下面的文件package名都建议设为是该目录名,但也可以不是,包名可以与其目录不同名。
-
包名为main的包应为应用程序的入口包,其他包不能使用。
在同一个包下面的文件属于同一个工程文件,不用import包,可以直接使用
包可以嵌套定义,对应的就是嵌套目录,但包名应该与所在的目录一致
//文件 qf/ruby/tool.go中
package ruby
//可以被导出的函数
func FuncPublic(){}
//不可以导出的函数
func funPrivate(){}
包中,通过标识符首字母是否大写,来确定是否可以被导出,首字母大写才可以被导出,视为public公共资源
3、import
要引入其他包,可以使用import关键字,可以单个引入或批量引入,语法演示:
A:通常引入
//单个引入
import "package"
//批量导入
import (
"package1"
"package2"
)
B:点操作
我们有时候会看到如下的方式导入包
import (
. "fmt"
)
这个点操作的含义就是这个包导入之后在你调用这个包函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println("hello")
可以省略写成Println("hello")
C:起别名
别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字。导入时,可以为包定义别名
import (
p1 "package1"
p2 "package"
)
//使用时,别名成为我们函数的前缀
p1.Method()
D:_操作
如果仅仅需要导入包时执行初始化操作,并不需要使用包内的其他函数,常量等资源。则可以在导入包时,匿名导入。
这个操作经常是让很多人费解的一个操作
import (
"database/sql"
_ "github.com/ziutek/mysql/godrv"
)
_操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的函数,也就是说,使用下划线作为包的别名,会仅仅执行包的init()
函数
导入的包的路径名,可以是相对路径也可以是绝对路径,推荐使用绝对路径
4、GOPATH环境变量
import导入时,会从Go的安装目录(也就是GOROOT环境变量设置的目录)和GOPATH环境变量设置的目录中,检索src/package来导入包,如果不存在,则导入失败
GOROOT,就是GO内置的包所在的位置
GOPATH,就是我们自己定义的包的位置
通常我们在开发项目时,调试或者构建编译时,需要设置GOPATH指向我们的项目目录,目录中的src目录中的包就可以导入了
5、init()包初始化
init(),main()
是go语言中的保留函数,我们可以在源码中,定义init()函数,此函数会在包导入时执行,例如如果是在main中导入包,包中存在init(),那么init()中的代码会在main()函数执行前执行,用于初始化包所需要的特定资料。
src/userPackage/tool.go
package userPackage
import "fmt"
fun init(){
fmt.Println("tool init")
}
主函数源码
src/main.go
package main
import (
"userPackage"
)
func main(){
fmt.Println("main run")
userPackage.SomeFunc()
}
执行时会先输出tool init
在输出main run
init(),main()这两个函数。在go语言中的区别如下:
相同点
-
两个函数在定义时不能有任何的参数和返回值
-
该函数只能由go程序自动调用,不可以被引用
不同点
-
init可以在应用在任意包中,且可以重复定义多个
-
main函数只能用于main包中,且只能定义一个
两个函数的执行顺序
-
在main包中的go文件默认总是会被执行
-
对同一个go文件的init()调用顺序是从上到下的
-
对同一个package中的不同文件,将文件名按字符串进行从小到大顺序,之后顺序调用个文件中的init()函数。
-
对于不同的package,如果不相互依赖的话,按照main包中import的顺序调用其包中的init()函数
-
如果package存在依赖,调用顺序为最后被依赖的最先初始化,例如:导入顺序:main→A→B→C,则初始化顺序为C→B→A→main,依执行对应的init方法,main包总是被最后一个初始化,因为它总是依赖别的包
6、管理外部包
go允许import不同代码库的代码,对于import要导入的外部的包,可以使用go get命令取下来放到GOPAT对应的目录中去。
例如我们想通过go语言连接mysql数据库;
go get github.com/go-sql-driver/mysql
安装之后,就可以在gopath目录中看到
7、time包
1、获取时间对象
获取当前时间:
func Now() Time
import "time"
func main(){
fmt.Println(time.Now()) //2021-03-28 23:02:22.0998333 +0800 CST m=+0.009973501
}
获取指定时间
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
import "time"
func main(){
time2 := time.Date(2020,2,2,2,2,2,2,time.Local)
fmt.Println(time2) //2020-02-02 02:02:02.000000002 +0800 CST
}
2、日期和文本之间的转换
日期转换成文本
func (t Time) Format(layout string) string
//模板数据必须为该值:Mon Jan 2 15:04:05 -0700 MST 2006
import "time"
func main(){
t1 :=time.Now()
s1 := t1.Format("2006年1月2日 15:04:05") //t1.Format("格式模板")
fmt.Println(s1) //2021年3月28日 23:11:34
}
文本转换成日期
func Parse(layout, value string) (Time, error)
import "time"
func main(){
s2 := "2021年3月28日 23:11:34"
t2, err := time.Parse("2006年1月2日 15:04:05", s2)
if err == nil {
fmt.Println(t2) // 2021-03-28 23:11:34 +0000 UTC
} else {
fmt.Println(err)
}
}
3、时间戳
时间戳:指定的日期
func Unix(sec int64, nsec int64) Time