1.go语言的入口main()函数所在的包叫main,main包想要引用别的代码,需要import导入
2.src目录是以代码包的形式组织并保存go源码文件的,每个代码包都和src目录下的文件夹一一对应。每个子目录都是一个代码包
代码包包名和文件目录名不要求一致,但最好一致,同一个目录下得源码文件第一行声明的所属包必须一致
使用 package 包名 来标记文件所属的包
包需要满足:
- 一个目录下的同级文件归属一个包
- 包名为main的包应为应用程序的入口包,其他包不能使用
- 包名与其目录名可以不相同,但建议同名
在同一个包下面的文件属于同一个工程文件,不用import就可以直接使用
包可以嵌套定义,对应的就是嵌套目录,但包名需要和所在的目录同名,如:src/01test/02test/tool.go中声明的包名就应该是02test(01test是上一级的包)
每个包的函数中,以大写字母开头的表示可以导出,可以被外部调用的函数,而小写字母开头的则表示该函数只能在本包内使用
3.import导包
//单个导入:
import "pcakage"
//多个导入:
import (
"package1"
"package2"
)
注:go导包时会从go的安装目录(GOROOT)和GOPATH目录中检索src/package来导入包,如果包不存在则导入失败
GOROOT是go内置的包所在的位置,GOPATH是我们自己定义的包的位置
//如我自己建的文件目录下导入包:从src后开始写,src不用
import "01test/02test"
//02test为自己创建的包名
导包时的一些操作:
1.点操作:当所指的包导入之后,你在调用这个包中的函数时可以省略包名直接调用
import(
. "fmt"
)
//可以直接使用Println("hello"),不用再fmt.Println()
//不太建议,包太多时会比较不好区分
2.起别名:将包名定义成比较简便的写法
import(
p1 "package1"
p2 "package2"
)
//p1.Method()
3._操作:当仅仅需要导入包执行初始化操作,不需要使用包内的其他函数,常量等资源,可以在导入包时,匿名导入
import(
"package1"
_ "github.com/axuezm/mymysql/godrv"
)
其实质其实是将_作为包的别名,而用其作为别名时不会直接使用包里面的函数,而是只调用包里的init()函数。
包的初始化
go语言中有两个函数只能由go程序自动调用,而不能被引用,即main()函数以及init()函数,这两个函数在定义的时候都不能有任和的参数和返回值
init()函数:如果导入的包中存在init函数,那么init()中的代码会在main()函数执行前执行,用于初始化包所需要的特定资料
init可以应用于任意包中,且可以重复定义多个:
1.可以在一个文件中定义多个init函数,这些init函数最终都会在main函数执行前按照定义的顺序执行一遍
2.当同一个包中的不同文件都存在init函数时,会根据文件名字按照字符串从小到大的顺序进行排序,之后按照顺序执行其中的init函数
3.当导入了多个包且其中都有init函数时,按照导入包的顺序执行其中的init函数
4.如果导入的各个包之间存在依赖关系,最后被依赖的最先被初始化
5.需要避免循环import,如A->B->C->A
6.一个包被其他多个包import,但只能被初始化一次
管理外部包
如何下载并使用GitHub上的包:
1.自己手动下载,找到github上包的地址并下载,在src中创建github.com文件夹,按照下载的路径存放到对应的目录中。
如:连接mysql数据库需要的包在github的地址为:github.com/go-sql-driver/mysql,我们进入这个网址后下载或克隆到本地,解压缩后将整个文件夹(改名为mysql)存放到$GOPATH/src/github.com/go-sql-driver/中
2.通过go get命令,会自动下载包到$GOPATH/src中
go get github.com/go-sql-driver/mysql
该命令在联网时就能直接将我们所需的包下载到对用的路径了
获取当前时间 var t1 time.Time = time.Now()
设置并返回指定的时间(这是个函数,由包名直接调用) :
time.Date(3008,7,15,16,30,28,0,time.local)
格式化时间(从时间类型转成字符串)Format(“2006年1月2日 15:04:05”)
这个时间据说是go语言的诞生时间,要将这个时间作为这个函数的参数传入,最终得到的结果才会是准确的
var s1 string = t1.Format("2006年1月2日 15:04:05")
模板的格式可以由你自己设置,可以是2006.1.2 15.04.05,也可以只获取日期2006-1-2,也可以只获取时间15:04:05
解析时间(从字符串返回时间类型)Parse(layout,string)(Time,err)
s1 := "1999:10:20"
t2,err := time.Parse("2006:01:02",s1)//注意模板的格式要和字符串的格式对应,否则就会返回错误
if err!=nil{
fmt.Println(err)
return
}
fmt.Println(t2)
获取时间变量中日期的值(这是个方法,由Time类型的变量调用)
(t Time)Date()(year int,month Month,day int)
year,month,day := t2.Date()
fmt.Println(year,month,day)
获取时间变量中时间的值 同上
(t Time)Clock()(hour,min,sec int)
hour,min,sec := t1.Clock()
fmt.Println(houe,min,sec)
单独获取年月日时间
(t Time) Year() int
(t Time) Month() Month
(t Time) Day() int //得到的是距离年头已经过去了多少天
(t Time) Hour() int
(t Time) Minute() int
(t Time) Second() int
(t Time) Weekday() Weekday
获取时间戳:返回时间距离1970年1月1日00:00:00的差值
(t Time)Unix()int64 //返回的差值是秒数
(t Time) UnixMicro() int64//毫秒
(t Time) UnixMilli() int64//分秒
(t Time) UnixNano() int64//纳秒
时间间隔:
t3 := t1.Add(time.Minute)//增加一分钟
t4 := t1.Add(24*time.Hour)//增加一天
t3.Sub(t1)//返回两者的时间间隔