init()函数
package utils
import "fmt"
//目录和包的名字不一定相同,但是往往要一直
//同一个目录下包名必须一样
//大写可以导出
func Count(){
fmt.Println("utils包的Count()函数")
}
func init(){
fmt.Println("units包的init()函数")
}
package main
import "demo/utils" //绝对路径
func main(){
/*
一个目录下的同级文件归属一个包,package的生命要一致
package生命的包和对应的目录可以不一致
*/
//utils.Count()
//timeutils.PrintTime()
//
//pk2.MyTest1()
utils.Count()
}
package utils
import "fmt"
//目录和包的名字不一定相同,但是往往要一直
//同一个目录下包名必须一样
//大写可以导出
func Count(){
fmt.Println("utils包的Count()函数")
}
func init(){
fmt.Println("units包的init()函数")
}
func init(){
fmt.Println("units包的另一个init()函数")
}
package main
import (
"demo/pk2"
"demo/utils"
) //绝对路径
func main(){
/*
一个目录下的同级文件归属一个包,package的生命要一致
package生命的包和对应的目录可以不一致
*/
//utils.Count()
//timeutils.PrintTime()
//
pk2.MyTest1()
utils.Count()
}
先导入的包的init函数先执行
init()函数和main()函数
- 这两个函数都是go中的保留函数
- 定义的时候不能有参数,返回值,只能由go程序自动调用,不能被引用
- init函数可以定义在任意包,可以有多个,main函数只能在main包下,并且只能有一个
- 执行顺序
见上图
包的其他注意点
package main
import (
_ "demo/pk2"
) //绝对路径
func main(){
/*
一个目录下的同级文件归属一个包,package的生命要一致
package生命的包和对应的目录可以不一致
*/
//utils.Count()
//timeutils.PrintTime()
//只想调用MyTest1的init函数,不想调用这个函数
// pk2.MyTest1()
// utils.Count()
}
- 可以下载下来放到src目录下,目录
src/github.com/go-sql-driver/mysql
然后再放下源代码
适合没有网络,拷贝来的
- 命令行任意位置执行
go get github.com/go-sql-driver/mysql
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
_ "demo/pk2"
) //绝对路径
func main(){
/*
一个目录下的同级文件归属一个包,package的生命要一致
package生命的包和对应的目录可以不一致
*/
//utils.Count()
//timeutils.PrintTime()
//只想调用MyTest1的init函数,不想调用这个函数
// pk2.MyTest1()
// utils.Count()
// database/sql 打开数据库
// 用下划线导入github.com/go-sql-driver/mysql,只使用里面的init函数初始化
db,err := sql.Open("mysql","root:用户密码@tcp(127.0.0.1:3306)/数据库名字?charset=utf8")
if err != nil {
fmt.Println("错误信息:",err)
return
}
fmt.Println("连接成功",db)
}
包会被编译为.a文件,在pkg目录下
go build demo
./demo
这样执行是没有.a文件的
需要go install demo/pk2
直接点击运行里面包含go install
time包
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
/*
time包:
1年=365天
1天=24小时
1小时=60分钟
1分钟=60秒
毫秒 millisecond
微秒 microsecond
纳秒 nanosecond
皮秒 picosecond
我们获取
*/
//1。获取当前时间
t1 := time.Now()
fmt.Printf("%T\n",t1) //time.Time
fmt.Println(t1) //2020-03-17 11:13:59.686591 +0800 CST m=+0.000468423
//2。 获取当前的时间
t2 := time.Date(2020,3,17,11,16,30,0,time.Local)
fmt.Println(t2) //2020-03-17 11:16:30 +0800 CST
//3。 time string之间的转换 模版不可以改变 1 2 3 4 5 6,不然会出错,纪念go
s1 := t1.Format("2006年1月2日 15:04:05")
fmt.Println(s1) //2020年3月17日 11:22:43
s2 := t1.Format("2006/01/02")
fmt.Println(s2) //2020/03/17
s3 := "1999年02月21日" //string 写成2月21日下面的模版就解析不了了
t3,err := time.Parse("2006年01月02日",s3)
if err != nil {
fmt.Println("err:",err)
}
fmt.Println(t3) //1999-02-21 00:00:00 +0000 UTC
fmt.Printf("%T\n",t3) //time.Time
//4。 获取单独日期的方法,不是函数,因为指定了time 类型的对象
year,month,day := t1.Date() //年月日
fmt.Println(year,month,day) //2020 March 17 month是包定义的类型,里面有常量
hour,min,sec := t1.Clock()
fmt.Println(hour,min,sec) //11 33 12
year2 := t1.Year()
fmt.Println("年:",year2) //年: 2020
fmt.Println(t1.YearDay()) //过了多少天 77
fmt.Println(t1.Weekday()) //Tuesday
//5. 时间戳:指定的日期 距离1970年1月1日0时0分0秒的时间差值 秒,纳秒
t4 := time.Date(1970,1,1,1,0,0,0,time.UTC)
timestamp1 := t4.Unix() //秒差值 3600
fmt.Println(timestamp1) //
timestamp2 := t1.Unix()
fmt.Println(timestamp2) //1584416475
timestamp3 := t4.UnixNano() //纳秒差值
fmt.Println(timestamp3) //3600000000000
//6。 时间间隔
t5 := t1.Add(time.Minute)
fmt.Println(t1) //2020-03-17 11:43:31.081654 +0800 CST m=+0.000417273
fmt.Println(t5) //2020-03-17 11:44:31.081654 +0800 CST m=+60.000417273
fmt.Println(t1.Add(24 * time.Hour)) //2020-03-18 11:43:31.081654 +0800 CST m=+86400.000417273
//7. 程序睡眠
time.Sleep(3 * time.Second) //让当前的程序进入睡眠状态
fmt.Println("main...over...")
rand.Seed(time.Now().UnixNano())
randNum := rand.Intn(10) + 1 //int
fmt.Println(randNum)
time.Sleep(time.Duration(randNum) * time.Second) //duration 持续
fmt.Println("睡醒了")
}
网友评论