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)//返回两者的时间间隔

睡眠sleep():time.sleep(3*time.Second)